Toon posts:

[VB6] Dynamisch naar form verwijzen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste tweakers, ik heb een MDI app geschreven in VB6. Van alle forms lijken er 12 redelijk veel op elkaar en ik wil in bepaalde subs dynmisch verwijzen naar die forms. Dat klinkt raar maar een voorbeeld:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Select Case intForm
    Case 1
        form1.label1.Text = "iets"
        form1.label2.Text = "iets"
        form1.label3.Text = "iets"
    Case 2
        form2.label1.Text = "iets"
        form2.label2.Text = "iets"
        form2.label3.Text = "iets"
    Case 3
        form3.label1.Text = "iets"
        form3.label2.Text = "iets"
        form3.label3.Text = "iets"
End Select


Ik zou het overzichtelijk vinden als ik dit deed (in reallife zijn er 30 objecten die geupdate worden per form nl):

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Select case intForm
    Case 1
        Dim form As form1
    Case 2
        Dim form As form2
    Case 3
        Dim form As form3
End Select

With form
    .label1.Text = "iets"
    .label2.Text = "iets"
    .label3.Text = "iets"
End With


Als ik zoiets compile blijft de variable "form" leeg, terwijl VS gewoon de objecten in bv form1 laat zien als form. intype? Is er een manier om het zo op te lossen of moet ik alles maar gewoon als enorme blokken code laten staan?

[ Voor 5% gewijzigd door Verwijderd op 24-05-2007 16:44 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
form is een gereserveerd woord (class name); probeer eens myform ofzo.
(euh, en wat farlane zegt, je moet wel NEW gebruiken ;) )

[ Voor 29% gewijzigd door RobIII op 25-05-2007 09:26 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Je maakt alleen een variabele aan maar geen instantie van het form

Visual Basic:
1
2
3
4
5
6
Dim F as Form1
Set F = new Form 1
Load F
F.Caption = "Oh noes!"
UnLoad F
Set F = Nothing


Bovendien maak je drie variabelen aan met de naam form in dezelfde scope. ( Zet 'Require Variable Declaration' aan in het options menu, ALTIJD! )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Haha het is een snel gemaakt voorbeeld het ging om de vraag :-D. En nee ik heb het niet form genoemd! Probleem is dat als ik een instance maak door new tegebruiken er ook meteen een nieuwe form naar voren komt als er al een andere instance actief was.

Als ik het zo wel doen moet ik een hoop herschreven, en daar ben ik uiteraard te lui voor ;). Maar het is waarschijnlijk the only way....

Edit: ik verwijs trouwens vanuit meerdere modules en forms naar dat ene actieve form, kan moeilijk steeds een nieuwe instance aanmaken denk ik.

[ Voor 15% gewijzigd door Verwijderd op 25-05-2007 09:54 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Verwijderd schreef op vrijdag 25 mei 2007 @ 09:39:
Edit: ik verwijs trouwens vanuit meerdere modules en forms naar dat ene actieve form, kan moeilijk steeds een nieuwe instance aanmaken denk ik.
Je hoeft em ook niet meerdere keren met new aan te maken maar wel minstens 1 keer. Het gebruik van de automatische form objecten is een no-no, dat geeft alleen maar verwarring en stomme bugs. Dwz als je new gebruikt, moet je niet ook nog eens bv

Visual Basic:
1
Form1.Caption = 'Oh noes' 


doen want dan maakt ie een tweede ( automatische ) instantie aan met dezelfde naam als het type van het formulier.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Ashtaroth
  • Registratie: December 2003
  • Laatst online: 25-09-2019
Omdat je vanuit meedere modules en forms moet kunnen beschikken zou je in een module een globaal form object kunnen aanmaken:

Visual Basic:
1
Public g_objForm   As Form


Zoals farlane als zegt, creer je een formulier object eenmalig met New. Daarnaast kun je nagaan welk form als is aangemaakt. Is er al een instantie, maak je simpelweg geen nieuwd object aan.

Verwijderd

Topicstarter
Ja goed het new keyword was de way to go. Dacht dat het enkel een .NET/OOP iets was :).

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Verwijderd schreef op maandag 28 mei 2007 @ 03:31:
Ja goed het new keyword was de way to go. Dacht dat het enkel een .NET/OOP iets was :).
Het is (bijna?) in alle talen een keyword dat gebruikt wordt bij het dynamisch aanmaken van instanties. ( Het is ook niet specifiek OO want in C++ bijvoorbeeld kan ik ook primitieven aanmaken op deze manier )

VB6 heeft een dun OO laagje dat niet al te veel voordelen biedt boven de 'oude' VB manier. Het kent bijvoorbeeld geen overloading of statische object instanties. ( dwz, ik kan geen objecten aanmaken zonder new te gebruiken ).

Dus, het is erg leerzaam om er mee te experimenteren maar verwacht er niet te veel van.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Ashtaroth
  • Registratie: December 2003
  • Laatst online: 25-09-2019
Het kent bijvoorbeeld geen overloading of statische object instanties. ( dwz, ik kan geen objecten aanmaken zonder new te gebruiken ).
Tenzij je het gebruik van een module ziet als een statische object instantie.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Ashtaroth schreef op dinsdag 29 mei 2007 @ 23:09:
Tenzij je het gebruik van een module ziet als een statische object instantie.
Dat is het niet. En dan nog kun je in een module ook geen statische object instanties hebben. ( Let wel ik heb het hier specifiek over objecten, niet over primitieven )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 01-12 12:05
Er bestaat toch iets van
code:
1
Set MyForm = Application.Forms("Naam")


edit:
Dit werkt alleen met reeds geopende forms. Alle forms kun je benaderen met Currentproject.Allforms, maar dan kun je niets veranderen. Dus eerst OpenForm (met hidden), dan aanpassen en dan show.

[ Voor 55% gewijzigd door Bolukan op 30-05-2007 11:13 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Bolukan schreef op woensdag 30 mei 2007 @ 11:04:
Er bestaat toch iets van
code:
1
Set MyForm = Application.Forms("Naam")


edit:
Dit werkt alleen met reeds geopende forms. Alle forms kun je benaderen met Currentproject.Allforms, maar dan kun je niets veranderen. Dus eerst OpenForm (met hidden), dan aanpassen en dan show.
Je maakt hier gebruik van hidden object formulieren. ( Het lijkt alsof je geen new gebruikt maar VB maakt op de achtergrond een nieuw object aan met dezelfde naam als het type van het formulier ) Das niet de weg die je wilt gaan.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 01-12 12:05
Pieter stelt niet dat het form niet open staat. Dus dan moet het werken. Ik wilde alleen aangeven dat het anders niet werkt. Voor zover het dynamische content is, hoeft het alleen met een open formulier te werken.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Naast het feit dat jouw methodes volgens mij alleen werkt in Acess of Excel komt dat op hetzelfde neer als:
Visual Basic:
1
2
3
4
5
6
7
Dim F as MyForm
Set F = new MyForm
Load F
'DoStuff with F
Call F.Show( vbModal )
Unload F
Set F = Nothing


in VB6

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1