Toon posts:

[VB.NET] "variabel formulier" maken?

Pagina: 1
Acties:

Verwijderd

Topicstarter
OK, ik heb dus het volgende probleem:

In mijn applicatie wil ik een soort van "variabel paneel" maken, waarin de gebruiker zelf mag bepalen wat erin komt te staan.
Zaken die erin mogen komen zijn:
- Labels
- Textvelden
- Buttons
- combobox

Oftewel wat de gebruiker kan plaatsen heeft zo zijn beperkingen!

Nu zat ik te denken aan een soort van kleine ontwikkel omgeving, zoals Microsoft Access dat heeft bij het maken
van je formulieren. Dit zou ook zo kunnen voor mijn "variabel paneel", enigste is dan nog wel dat ik een formulier met hard
geprogrammeerde panelen en een "variabel paneel", moet toe kunnen kennen aan het "variabele paneel". Maar volgens mij ligt
daar het probleem niet!

Wat ik nu graag zou willen weten is:
- Is hiervoor een component te vinden? (kan namelijk zelfs NIKS vinden, EN ja ik
heb wel degelijk gezocht)
- Als er geen component te vinden is, hoe zou je dit dan moeten maken?
Problemen waar ik waarschijnlijk tegenaan zal lopen zijn:
- het afhandelen van events achter de buttons/textvelden!
- hoe het wisselen tussen design view en form view,
gerealiseerd zou moeten worden.


Ik hoop dat ik een beetje duidelijk heb uitgelegd wat ik bedoel, en dat het dan ook duidelijk is. Zo niet, vraag dan wat je
wil weten?

Tips, aanwijzingen of wat dan ook zijn op dit moment erg welkom! :)

Verwijderd

Je moet een array aanmaken waarin de items zitten. Die items met namen en dergelijke haal je uit een datafile.

Je geeft alle items de zelfde handler en vangt in de handler af welk item is geklikt....

Maar kant en klare sleur en pleur objecten om interfaces in runtime te maken bestaan na mijn weten niet (in ieder geval NIET gratis)...

Suc6

  • Domokoen
  • Registratie: Januari 2003
  • Laatst online: 20-08 17:57
Ik heb 'zoiets' gemaakt (een gedeelte ervan) ooit in VB6: een dynamische interface, geladen uit een bestand. Vanwege de performance van het maken van een nieuwe Interface component had dit beperkingen, maar het 'geheim' was om ze in een array op te slaan, zodat for-loops e.d. mogelijk waren, zodat het makkelijk uit bestanden ingeladen kon worden.
Een click&draw interface heb ik nooit gemaakt, dit gaat best wel wat moeite kosten denk ik en het is misschien makkelijker om het wat beperkt te houden... niet teveel power aan de gebruiker geven want voor je het weten maken ze een gruwelijke GUI.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

dit is geen nationale vacaturebank heren, als jullie willen gaan handelen over prijzen mag dat per mail, maar hier in topic trash ik ze maar even ;)

Professionele website nodig?


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Je kunt in .NET gewoon tijdens runtime zoveel controls toevoegen wat je wilt. Je kunt er dan functies aan de events 'hangen' die dat dan afhandelen. Dit zijn dan wel zelf geschreven functies. Als je dat ook variabel wilt gaan maken moet je iets anders gaan oplossen. Dit soort dingen zijn volgens mij in de MSDN goed te vinden, en een goed VB.NET boek moet dat ook te vinden zijn. Dan bedoel ik het toevoegen van controls en de events etc.

Noushka's Magnificent Dream | Unity


Verwijderd

Topicstarter
Ok, heb besloten om het "variabel panel" zelf te gaan programmeren! :+

Oftewel een applicatie waarmee men dan zelf een panel kan samenstellen uit enkele User Controls zoals:
- Labels
- TextFields
- Buttons

Aan deze user controls kan men dan ook zelf weer dingen instellen zoals:
- positie
- Caption
- Tabel uit database waar de TextFields mee gevuld moeten worden (geen idee hoe ik dit moe gaan doen!)
- etc.

En ik heb idd al verscheidene dingen gevonden over het runtime toevoegen van controls en bijbehorende events, MAAR (er is altijd een "maar") dan blijven de volgende vragen bij mij open staan, mbt deze applicatie:
- Hoe zorg ik dat het samengestelde paneel "opgeslagen" word, zodat ik het kan toewijzen aan een formulier?

- In de design applicatie (zoals hierboven was beschreven) zitten al events in, maar waar het paneel strax daadwerkelijk gebruikt gaat worden, zitten dezelfde events maar dan moet ie dus wat anders doen. Hoe krijg ik dit voor mekaar? En hoe sla je dat dan weer op?

Er komen vast nog meer vragen in me op, zodra ik wat verder gevorderd ben met deze applicatie!

Ik zit nu nog in de probeer fase, zeg maar, waar ik van alles uitprobeer en dat dan later waarschijnlijk ga toepassen in me uiteindelijk applicatie!

edit:

Het antwoord was dus pointToClient, ipv. screenToClient ! :+

[ Voor 27% gewijzigd door Verwijderd op 09-10-2003 09:10 ]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Je kunt toch in .NET alles serializen naar XML ofzo? Je kunt zo je paneel ook opslaan en weer inladen. Het toevoegen aan een formulier moet dan niet zo moeilijk zijn.

Noushka's Magnificent Dream | Unity


Verwijderd

Topicstarter
OK, serializen moet ik nog eens goed naar kijken, maar ik heb eerst een ander probleem!

Ik heb een User Control gemaakt in VB.net, met een textveld. Als men met d'r rechtermuisknop op de textveld klikt, krijgt men de eigenschappen te zien van het betreffende veld (is erg schraal nog, maar goed)!

Hier kan men een kolom kiezen uit een tabel, die info word dan in het textveld gezet (uiteindelijk). Enige probleem is nu dat er iets raars gebeurd, kijk maar eens naar het plaatje hieronder:

Afbeeldingslocatie: http://members.home.nl/ttimmers.prive/pic_1.PNG

Na te rechtermuiskno te hebben geklikt:

Afbeeldingslocatie: http://members.home.nl/ttimmers.prive/pic_2.PNG


Dat rode heb ik zelf ff gedaan voor de duidelijkheid!

Ik hoop dat je nu kan zien wat er NIET goed is! voor degene die het nog niet zien, als ik dus met me rechtermuisknop op zo'n textveld heb geklikt en, dan overlapt ie dus alle andere textvelden! Ik heb geen idee hoe dit kan, want in het begin staan ze gewoon goed, maar naderhand (na rechtermuisknop) nie meer!

Kan iemand mij alsjeblieft vertellen wat ik verkeerd doe?

Men kan hier de executable downloaden!

Meer weten, vraag me dan!

O ja, ik heb nog niet echt gekeken naar ERROR afhandeling ofzo, dus val me daar niet op aan! :+

[ Voor 5% gewijzigd door Verwijderd op 13-10-2003 19:27 ]


  • LoekD
  • Registratie: Augustus 2000
  • Laatst online: 09-08 16:24
Je kan ook gewoon de controls docken (in een panel oid). Dan hoef je je geen zorgen te maken over posities e.d.

loading...


Verwijderd

de ts wil dat juist wel. hij vind dat de mensen zelf items kunnen toevoegen op een willekeurige plek. Het zou inderdaad ook handig zijn om panels te maken en daar objecten in uit te lijnen (kan je dan in runtime aangeven waar je de objeceten aan vast plakt! en hoe deze aligned moete worde!)

En publiceer de code van je custom control eens (of mail deze naar mij!) daar gaat het vast fout....

Verwijderd

Topicstarter
Het probleem met het rode vlak, heb ik gefixed!

Ik was vergeten dat ik een clientsize had gecodeerd! :+

Tot nu heb ik verder geen problemen, maar kom er vast nog wel tegen! Voor de geinteresseerde kan ik wel ff een executable ergens neer zetten, zodat men kan kijken waar ik nu eigenlijk mee bezig ben! :)

Let me know?

Verwijderd

Topicstarter
Ik heb een nieuw probleem, namelijk het aanmaken van een control (bijv. een button). In mijn XML file staat wat het type is van de betreffende control, en daarbij enkele properties zoals de positie, size, text, etc.

Nu haal ik per control deze properties op via XPath, en dan kijk ik met een IF constructie overeenkomt met een type, dus in code ziet dat er als volgt uit:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
if type = "System.Windows.Forms.Button" then
   dim btn as button = new button()
   
    with btn
         .name = name
         .text = tex
         'etc etc
    end with

panel1.Controls.add(btn)


En zoiets dus voor iedere control die ik mijn programma gebruik! Dit werkt gewoon goed, alleen mijn collega vind dit niet echt OO programmeren, en wil het anders oplossen alleen weet NOG NIET hoe!

Hij wil geen IF statements gebruiken, althans zo min mogelijk. Want nu zou ik als ik een control zou toevoegen in de applicatie die de gebruiker kan toevoegen, een nieuwe IF statement moeten maken, dat is niet echt de bedoeling bij het onderhouden van een OO programma, toch?

Nu onze vraag, hoe kan men dit oplossen EN dus geen IF statements te gebruiken!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Met Reflection kan je eea ook nog wel oplossen. Andere optie is om eens kijken naar Design Patterns; Ik denk dat het Adapter Design Pattern, eventueel in combinatie met een Factory Design Pattern, wel uitkomst kan bieden.

[ Voor 6% gewijzigd door gorgi_19 op 16-10-2003 09:42 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • LoekD
  • Registratie: Augustus 2000
  • Laatst online: 09-08 16:24
Met CodeDom of Reflection.Emit. Behoorlijk moeilijk, maar als het lukt ben je een held.

http://www.c-sharpcorner.com/Code/2002/Mar/JITCodingFB.asp

loading...


Verwijderd

Topicstarter
Vorige probleem ben ik nu mee bezig om op te lossen door middel van reflection, maar zoals LoekD al zei is dit behoorlijk pittig!

Maar in de tussentijd heb ik nog een ander probleem, namelijk het volgende:

Na een leuke klasse op internet gevonden te hebben, wat er voor zorgt dat je op een mooie wijze je controls kan aanpassen. Zoals je dat ook kan in Visual Studio .Net ook kan, mbt. het slepen en resizen van controls (runtime).

Het enige probleem is dat het in C# geschreven is, en ik dus programmeer in VB.NET. Maar ik heb het als nog herschreven naar VB.NET code, en dat ging met mijn basic skills van JAVA en C++ best aardig.

Nadat ik alle zaken had herschreven in VB.NET, wou ik de herschreven klasse in werking zien, oftewel ff snel een test applicatie gemaakt.

Nu komt het probleem, namelijk het slepen van een control gaat niet goed (het resizen daarentegen wel). Als ik een control wil gaan slepen, dan springt ie ineens naar de aller linkse hoek van me paneel. :(

Nu zou je zeggen: "Die gast heeft gewoon klakkeloos die code zitten herschrijven, en niet gekeken hoe het werkt!". FOUT, dat heb ik dus WEL gedaan, ik heb stap voor stap de code doorgenomen en snap alles wat er gebeurt. Op een klein detail na, namelijk het slepen! :)

Het slepen geschied door een mouseMouve event, waarin de volgende code staat:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Private Sub ctl_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)

        If (dragging) Then

            Dim l As Integer = m_control.Left + e.X - startx
            Dim t As Integer = m_control.Top + e.Y - starty
            Dim w As Integer = m_control.Width
            Dim h As Integer = m_control.Height

            ' l =(l<0)?0:((l+w > m_control.Parent.ClientRectangle.Width)? 
            'm_control.Parent.ClientRectangle.Width-w:l)
            If (l < 0) Then
                l = 0
            ElseIf ((l + w) > (m_control.Parent.ClientRectangle.Width)) Then
                l = m_control.Parent.ClientRectangle.Width - w
            Else
                l = 1
            End If

            ' t =(t<0)?0:((t+h> m_control.Parent.ClientRectangle.Height)? 
            'm_control.Parent.ClientRectangle.Height-h:t)
            If (t < 0) Then
                t = 0
            ElseIf ((t + h) > (m_control.Parent.ClientRectangle.Height)) Then
                t = m_control.Parent.ClientRectangle.Height - h
            Else
                t = t
            End If

            m_control.Left = l
            m_control.Top = t
        End If
    End Sub


In de code staat de C# code als commentaar, boven de IF ... ELSE ... statements, zodat je kan zien dat ik het WEL goed heb (heb dat namelijk tig keer gecheckt :D)

Hier gaat het ergens mis, maar ik zie niet waarom. Als ik aan het debuggen ga, dan komt ie ALTIJD in het ELSE blok terecht (in beide IF statements).
Dat betekent dus dat:

- l ALTIJD groter is dan 0
- l + w ALTIJD kleiner is dan de width van me paneel
- t ALTIJD groter is dan 0
- t + h ALTIJD kleiner is dan de height van me paneel

OP zich lijkt me dat logisch, daarom snap ik niet waarom de klasse in C# wel werkt, en nu niet meer in VB.NET! :S

Hieronder, voor de duidelijkheid, nog een keer dezelfde event van hierboven, alleen nu in C#:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    private void ctl_MouseMove(object sender, MouseEventArgs e) 
    {
            if (dragging) 
        {
            int l =  m_control.Left + e.X - startx;
            int t = m_control.Top + e.Y - starty;
                    int w = m_control.Width;
                    int h = m_control.Height;
            
            l =(l<0)?0:((l+w > m_control.Parent.ClientRectangle.Width)?
                        m_control.Parent.ClientRectangle.Width-w:l);
                    
            t =(t<0)?0:((t+h> m_control.Parent.ClientRectangle.Height)?
                        m_control.Parent.ClientRectangle.Height-h:t);
                    
            m_control.Left = l;
                m_control.Top = t;
        }
    }


Ben er al vanaf gister 16.00 mee bezig geweest, en op dit moment zie ik het allemaal niet zo helder meer, dus een kritisch oog van een ander zou ik zeer op prijs stellen.

offtopic:
Dat ik niet zo helder meer bent, komt NIET door de alcohol of andere middelen! :D

Ben er gewoon al veel te lang mee bezig, dat ik het niet meer zie. If you know what I mean!

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Waarom heb je die klasse herschreven naar VB.NET ?
Eén van de voordelen van .NET is language interop. Je kan binnen een VB.NET applicatie zonder problemen een C# dll oid gebruiken.

https://fgheysels.github.io/


Verwijderd

Topicstarter
O ja, ik wist niet dat dat kon ?

Ben nog redelijk nieuw met .NET gebeuren! Maar binnenkort heb ik een dotNED bijeenkomst in Delft ! ;)

Maar zou je mij kunnen uitleggen hoe men dat doet dan ? Of een link ofzo, iets wat me op weg helpt?

O volgens, mij zie ik al wat je bedoelt! Gewoon van die klasse een DLL maken, en die gebruiken in me VB.NET applicatie ?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

O volgens, mij zie ik al wat je bedoelt! Gewoon van die klasse een DLL maken, en die gebruiken in me VB.NET applicatie ?
Ja, als reference toevoegen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Je kan dat project ook gewoon aan je solution toevoegen.
Klik rechts in je solution explorer op de solution - node, en kies voor 'Add existing project' oid.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 28 oktober 2003 @ 13:09:
Je kan dat project ook gewoon aan je solution toevoegen.
Klik rechts in je solution explorer op de solution - node, en kies voor 'Add existing project' oid.
Dat heb ik geprobeert, maar toen kon ik NIET die klasse die in C# was geschreven aanspreken in me VB code!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 28 oktober 2003 @ 13:12:
[...]


Dat heb ik geprobeert, maar toen kon ik NIET die klasse die in C# was geschreven aanspreken in me VB code!
Staan ze misschien in verschillende namespaces of niet geimporteerde namespaces? En je moet nog steeds een reference aanmaken

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • LoekD
  • Registratie: Augustus 2000
  • Laatst online: 09-08 16:24
p.s.
Een rectangle heeft ook een overloaded .Contains -method, die doet onder de kap waarschijnlijk hetzelfde, maar het levert eenvoudigere code op.

loading...


Verwijderd

Topicstarter
gorgi_19 schreef op 28 October 2003 @ 13:13:
[...]

Staan ze misschien in verschillende namespaces of niet geimporteerde namespaces? En je moet nog steeds een reference aanmaken
Verschillende namespaces dus ! :D

OK het werkt nu wel, alleen als ik nu wat wil gaan toevoegen in deze "geleende" klasse, kan ik dat alleen doen in C#.

Nu is dat op zich niet zo heel erg, maar aangezien ik de klasse toch al had herschreven in VB.NET, is het naar mijn mening fijner om in een programmeertaal bezig te blijven. En daar komt bij dat mijn collega er ook mee moet kunnen werken, en die heeft alleen maar VB en VB.NET ervaring, dus geen JAVA, C++ en ook geen C#. Oftewel voor hem is het ook makkelijker als het in VB.NET geschreven is!

Dus als nog mijn vraag, hoe mijn probleem opgelost kan worden in VB.NET? Zie mijn langere verhaal hier ergens boven.
Pagina: 1