Mehrdim Array in Textdatei schreiben und lesen

Hallo Wissende,

Code soll Vba übergreifend funktionieren nur mit leichten Anpassungen.
Aber für das Problem spielt das keine Rolle, könnte auch ein VB-Problem sein.

Ich habe eine Textdatei, zu Anfangs leer. Dadrin soll Zug um Zug ein großes mehrdimensionales Array gespeichert werden.
Bei jedem Aufruf von ListeEintragen soll die Textdatei in ein Array gelsen werden, dann die Textdatei neu leer geöffnet werden.

Nun soll im Dimensionsaufbau wie das Array ein (einzeiliger) Satz geschrieben werden, dann dazu/danach das Array und die neue Textdatei gespeichert.
Danach wieder geöffnet und ausgelesen werden um die neueste „Liste“ zu haben.

Wie im Code ersichtlich klappt schon das erste Einlesen nicht bzw. das klappt irgendiew aber Zugriff mit MsgBox auf das erste Element geht schief, Fehler 13.

Gut, beim ersten Lesen könnte man ja sagen, Fehler kommt weil das Array=die Textdatei leer ist. Aber wenn ich die Zeile lösche kommt der glkeiche Fehler bei der zweiten MsgBox und da sollte zuindest ein Datensatz drin sein :frowning:

Danke ^ Gruß
Reinhard

Sub Fehlertest()
Call ListeEintragen(ActiveDocument)
End Sub

Sub ListeEintragen(ByRef Doc As Document)
Dim MyArray As Variant
Const PfadDat As String = "c:\test\Dateiliste1\_3.txt"
MyArray = ReadArray(PfadDat)
MsgBox MyArray(0, 0) 'Hier kommt Fehler 13 Typen unverträglich
Call SaveArray("c:\test\Dateiliste1\_2.txt", MyArray, Doc)
MyArray = ReadArray(PfadDat)
MsgBox MyArray(0, 0) 'Hier kommt Fehler 13 Typen unverträglich
End Sub

Public Sub SaveArray(ByVal sFile As String, vArray As Variant, Doc As Document)
Dim F As Integer, arrDoc(0, 2) As String, nCount As Long
arrDoc(0, 0) = Doc.Name
arrDoc(0, 1) = FileDateTime(Doc)
arrDoc(0, 2) = Doc.Path
If Dir$(sFile) "" Then Kill sFile
F = FreeFile
nCount = UBound(arrDoc)
If Not IsEmpty(vArray) Then nCount = nCount + 1 + UBound(vArray)
Open sFile For Binary As #F
 Put #F, , nCount
 Put #F, , arrDoc
 If Not IsEmpty(vArray) Then Put #F, , vArray
Close #F
End Sub

Public Function ReadArray(ByVal sFile As String) As Variant
Dim F As Integer, nCount As Long, vArray As Variant
'If Len(Dir$(sFile)) \> 0 Then
 F = FreeFile
 Open sFile For Binary As #F
 Get #F, , nCount
 ReDim vArray(nCount)
 Get #F, , vArray
 Close #F
'End If
ReadArray = vArray
End Function

Hi Reinhard,

vorweg: ich habe Deinen Code nur überflogen.

M.E. kommt der Fehler deshalb, weil das Variablenkonzept von VBA nicht so ganz klar ist. VBA tönt in der Hilfe lauthals, es könne mit Variant alle VBA-möglichen Datentypen abdecken. Ich arbeite niemals damit. Deshalb erinnere ich mich nur schwach, daß ich im Überwachungsfenster beim Datentyp so 'was gesehen habe wie „Variant (Double)“.
VBA hat m.E. dabei so 'was wie einen Ober-Typ Variant (also eine Art Auffangbecken), innerhalb dessen automatische Konversionen/Deklarationen vorgenommen werden, die dann in der Klammer benannt werden.
Es könnte sein, daß bei Variablenübergaben ein Turbo-Erkennungsmodus für die Unter-Typen von Variant läuft, damit VBA vor lauter Benutzerfreundlichkeit (= Genauigkeitsfeindlichkeit) nicht vollends ins Schleudern kommt.

Weil der Fehler bei Dir direkt nach einer solchen Variant-Variablenübergabe auftritt, rate ich, daß hier ein Automatismus nicht funktioniert.

Weil ich Deinen Code nur überflogen habe, kann ich leider nicht hinweisen, wo ich die Deklarationen expliziter machen würde.

HTH anyway.

Markus
__________
*****

Hallo Reinhard,

ich sehe in Deinem Code vor allem ein grundsätzliches Problem.

Wenn Du mit Put ein Array oder einen privaten Typ mit mehreren Elementen in ein Textfile schreiben und lesen willst, darfst Du keine variablen Längen haben.

Besteht Dein Array nur aus Integer, Long, Single oder Double, ist das kein Problem, da steht ja fest, wie viele Bytes jedes Feld hat. Den Counter brauchst Du dann auch nicht, weil Du das Array dimensionieren kannst, wenn Du die Größe der Textdatei ermittelst und durch die Bytes pro Variable teilst.

Wenn Du das mit einem Array aus Strings machen möchtest, geht das nur, wenn Du Strings fester Länge verwendest!

Dim MyStr() * 20

Ein Array aus Strings, die Jeder eine feste Länge von 20 Zeichen haben.

Du verwendest Variant, weil Du mal Zahlen, dann Strings variabler Länge, dann Datevalue im Array unter bringen willst.

Dieses Array kannst Du so nicht mit Put/Get schreiben/lesen. Put/Get funktioniert nur mit Arrays, bei denen alle Felder gleich viele Bytes enthalten.

Noch zwei Beispiele:

Option Explicit

Private Type Test
 Nr As Integer
 Na As String
End Type

Private Sub Command1\_Click()
 Dim arr() As Test
 ReDim arr(1)
 arr(0).Nr = 1
 arr(0).Na = "txt1"
 arr(1).Nr = 2
 arr(1).Na = "txt2"
 Open "C:\Test" For Binary As #1
 Put #1, , txt
 Close #1
End Sub

Das klappt nicht, brauchen wir gar nicht erst versuchen zu lesen. :smile:
Aber das geht:

Option Explicit

Private Type Test
 Nr As Integer
 Na As String \* 8
End Type
Dim arr() As Test

Private Sub Command1\_Click()
 ReDim arr(1)
 arr(0).Nr = 1
 arr(0).Na = "txt1"
 arr(1).Nr = 2
 arr(1).Na = "txt2"
 Open "C:\Test.txt" For Binary As #1
 Put #1, , arr
 Close #1
End Sub


Private Sub Command2\_Click()
 ReDim arr(FileLen("C:\Test.txt") / 10)
 Open "C:\Test.txt" For Binary As #1
 Get #1, , arr
 Close #1
End Sub

In arr(0).Na steht dann aber nicht „txt1“ sondern "txt1 " (8 Zeichen)

Gruß Rainer

Hallo Rainer,

ich sehe in Deinem Code vor allem ein grundsätzliches Problem.
Wenn Du mit Put ein Array oder einen privaten Typ mit mehreren
Elementen in ein Textfile schreiben und lesen willst, darfst
Du keine variablen Längen haben.

doch.

Nachfolgend ist Code, (sorry, für ExcelVba, konnte jetzt noch nicht umschreiben auf VB-ähnlich, der funktioniert damit)
Mit TestDatenErzeugen werden in A1:E11001 Testdaten angelegt.
Mit

Sub Test()
Call Fuellen
Call Auslesen
End Sub

werden diese Testdaten erst in eine Textdatei geschrieben, dann wieder ausgelesen und in den neuen Zellbereich H1:L11001
Und die Testdaten haben unterschiedliche Einzellängen.

Den Grundcode habe ich von:

http://www.vbarchiv.net/tipps/tipp_1093-array-schnel…

Ich vermute derzeit (wehcselt stündlich *gg*) daß ich da ein falsches Array in der Textdatei habe irgednwie, ich muß mir das mal im Editor genauestens anschauen.
Auch weil es MyArray(0,0) nicht gibt, fängt bei MyArray(1,1) an.

Danke schon mal für deine Mühe, deine Codes schaue ich mir jetzt an.

Gruß
Reinhard

Option Explicit

Sub Test()
Call Fuellen
Call Auslesen
End Sub

Sub Fuellen()
Dim MyArray As Variant
'http://www.vbarchiv.net/tipps/tipp\_1093-array-schnell-speichern-und-wieder-laden.html
With Worksheets("Tabelle1")
 MyArray = .Range("A1:E" & .Cells(.Rows.Count, 1).End(xlUp).Row)
 SaveArray "c:\test\Dateiliste1\_2.txt", MyArray
End With
End Sub

Sub Auslesen()
Dim MyArray As Variant
MyArray = ReadArray("c:\test\Dateiliste1\_2.txt")
With Worksheets("Tabelle1")
 .Range("H1:L" & UBound(MyArray, (1))).Value = MyArray
End With
End Sub

Public Function ReadArray(ByVal sFile As String) As Variant
Dim F As Integer, nCount As Long, vArray As Variant
If Len(Dir$(sFile)) \> 0 Then
 F = FreeFile
 Open sFile For Binary As #F
 Get #F, , nCount
 ReDim vArray(nCount)
 Get #F, , vArray
 Close #F
End If
ReadArray = vArray
End Function

Private Sub SaveArray(ByVal sFile As String, vArray As Variant)
 Dim F As Integer, nCount As Long
 If Dir$(sFile) "" Then Kill sFile
 F = FreeFile
 Open sFile For Binary As #F
 nCount = UBound(vArray)
 Put #F, , nCount
 Put #F, , vArray
 Close #F
End Sub

Sub TestDatenErzeugen()
Dim Zei As Long, Spa As Long
Application.ScreenUpdating = False
With Worksheets("Tabelle1")
 .Range("A1:E1").Value = Array("Nr", "Name", "Datum", "Pfad", "Bemerkung")
 For Zei = 2 To 11001
 .Cells(Zei, 1).Value = Zei - 1
 .Cells(Zei, 2).Value = "Name " & Int(Rnd() \* 11000) + 1
 .Cells(Zei, 3).Value = "'" & Format(Int(Rnd() \* 11000) + 35000, "dd.mm.yyyy")
 .Cells(Zei, 4).Value = "Pfad " & Int(Rnd() \* 11000) + 1
 .Cells(Zei, 5).Value = "Bemerkung " & Int(Rnd() \* 11000) + 1
 Next Zei
End With
Application.ScreenUpdating = True
End Sub

Hallo Markus,

könne mit Variant alle VBA-möglichen Datentypen abdecken. Ich
arbeite niemals damit.

niemals? *ui*. Nicht so einfach, stelle ich mir vor.
Grad wenn du Usereingaben oder sonstwas auswertest muß man doch mit allem rechnen.

Deshalb erinnere ich mich nur schwach,
daß ich im Überwachungsfenster beim Datentyp so 'was gesehen
habe wie „Variant (Double)“.
VBA hat m.E. dabei so 'was wie einen Ober-Typ Variant (also
eine Art Auffangbecken), innerhalb dessen automatische
Konversionen/Deklarationen vorgenommen werden, die dann in der
Klammer benannt werden.

Ja, das sah ich auch schon häufig. Verstanden habe ich es nicht ausreichend geug.

Weil ich Deinen Code nur überflogen habe, kann ich leider
nicht hinweisen, wo ich die Deklarationen expliziter machen
würde.

Ich überprüfe den Code, danke.

Gruß
Reinhard

Hallo Reinhard,

Und die Testdaten haben unterschiedliche Einzellängen.

dann müssen da Trennzeichen mit gesichert werden, sonst ist eine Zuordnung der geladenen Bytes zu den Items nicht möglich.

Das ist scheinbar mal wieder ein grundsätzlicher Unterschied zwischen VB6 und VBA. In VB6 habe ich nur eine Chance, ein Array mit Strings unteschiedlicher Länge mit einem einzigen Put so zu schreiben, daß ich mit Get wieder lesen kann, nämlich über Join und Split. Ein ungeordnetes Mischen von verschiedenen Datentypen in einem Array und das dann mit Put schreiben und mit Get wieder lesen klappt in VB6 definitiv nicht. Es werden keine Trennzeichen geschrieben und die Zuordnung der Daten zu den Items klappt nur, indem alle gleich lang sind. In meinem Beispiel werden immer 10 Zeichen einem Item zugeordnet. Die ersten 2 enthalten den Integer, die nächsten 8 den String.

Was Du vor hast und wie Du schreibst mit VBA auch geht, funktioniert so viel ich weiß mit VB6 nicht. So ein Array könnte man nur mit einer Schleife schreiben und lesen.

Gruß Rainer

Hallo Reinhard,

ich nehme alles zurück! :smile:

Das hatte ich schon mal getestet und es ging definitiv nicht.
Irgend etwas muss ich wohl falsch gemacht haben …
Das hier läuft zu meinem Erstaunen.

Gruß Rainer

Option Explicit

Dim arr() As Variant

Private Sub Command1\_Click()
 Dim i As Integer
 List1.Clear
 For i = LBound(arr) To UBound(arr)
 List1.AddItem arr(i)
 Next
End Sub

Private Sub Command2\_Click()
 Open "C:\Test.txt" For Binary As #1
 Put #1, , UBound(arr)
 Put #1, , arr
 Close #1
End Sub

Private Sub Command3\_Click()
 Dim n As Long
 Open "C:\Test.txt" For Binary As #1
 Get #1, , n
 ReDim arr(3)
 Get #1, , arr
 Close #1
End Sub

Private Sub Form\_Load()
 ReDim arr(3)
 arr(0) = "Test"
 arr(1) = 4
 arr(2) = 64000
 arr(3) = "Versuch"
End Sub

Hallo reinhard,

ich hab’s gefunden.

Du hast Fehler beim Redim. Du musst den zweiter Parameter variable neu setzen, der erste darf nicht verändert werden.

Gruß Rainer

Option Explicit

Dim arr() As Variant

Private Sub Command1\_Click()
 Dim i As Integer, j As Integer
 List1.Clear
 For i = LBound(arr, 1) To UBound(arr, 1)
 For j = LBound(arr, 2) To UBound(arr, 2)
 List1.AddItem arr(i, j)
 Next
 Next
End Sub

Private Sub Command2\_Click()
 Open "C:\Test.txt" For Binary As #1
 Put #1, , UBound(arr, 2)
 Put #1, , arr
 Close #1
End Sub

Private Sub Command3\_Click()
 Dim n As Long
 Open "C:\Test.txt" For Binary As #1
 Get #1, , n
 ReDim arr(1, n)
 Get #1, , arr
 Close #1
End Sub

Private Sub Form\_Load()
 ReDim arr(1, 1)
 arr(0, 0) = "Test"
 arr(0, 1) = 4
 arr(1, 0) = 64000
 arr(1, 1) = "Versuch"
End Sub

ich nehme alles zurück! :smile:
Das hier läuft zu meinem Erstaunen.

Hall Rainer,

höre ich gerne, denn ich sehe es anders, weil ja der Codee vom VB-Archiv prinzipiell läuft bei mir, nur hier im Beispielcode (noch) nicht.

Zum Ainen soll der Code sehr schnell sein also möglichst auf einen Bloch eine Textdatei auslesen und beschreiben.
Das dabei benutzte Array will ich dann auch genauso schnell bei Bedarf in einem ListView anzeigen können.

Zum Anderen feste vorgegebene Zeichenanzahlen in dem Array will ich nicht das würde alles unnötig verlangsamen aufblähen. Ich müßte ja die größte anzunehmende Zeichenanzahl annehmen und das wären k.A. 500 oder so.

Leicht erschwerend kommt dazu, permanent kommt ein datensatz dazu, der soll aber in der Textdatei bzw. dem Array oben stehen.

Später soll man dann auch noch einzelne Datensätze löschen können durch angeben der Indexnummer.

Und, ich stosse da auf Problem nach Problem, manchmal auch Dinge die mit dem Problem nix zu tun haben, da wollte ich dir in VB etwas basteln, was eine Form anzeigt, zur laufzeit eine ListBox einfügt usw.
Da hapert es schoon daran:

Private Sub Form_Load()
'Me.StartUpPosition = vbStartUpManual ’ geht nicht, schreibgeschützt???
'Me.Top = 0 ’ klappt
'Me.Left = 0 ’ klappt
'Me.Width = 600 ’ klappt nicht, Breite viel kleiner
'Me.Height = 600 ’ klappt nicht, Höhe viel kleiner
''Me.Refresh
End Sub

-(

Gruß
Reinhard

Hallo Reinhard,

höre ich gerne, denn ich sehe es anders, weil ja der Codee vom
VB-Archiv prinzipiell läuft bei mir, nur hier im Beispielcode
(noch) nicht.

Du hast die neue antwort auf Dein UP noch nicht gelesen.
Du hast beim einlesen mit redim aus dem Array ein ein-dimensionales array gemacht, deshalb der Fehler. Ist gelöst …

Und, ich stosse da auf Problem nach Problem, manchmal auch
Dinge die mit dem Problem nix zu tun haben, da wollte ich dir
in VB etwas basteln, was eine Form anzeigt, zur laufzeit eine
ListBox einfügt usw.

Zur Laufzeit ein Steuerelement hinzufügen …
Hmm. bei AVB steht, wie das geht.
Ich habe mich schon immer gerfagt, wozu das gut sein soll. Das macht die Aktion doch nur unnötig kompliziert. Warum nicht schon gleich einfügen und nur unsichtbar schalten?

Da hapert es schoon daran:

Private Sub Form_Load()
'Me.StartUpPosition = vbStartUpManual ’ geht nicht,
schreibgeschützt???

ja, klar. Die startposition musst du vorher festlegen oder es Windows überlassen.

'Me.Top = 0 ’ klappt
'Me.Left = 0 ’ klappt

Eben. Und wenn Du erst dann die Form anzeigst, kann Dir die Startposition egal sein.

'Me.Width = 600 ’ klappt nicht, Breite viel kleiner
'Me.Height = 600 ’ klappt nicht, Höhe viel kleiner

600 Twips sind 40 pixel, das ist für eine Form aber sehr klein.
Da ist noch nicht mal Platz für die Controlbox …
Oder sollten es Pixel werden? Dann Scalmode auf vpPixels und …

Me.ScaleWidth = 600

Gruß Rainer

Hallo Rainer,

Du hast die neue antwort auf Dein UP noch nicht gelesen.

hab ich schon, auch gleich probiert, klappte noch nicht.
Aber ich komme mit dem Testen von Code kaum noch nach, zeit brauch :smile:

Du hast beim einlesen mit redim aus dem Array ein
ein-dimensionales array gemacht, deshalb der Fehler. Ist
gelöst …

Ich hoffe es.

Zwischenzeitlich habe ich mir mal angeschaut wie denn die textdatei aussieht nachdem mein gezeigter Code da einen dreispaltigen Datensatz eingetragen hat.

Zuerst kommt die Anzahl an Datensätzen, hier also die 1, dann vielle Nuller, dann 08 bzw. 08 00, noch unklar was die bedeutet, dann folgt zweibytig die Länge des Eintrags, dann der Eintrag , Länge des zweiten Eintrags, zweiter Eintrag usw.

Zur Laufzeit ein Steuerelement hinzufügen …
Hmm. bei AVB steht, wie das geht.

Ja, klappt prinzipiell sehr gut. Naja, je nachdem was man dann macht treten dann unerwünschte Seiteneffekte auf, bestimmte Erigniscodes werden ausgeführt und man kann sie durch nichts verhindern, EnableEvents überhaupt nicht.

Ich habe mich schon immer gerfagt, wozu das gut sein soll. Das
macht die Aktion doch nur unnötig kompliziert. Warum nicht
schon gleich einfügen und nur unsichtbar schalten?

Hast du Code der zur Entwurfszeit das Eifügen von 56 CommanBoxen übernimmt?

Private Sub Form_Load()
'Me.StartUpPosition = vbStartUpManual ’ geht nicht,
schreibgeschützt???

ja, klar. Die startposition musst du vorher festlegen oder es
Windows überlassen.

Dann sollte Win das aber in der Hilfe zur Startuppositoion dazuschreiben, daß dies nur mnauell geht.

„Gibt einen Wert zurück oder legt einen Wert fest, der die Position eines Objekts angibt, wenn es zum ersten Mal angezeigt wird.“

'Me.Top = 0 ’ klappt
'Me.Left = 0 ’ klappt

Eben. Und wenn Du erst dann die Form anzeigst, kann Dir die
Startposition egal sein.

In Vba ist es so, wenn du die Startposition nicht auf Null setzt wirken Top und Left nicht.

'Me.Width = 600 ’ klappt nicht, Breite viel kleiner
'Me.Height = 600 ’ klappt nicht, Höhe viel kleiner

600 Twips sind 40 pixel, das ist für eine Form aber sehr
klein.
Da ist noch nicht mal Platz für die Controlbox …
Oder sollten es Pixel werden? Dann Scalmode auf vpPixels und

Me.ScaleWidth = 600

Okay, funktioniert irgendwie, muß das noch eruieren.

Gruß
Reinhard

Hallo Reinhard,

Du hast die neue antwort auf Dein UP noch nicht gelesen.

hab ich schon, auch gleich probiert, klappte noch nicht.

das wundert mich. Zeig noch mal die Prozedur, die das File liest.

Zuerst kommt die Anzahl an Datensätzen, hier also die 1, dann
vielle Nuller, dann 08 bzw. 08 00, noch unklar was die
bedeutet,

Da wird wohl ein Integer oder Long stehen. Da werden für ein Integer zwei Bytes geschrieben, also keine Ziffern.

Hast du Code der zur Entwurfszeit das Eifügen von 56
CommanBoxen übernimmt?

Mit VB6 ja. Steuerelementefelder. :smile: In VBA würde ich keine 56 Commandboxen verwenden wollen.

Dann sollte Win das aber in der Hilfe zur Startuppositoion
dazuschreiben, daß dies nur mnauell geht.

„Gibt einen Wert zurück oder legt einen Wert fest, der die
Position eines Objekts angibt, wenn es zum ersten Mal
angezeigt wird.“

Meist steht da auch: ‚Zur Laufzeit schreibgeschützt.‘ Wird wohl vergessen worden sein.

Gruß Rainer

Hallo Rainer,

hab ich schon, auch gleich probiert, klappte noch nicht.

das wundert mich. Zeig noch mal die Prozedur, die das File
liest.

okay, war grad nochmal draußen bei dem schönen Wetter, liefer ich demnächst.

Was mir grad auffiel, da ich dir VB-Code basteln wollte, mein VB5.0 hat ja gar kein „ListView“-Element :frowning:
Wärest du so nett mir die Datei zu schicken die in VB6.0 hinter ListView steckt?

Und dann, bei der Suche auf ListView in den Komponenten fiel mir auf, icch kann unter Komponenten—Einfügbare Objekte z.B. ein Excel-Arbeitsblatt, auf Wunsch auch mit Makro einbauen in eine Form.
Hast du das schon mal gemacht?

Zuerst kommt die Anzahl an Datensätzen, hier also die 1, dann
vielle Nuller, dann 08 bzw. 08 00, noch unklar was die
bedeutet,

Da wird wohl ein Integer oder Long stehen. Da werden für ein
Integer zwei Bytes geschrieben, also keine Ziffern.

http://www.image-load.net/show/img/MPS02BiRht.jpg

So sieht das für mein Beispiel aus.
Ich weiß schon, daß es da in Hex abgelegt wird, meist als DoppelByte, Vorne das LowByte, hinten das HighByte, also 01 00 muß man lesen als
hex 0001, in dem Fall die 1 als Dezimal.

Und im Bild sieht man ja was ich sagte. Vorne steht die Anzahl, hier die 1, dann unklare Nullen, dann unklare 08 00, dann irgendwann die drei Elemente, erst 07 00 bzw. 17 00 für die Byteanzahl, dann die Bytes der Einträge.
Der mittlere=zweite Eintrag ist ein Datum mit Uhrzeit, also 40345,23189437984 dez umgeformt.

Hast du Code der zur Entwurfszeit das Eifügen von 56
CommanBoxen übernimmt?

Mit VB6 ja. Steuerelementefelder. :smile: In VBA würde ich keine
56 Commandboxen verwenden wollen.

Ist klar, in VB hast du quasi automatisch ein Klassenmodul über 56 CBs. Du brauchst also nicht wie in Vba (ohne eigenes Klassenmodul) 56 Ereigniscodes für die 56 CBs.

Aber nochmals, hast du Code der dir 56 Steuerelemte zur Entwurfszeit in die Form einfügt und positioniert?

Dann sollte Win das aber in der Hilfe zur Startuppositoion
dazuschreiben, daß dies nur mnauell geht.

„Gibt einen Wert zurück oder legt einen Wert fest, der die
Position eines Objekts angibt, wenn es zum ersten Mal
angezeigt wird.“

Meist steht da auch: ‚Zur Laufzeit schreibgeschützt.‘ Wird
wohl vergessen worden sein.

Und sie haben vergessen es aus der Intellisense zu nehmen?

Gruß
Reinhard

Hallo Reinhard,

okay, war grad nochmal draußen bei dem schönen Wetter, liefer
ich demnächst.

gut so! :smile:

Was mir grad auffiel, da ich dir VB-Code basteln wollte, mein
VB5.0 hat ja gar kein „ListView“-Element :frowning:
Wärest du so nett mir die Datei zu schicken die in VB6.0
hinter ListView steckt?

such ich nachher raus, Du bekommst Post.

Und dann, bei der Suche auf ListView in den Komponenten fiel
mir auf, ich kann unter Komponenten—Einfügbare Objekte z.B.
ein Excel-Arbeitsblatt, auf Wunsch auch mit Makro einbauen in
eine Form.
Hast du das schon mal gemacht?

Nein. Ich wollte mir das mal ansehen, ohne es zu brauchen. Hat nicht auf Anhieb geklappt und ich hab’s vergessen. Wurde ja nicht benötigt.

http://www.image-load.net/show/img/MPS02BiRht.jpg

So sieht das für mein Beispiel aus.
Ich weiß schon, daß es da in Hex abgelegt wird, meist als
DoppelByte, Vorne das LowByte, hinten das HighByte, also 01 00
muß man lesen als
hex 0001, in dem Fall die 1 als Dezimal.

Und im Bild sieht man ja was ich sagte. Vorne steht die
Anzahl, hier die 1, dann unklare Nullen, dann unklare 08 00,
dann irgendwann die drei Elemente, erst 07 00 bzw. 17 00 für
die Byteanzahl, dann die Bytes der Einträge.
Der mittlere=zweite Eintrag ist ein Datum mit Uhrzeit, also
40345,23189437984 dez umgeformt.

OK. Es reicht ja, wenn VB das lesen kann. :smile:

Ist klar, in VB hast du quasi automatisch ein Klassenmodul
über 56 CBs. Du brauchst also nicht wie in Vba (ohne eigenes
Klassenmodul) 56 Ereigniscodes für die 56 CBs.
Aber nochmals, hast du Code der dir 56 Steuerelemte zur
Entwurfszeit in die Form einfügt und positioniert?

Damit’s Einfach wird baue ich ein Steuerelementefeld auf und lege die nur untereinender. 64 zum Schachbrett aufbauen macht unwesentlich mehr Rechenarbeit.

Option Explicit

Private Sub Command1\_Click(Index As Integer)
 Dim i As Integer
 For i = 1 To 57
 Load Command1(i)
 Command1(i).Left = Command1(0).Left
 Command1(i).Top = Command1(i).Top + (Command1(0).Height \* i)
 Command1(i).Visible = True
 Next
End Sub

Mit VBA bekommst Du ja ohnehin nicht 56 Steuerelemente in ein Ereignis. Da würde ich ein Picture nehmen, die CommandButton ‚malen‘ (Screenshot, Button ausschneiden), auf das Ereignis im Picture reagieren und dann ausrechnen, welcher Button geklickt wurde. Richtig gemacht, sieht man das gar nicht. :smile:

Meist steht da auch: ‚Zur Laufzeit schreibgeschützt.‘ Wird
wohl vergessen worden sein.

Und sie haben vergessen es aus der Intellisense zu nehmen?

Finden sich in der Intellisense nicht alle vorhandenen Eigenschaften, unabhängig ob man sie zur Laufzeit verwenden ändern darf oder nicht?
Ich hatte an anderer Stelle die Fehlermeldung auch schon.

Gruß Rainer

Hallo Reinhard,

Wärest du so nett mir die Datei zu schicken die in VB6.0
hinter ListView steckt?

das steckt in ‚Microsoft CommonControls 6.0‘ Ein eigenes OCX gibt es für das Flexgrid nicht. Ich habe keine Ahnung, welche Datei das wäre. die ich schicken müsste. Hast Du da eine Ahnung?

Gruß Rainer

Du hast die neue antwort auf Dein UP noch nicht gelesen.

hab ich schon, auch gleich probiert, klappte noch nicht.

das wundert mich. Zeig noch mal die Prozedur, die das File
liest.

Hallo Rainer,

okay, dein Vode klappt, siehe nachstehenden Code, nehme ich gerne aber, da wird die ListBox nach dem Einlesen der Textdatei einzeln befüllt.
Gibt es da nichts daß man schreibt:
List1= arr?

Und, es ist ja später keione ListBox sondern ein ListView.

Gruß
Reinhard

Option Explicit

Dim arr() As Variant

Private Sub Command1\_Click()
Dim i As Integer, j As Integer
List1.Clear
For i = LBound(arr, 1) To UBound(arr, 1)
 For j = LBound(arr, 2) To UBound(arr, 2)
 List1.AddItem arr(i, j)
 Next
Next
End Sub

Private Sub Command2\_Click()
Open "C:\test\Test.txt" For Binary As #1
Put #1, , UBound(arr, 2)
Put #1, , arr
Close #1
End Sub

Private Sub Command3\_Click()
Dim n As Long, i, j
Open "C:\test\Test.txt" For Binary As #1
Get #1, , n
ReDim arr(1, n)
Get #1, , arr
Close #1
List1.Clear
MsgBox "leer"
'List1 = arr
For i = LBound(arr, 1) To UBound(arr, 1)
 For j = LBound(arr, 2) To UBound(arr, 2)
 List1.AddItem arr(i, j)
 Next j
Next i
End Sub

Private Sub Form\_Load()
ReDim arr(1, 1)
arr(0, 0) = "Test"
arr(0, 1) = 4
arr(1, 0) = 64000
arr(1, 1) = "Versuch"
End Sub

Flexgrid? ich schau mal owT

Hallo Reinhard,

da wird die ListBox nach dem Einlesen der
Textdatei einzeln befüllt.
Gibt es da nichts daß man schreibt:
List1= arr?

keine Ahnung, hab’ ich noch nicht gesehen.

Und, es ist ja später keione ListBox sondern ein ListView.

Wieso das? Ich hätte erwartet, daß das eine Tabelle werden soll, weil Du ja ein mehrdimensionales Feld hast. Oder geht das mit dem ListView auch? Ich kenne das Ding nur dem Namen nach. Für Tabellen nehme ich das Flexgrid. (Das gibt’s als OCX. :smile:)

Was mir jetzt so ganz allmählich durch den Kopf geht …
Wäre das nicht eher ein Fall für eine Datenbank? Dann brauchst Du auch keine Schleife um die Tabelle zu füllen. Oder auch eine Excel-Tabelle? Ich bin gerade verwirrt und habe scheinbar keine Ahnung, was Du da gerade baust. Wenn Excel passen würde, müsste ich Dir das nicht sagen.

Gruß Rainer

das steckt in ‚Microsoft CommonControls 6.0‘ Ein eigenes OCX
gibt es für das Flexgrid nicht. Ich habe keine Ahnung, welche
Datei das wäre. die ich schicken müsste. Hast Du da eine
Ahnung?

Hallo Rainer,

ich habe mal in Excel-Vba geschaut. Da gilt für

MS ListView Control version 5.0: comctl32.ocx
MS ListView Control version 6.0: mscomctl.ocx

Da ich kein rassiges Excel z.B. 2000 habe, sondern gleichzeitig verschiedene Versionen auf dem Rechner, so kann es sein daß Vers 5.0 von XL2000 stammt und Vers 6.0 von XL2007 stammt, oder Vers 5.0 von XL97 und Vers 6.0 von XL2000.

Danke erstmal, ich schaue mal wie VB 5.0 reagiert wenn ich da versuche comctl32.ocx bzw. mscomctl.ocx einzubinden.

Gruß
Reinhard

Quark, Litview meine ich.
Das gibts nicht als OCX.
Flexgrid.ocx gibt’s.