[VB6] Kijken of een dynamische array al bestaat

Pagina: 1
Acties:

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Topicstarter
Ik zit met 't volgende probleem; Ik heb in het Resize event van mijn hoofdformulier wat code gezet die eventuele aanhangende formulieren gaat resizen als 'ie zelf resized.

Opzich geen probleem maar die mogelijke aanhangende formulieren staan in een dynamische array die is gedefinieerd in een andere .bas. Als ik mijn programma opstart dan gaat het fout in het Resize event van 't hoofdformulieer. Volgens mij bestaat de dynamische array dan nog niet ofzo, de aanroep van UBound wil iig niet werken.

Weet iemand hoe ik kan checken of die dynamische array al bestaat. Vergelijkigen met Nothing of Empty lopen op niks uit.

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Topicstarter
Ik ben net dit stukje code tegen gekomen maar ik vraag me af of het niet iets korter en krachter kan? Kun je niet kijken of er al iets van een pointer ofzo is?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Function GetUpper(varArray As Variant) As Integer
    Dim Upper As Integer
    On Error Resume Next
    Upper = UBound(varArray)
    If Err.Number Then
      If Err.Number = 9 Then
        Upper = 0
      Else
        With Err
            MsgBox "Error:" & .Number & "-" & .Description
        End With
        Exit Function
      End If
    Else
      Upper = UBound(varArray) + 1
    End If
    On Error GoTo 0
    GetUpper = Upper
End Function

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 21:40

mulder

ik spuug op het trottoir

Waarom een variant? Denk dat arrString() As String bijvoorbeeld niet die errors geeft.

oogjes open, snaveltjes dicht


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Topicstarter
Hmm... tja. Ik kwam er net achter dat het helemaal geen variant array is maar een array van een user defined type. Ik weet niet of dat wat uitmaakt voor mijn probleem? Die functie zoals ik 'em hierboven heb gepost werkt iig niet. Krijg dan de volgende foutmelding:
Compile error:

Only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions.

  • Crazy D
  • Registratie: Augustus 2000
  • Nu online

Crazy D

I think we should take a look.

Is de Forms collectie niet een handige om door te lopen en alle forms te resizen?

Exact expert nodig?


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Topicstarter
Op maandag 25 februari 2002 16:25 schreef Crazy_D het volgende:
Is de Forms collectie niet een handige om door te lopen en alle forms te resizen?
Goede vraag, geen idee. Is een beetje een vreemde app waar ik momenteel aan 't werk ben gezet. Het is een MDI applicatie maar dan SDI opgezet. Gebruikt een ActiveX object om van die SDI formulieren toch weer een MDI formulier te maken. Ben daarnaast ook meer een Delphi man dan een VB man. Ach ja, je blijft lachen.

  • Crazy D
  • Registratie: Augustus 2000
  • Nu online

Crazy D

I think we should take a look.

Op maandag 25 februari 2002 16:32 schreef Lorn het volgende:
Goede vraag, geen idee. Is een beetje een vreemde app waar ik momenteel aan 't werk ben gezet. Het is een MDI applicatie maar dan SDI opgezet.
Hehe tis weer eens wat anders :)

Maarre give it a try zou ik zeggen:
code:
1
2
3
4
Dim f As Form
For Each f In Forms
    f.Move ergens_naartoe
Next 'f

Zo ongeveer dan. "Ergens" in de collectie staat ook je main-form dus die zal je er nog ff uit moeten vissen (If Not (f Is Me) of zo). 't Is zeg maar de VB way to go ;)

Exact expert nodig?


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 13-09 14:48

johnwoo

3S-GTE

De Forms collection lijkt me idd de makkelijkste manier om dit te doen. Persoonlijk zet ik in een app bij alle "document" forms een speciale tag ("DOC" ofzo, of iets specifieks) en laat ik de tag van alle overige forms (main form, dialogs, enz) leeg. Bij het doorlopen van de Forms collection kan je dan makkelijk aan de tag zien om welke (soort) form het gaat.

Maar om even terug te komen op de dynamische array: ik gebruik zelden de Ubound functie; ik houd zelf gewoon een tellertje bij, en maak dan functies om een element toe te voegen of te verwijderen, waarin dat tellertje dan wordt opgehoogd of verlaagd.

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Topicstarter
Bedankt voor de replies. Er staat in de tag van de form wel een code. Elk formulier heeft zo zijn eigen code en aan de hand daarvan weet ik dan welk formulier er geresized moet worden. Ik zit er over te denken om er gewoon een statische array van te maken want voor zo ver ik nu heb gezien word er nergens in de applicatie iets toegevoegd of verwijderd uit de array. Is tevens misschien ook wel de makkelijkste oplossing voor mijn probleem.

  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

Op maandag 25 februari 2002 19:24 schreef johnwoo het volgende:
De Forms collection lijkt me idd de makkelijkste manier om dit te doen. Persoonlijk zet ik in een app bij alle "document" forms een speciale tag ("DOC" ofzo, of iets specifieks) en laat ik de tag van alle overige forms (main form, dialogs, enz) leeg. Bij het doorlopen van de Forms collection kan je dan makkelijk aan de tag zien om welke (soort) form het gaat.

Maar om even terug te komen op de dynamische array: ik gebruik zelden de Ubound functie; ik houd zelf gewoon een tellertje bij, en maak dan functies om een element toe te voegen of te verwijderen, waarin dat tellertje dan wordt opgehoogd of verlaagd.
eeeuh.. die ubound functie is juist hiervoor bedoeld dat je naast je dynamische arrayer niet nog een teller variabele defineert |:(
Ff een blaat tussendoor .. Weet waar je index nummer van je array begint (in te stellen door aan het begin van de module option base 1 of 0 te zetten).. dat scheelt weer sores..

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Topicstarter
Op dinsdag 26 februari 2002 09:19 schreef henkleerssen het volgende:

[..]

eeeuh.. die ubound functie is juist hiervoor bedoeld dat je naast je dynamische arrayer niet nog een teller variabele defineert |:(
Ff een blaat tussendoor .. Weet waar je index nummer van je array begint (in te stellen door aan het begin van de module option base 1 of 0 te zetten).. dat scheelt weer sores..
Zeker weten wat betreft die UBound functie? Die geeft juist problemen bij dynamische arrays, UBound kan niet zien of er al wel of geen elementen in zitten. Zit er niks in dan geeft 'ie een error. Opzich is die extra teller variabele geen slechte oplossing zou ik denken. Mijn array begint trouwens keurig op 0 en bevat acht elementen, laatste index is dus 7.

  • Crazy D
  • Registratie: Augustus 2000
  • Nu online

Crazy D

I think we should take a look.

Op dinsdag 26 februari 2002 10:03 schreef Lorn het volgende:
Zeker weten wat betreft die UBound functie? Die geeft juist problemen bij dynamische arrays, UBound kan niet zien of er al wel of geen elementen in zitten. Zit er niks in dan geeft 'ie een error.
Klopt maar daar heb je de IsArray functie voor :)

Exact expert nodig?


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Topicstarter
Op dinsdag 26 februari 2002 10:29 schreef CrazyD_at_work het volgende:

[..]

Klopt maar daar heb je de IsArray functie voor :)
Heb 'em geprobeerd maar ook die werkt niet bij mij. Krijg weer die melding dat ik dat mijn array met een UDT niet mag coercen naar een variant. Heb ook de functie IsEmpty gevonden, is die gemaakt met dynamische arrays in gedachten? Niet dat 'ie bij mij werkt maar misschien dat ik 'em in de toekomst nog eens kan gebruiken als ik een iets minder exotische array heb.

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 21:40

mulder

ik spuug op het trottoir

Nogmaals waarom die variant. Dat UDT probleem is te omzeilen zonder variant te gebruiken, maar ik weet nu effe niet hoe...

Dit zou moeten werken, zo uit m'n hoofdje:
code:
1
2
3
4
5
6
7
Public Type Blaat
  X As Integer
  Y As Integer
End Type

Private Function GetUpper(arrBlaat() As Blaat) As Integer
End Sub

oogjes open, snaveltjes dicht


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Topicstarter
Op dinsdag 26 februari 2002 10:53 schreef Don Facundo het volgende:
Nogmaals waarom die variant. Dat UDT probleem is te omzeilen zonder variant te gebruiken, maar ik weet nu effe niet hoe...

Dit zou moeten werken, zo uit m'n hoofdje:
code:
1
2
3
4
5
6
7
Public Type Blaat
  X As Integer
  Y As Integer
End Type

Private Function GetUpper(arrBlaat() As Blaat) As Integer
End Sub
Dat is vrijwel dezelfde code als die ik nu gebruik. Heb nergens meer variant in staan. Maar toch wil het niet lukken. De locale VB-guru hier heeft de moed al opgegeven. Heb nu een workaround geschreven en dat werkt opzich wel goed. Als ik nou zelf nog een keer iets moet maken in VB dan ga ik het zeker proberen met die GetUpper, zou toch moeten werken. Het probleem is dat ik nu kom binnen vallen in een groot project en ik 'even' wat moet aanpassen. Dat gaat natuurlijk nooit zomaar.

  • Crazy D
  • Registratie: Augustus 2000
  • Nu online

Crazy D

I think we should take a look.

Quick'n'dirty methode:
Err.Clear
On Local Error Resume Next
Dim iUbound as integer
iUbound = Ubound(arraytje)
If Err.Number <> 0 Then iUbound = -1
Err.Clear

Je kan er ook een collection-class voor ge/misbruiken. Kun je gewoon met .Count opvragen hoeveel er zijn (en 0 bij geen dus :P) en met een for each.. er doorheen lopen.

Exact expert nodig?


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 13-09 14:48

johnwoo

3S-GTE

Op dinsdag 26 februari 2002 09:19 schreef henkleerssen het volgende:

[..]

eeeuh.. die ubound functie is juist hiervoor bedoeld dat je naast je dynamische arrayer niet nog een teller variabele defineert |:(
Ja maar om telkens die ubound functie te gebruiken geeft meer overhead (grotere executable en meer CPU usage) dan een extra tellertje (dat toch maar 2 bytes geheugen inneemt) :)

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 21:40

mulder

ik spuug op het trottoir

Grotere executable??? Omdat het meer letters heeft? Denk je dat VB steeds de Ubound functie er in bakt, denk eerder dat UBound een minder grote executable oplevert.

oogjes open, snaveltjes dicht


  • Crazy D
  • Registratie: Augustus 2000
  • Nu online

Crazy D

I think we should take a look.

Op dinsdag 26 februari 2002 12:55 schreef johnwoo het volgende:
Ja maar om telkens die ubound functie te gebruiken geeft meer overhead (grotere executable en meer CPU usage) dan een extra tellertje (dat toch maar 2 bytes geheugen inneemt) :)
Grotere exe weet ik niet (probeer het eens uit :P) CPU usage klopt op zich wel, maar die overhead merk je pas bij grote loops. En dan kun je altijd nog even de ubound-waarde in een var zetten... maar in een loopje van 7 items oid is een extra var daarvoor op zich meer overhead dan ubound (tenzij die loop 3000000 keer per minuut wordt uitgevoerd natuurlijk ;)

Exact expert nodig?


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Topicstarter
Die Quick 'n Dirty oplossing is wel mooi gevonden. Misschien dat ik die er wel in plak ipv mijn eigen code. Volgens mij iets beter dan mijn On Error GoTo, al dat gespring naar labels en dan weer terug met een Resume ben ik niet zo'n fan van.

Ik verwacht trouwens ook niet dat het gebruik van UBound een grotere .exe oplevert dan wanneer je een teller gebruikt. Bovendien zal dat verschil minimaal zijn en ik ken applicaties die een boel meer beslag leggen op je resources dan de applicatie waar ik hier aan 't werken ben.

Verwijderd

Moet je niet eerst afvragen of dat ding wel gevuld is m.b.v. IsEmpty() of IsNull() (één van de 2, kweetnie meer welke aangezien het tijd terug is dat ik VB gedaan heb).

  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

Op dinsdag 26 februari 2002 11:24 schreef CrazyD_at_work het volgende:
Quick'n'dirty methode:
Err.Clear
On Local Error Resume Next
Dim iUbound as integer
iUbound = Ubound(arraytje)
If Err.Number <> 0 Then iUbound = -1
Err.Clear

Je kan er ook een collection-class voor ge/misbruiken. Kun je gewoon met .Count opvragen hoeveel er zijn (en 0 bij geen dus :P) en met een for each.. er doorheen lopen.
Prima oplossing ja.. en met die extra variable kun je ook doen.. het progje wordt niet echt veel groter nee...

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 13-09 14:48

johnwoo

3S-GTE

Op dinsdag 26 februari 2002 13:05 schreef Don Facundo het volgende:
Grotere executable??? Omdat het meer letters heeft? Denk je dat VB steeds de Ubound functie er in bakt, denk eerder dat UBound een minder grote executable oplevert.
Nou, iedere function call is behoorlijk wat overhead (argument op stack pushen, functie callen, en de functie zelf natuurlijk maar da's maar eenmalig), terwijl om een variabele (= geheugenlocatie) te accessen maar een mov instructie nodig is :)

Ik programmeer dan wel voornamelijk VB, maar op sommige punten ben ik net zo'n byteneuker als een assembly man ;)

En idd, puur die ubound maakt niet zoveel uit (tenzij je em vaak gebruikt), maar het punt is dat er meer van die - op zich heel kleine - dingetjes zijn, die bij elkaar opgeteld toch wel degelijk verschil maken...

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1

Pagina: 1