Vb 5.0 und arrays

hi,

also ich habe folgende problem. ich dimensioniere waehrend der laufzeit ein feld.

im modul

public type a
b as string
end typ

public info() as a

im program verwende ich folgenden code

do
zaehler=zaehler+1
redim Preserve info(zaehler)
info(zaehler).b=„irgendwas“
loop

wenn nun die sub verlassen werden soll, möchte ich das datenfeld
info auf eine grösse von 0 setzen nachdem ich die darin enthaltenen Daten verarbeitet habe (ubound(info)=0)
kennt wer eine möglichkeit dies zu realisieren?

Danke im voraus

Ciao alex

Hallo

Weiss nicht genau… habe das noch nie gebraucht (wieso willst Du das machen?)

aber:
Redim Info(0) geht nicht??

Gruss

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Marc,

danke für Deine Antwort.
also das habe ich schon probiert. geht leider nicht:frowning:(
folgendes möchte ich realisieren
man klickt auf eine schaltfläche dann öffnet sich eine neue form wo man laufwerk, directory auswaehlt. wenn man dann auf start drückt, wird die platte nach mp3’s durchsucht. Sie werden dann geöffnet und die Daten ( Titel, länge etc.) in eine Variable eingelesen. Anhand der gefunden Einträge wird das array dimensioniert. danach wird die form automatisch verlassen und in die ursprungsform zurückgekehrt. Dort frage ich dann die grösse des arrays ab und beginne eine Schleife wo die Daten nacheinander in diese form eingetragen werden. wenn der benutzer nun in der form auf speichern klickt, werden diese in einer DB abgespeichert. Bei einen einmaligen aufruf funktioniert soweit auch alles, aber rufe ich das ein 2 mal hintereinander auf und es werden keine oder weniger einträge als beim ersten mal gefunden, so werden diese daten zwar in die variable geschrieben, aber die dimensionsgrösse nicht erreicht. beim zurueckkehren, ist dann dieser wert falsch und wenn z.Bsp. beim ersten aufruf 130 Eintraege gefunden werden dann wird die schleife 130 mal durchlaufen. beim 2 ten mal werden nur 3 gefunden, aber die schleife durchläuft sich dann 130 mal und ich bekomme die letzten 127 alten einträge angezeigt:frowning: Deshalb muss ich die grösse der dimension wieder auf 0 bringen. ich habe auch probiert die daten in eine datei zu schreiben.
zum anfang funktionierte es aber dann springt er aus irgendein grund wie auch immer zum dateiende ( kommt auf den eintrag an) und zeigt mir somit nicht alle daten an. Die lösung mit der variablen finde ich die beste und schnellste. ich habe wie gesagt nur das eine Problem :frowning:(( Ich hoffe Dir fällt diesbezueglich eine Lösung ein.

Ciao Alex

Also…

so wie ich das verstehe hast Du eine globale Variable für das Array… das ist schon mal eher schlecht :wink: du solltest besser eine Funktion haben, welche Dir ein Array als Rückgabewert gibt… Das ist dann jeweils ein neues Array welches auch tatsächlich die Anzahl gefundener Einträge repräsentiert.

In dem aufrufenden Form weisst Du dann den Funktionswert einer lokalen Variable zu…

Was Du aber zu machen versuchst wäre einiges einfacher zu realisieren mit einer Collection of UserType… Dazu ist natürlich trotzdem eine Funktion nötig, welche Dir dann die Collection zurückgibt…

Code (nur in etwa…)
Function GetMusicFiles(a_strDrive as string) as Collection
Dim m_colTemp as Collection

Set m_colTemp = New Collection

//Schleife um die Songs zu holen
Do While //oder so
//String mit Songtitel pfad etc. zusammenstellen
m_colTemp.Add SongString
Loop

Set GetMusicFiles = m_colTemp
Set m_colTemp = Nothing
End Function

Aufrufende Funktion
…//Funktionsheader
Dim m_varSong as Variant
Dim m_colAllSongs as Collection

… //ev. Code

Set m_colAllSongs = New Collection
Set m_colAllSongs = GetMusicFiles(„C:“)

For Each m_varSong in m_colAllSongs
myTextbox.Text = m_varSongs.Name //Text aus Collection lesen
next m_varSong

//vor 2tem Aufruf
Set m_colAllSongs = Nothing
Set m_colAllSongs = GetMusicFiles(„D:“)

// dann wieder For Each Schleife

…//ev. weiterer Code
End

Etwa in diesem Stil :wink:
Den Aufruf kannst Du dann so oft machen wie Du willst… Der Vorteil der Collection ist die Anzahl! In der Funktion werden nur immer so viele hinzugefügt wie auch wirklich vorhanden sind… Das Durchlaufen mit For Each ist auch einfacher weder mit array grenzen (zero based vs on based etc…)
Und eben… mit Nothing wird die Collection gelöscht und neu aufgebaut… Weiterhin hast Du keine globalen Variablen (Kapselung) etc.etc.etc.

Falls Du damit nicht klarkommst melde Dich

Gruss und Viel Erfolg
Marc

Sie werden dann geöffnet und die Daten ( Titel, länge etc.) in
eine Variable eingelesen. Anhand der gefunden Einträge wird
das array dimensioniert. danach wird die form automatisch
verlassen und in die ursprungsform zurückgekehrt. Dort frage
ich dann die grösse des arrays ab und beginne eine Schleife wo
die Daten nacheinander in diese form eingetragen werden.

2 Möglichkeiten
Hoi Alex

Möglichkeit 1:
Das Array lässt sich auf 0 dimensionieren, wenn man den Zähler erst nachher aufaddiert, also folgendermassen:

zaehler=0
do
 redim Preserve info(zaehler)
 info(zaehler).b="irgendwas"
 zaehler=zaehler+1
loop

Wichtig ist natürlich auch, dass man vor der Schleife den Zähler immer auf 0 setzt.

Möglichkeit 2:
Du schreibst die Daten gleich direkt in eine Listbox.
Z. B. hast du in Form1 eine Listbox mit dem Namen List1, dann kannst du folgenden Code in Form2 schreiben:

Form1.List1.Clear ' löscht alle Daten in List1
zaehler=0
do
 Form1.List1.Additem "irgendwas"
loop

Nachteil bei dieser Variante: Da ich annehme, dass dein selbstdefinierter Typ nicht nur aus einem String, sondern aus mehreren Teilen besteht, müsstest du die einzelnen Teile zu einem String pro Zeile in der Listbox zusammenfügen.

Vorteil bei dieser Variante: Du brauchst überhaupt kein Array, sondern schreibst eben direkt in die Listbox, deren Inhalt du mit einem Clear auch ganz einfach wieder löschen kannst.

Viel Vergnügen weiterhin beim Programmieren
Roland