Hallo Rainer,
Warum Reinhard Bereiche des Arrays kopieren möchte habe ich
noch nicht verstanden, das ist halt Excel, da komme ich nicht
mit.
nein, das hat mit Excel nix zu tun. Ich habe ein gefülltes Array a(5) das so im Speicher abgelegt ist (die Zahlen sind die Werte in dem Array):
1
2
3
4
5
6
Nun möchte ich es „vergrößern“ um einen Eintrag, damit es nachher so aussieht im Speicher:
1
2
3
Neuer Eintrag
4
5
6
Dazu kann ich mir ein neues leeres array b(6) anlegen, dann gehe ich das Array a einzeln durch und schaufle die ersten 3 Einträge in die drei ersten Einträge von b, dann schreibe ich den 4ten Eintrag in b hinein,dann schaufle ich die letzten 3 Einträge von a in die 3 letzten Einträge von b.
Das geht, kriegen wir alle hin.
Nun möchte ich aber auf einen Rutsch die ersten 3 Einträge in die 3 ersten Einträge von b kopieren und auch die 3 letzten Einträge von a in die 3 letzten Einträge von b kopieren. Darum geht es mir.
Trotz der Hilfe von Alex und Euch kriege ich das aber nichtmal mit einem eindimensionalen Array hin.
Die Codes von Alex habe ich stundenlang getestet in VB5.0 , ich glaube ich habe alle Varianten durchgespielt wo man strptr(), Byval, byref sowohl in den Aufrufen als auch in der API-Deklaration benutzen kann.
Ich glaube eine Lösung kann ich mir abschminken:frowning:
Denn erschwerdend kommt dazu, daß Originalarray um das es geht, wird beim Einlesen einer Textdatei erstellt, und ergibt dann ein Array von ca. a(45000,2) und alle Einträge sind Strings von unterschiedlicher Länge.
Soweit ich weiß wird das dann so im Speicher abgelegt, daß erst die 45000 Einträge mit dem Zweitindex 0 abgelegt werden, dann die nächsten 45000 Einträge mit dem zweitindex 1, dann die letzten 45000 Einträge mit dem Zweitindex 2.
Um da jetzt was in dieses Array „einzufügen“ müßte ich ja an drei Stellen etwas einfügen und die SpeicherAdressen dieser drei Stellen kenne ich ja nicht da die Einträge unterschiedliche Bytelängen haben.
Würde ich diese Speicheradressen kennen könnte ich ja mit rtlmovememory die nachfolgenden Einträge verschieben um da was einzutragen.
Theoretisch bin ich mir sehr sicher die Lösung zu kennen wie man das lösen kann.
Angenommen ich habe das Array a(45000,2) und ich möchte dort wo in a(x,1) das Wort „Huhu“ steht, etwas einfügen.
Dann muß ich nur ab der Startspeicheradresse vom Array a nach dem Wort „Huhu“ suchen.
Wenn ich jetzt die Speicheradresse des Wortes „Huhu“ kenne, nützt mir das erstmal nix.
Aber, soweit ich weiß hat jeder Eintrag in einer Arrayliste die im Speicher steht hinten eine 0 o.ä.
Wenn ich nun ermitteln könnte wieviele „Nullen“ es zzwischen der Startadresse des Array und dem Eintrag „Huhu“ gibt, so kann ich daraus berechnen, daß das Wort „Huhu“ in a(32378,1) stehen muß.
Auch durch Zählung der „Nullen“ kriege ich dann raus wo im Speicher a(32378,0) und a(32378,2) abgelegt wurde.
Dann könnte ich durch dreimaliges „Move“ das Problem lösen.
Soweit die Theorie
Ich hoffe ich konnte mich einigermaßen verständlich machen
Das Array bleibt erst mal im Speicher, Reinhard möchte es ja
an ein Listen-Steuerelement übergeben. Ob das dann so
fesichert wird, oder ob das nur eine Anzeige ist, weiß ich
nicht.
Letzlich soll die reine Ausgabe dann doch in Excel erfolgen. Aber ich wollte es ja umbauen sodaß man das Ergebnis in einer VB-Listbox sieht.
Leider weigert sich meine Listbox in VB5.0 beharrlich mehrere Spalten anzuzeigen. Hinweise auf ListView brachten mir nix, weil ich die bei VB5.0 nicht finde
Danke an alle die sich einen Kopf machen um mir da zu helfen mit dem Problem der Arrayumverschiebung.
Gruß
Reinhard