DlgListenfeldDatenfeld austricksen

Ich verwende unter Word 6.0 ein Makro, in dem ich mit der Anweisung DlgListenfeldDatenfeld eine Auswahlliste mit Daten füllen will. Die Daten stelle ich im Laufe des Makros als Zeichenkette zusammen. Leider akzeptiert die Anweisung meine Zeichenkette nicht als Parameter. Wie läßt sich dieses Problem umgehen?

Die Ursache Ihres Problems liegt in der Struktur des Datenfelds. Die Funktion DlgListenfeldDatenfeld erwartet als Parameter ein Array. Dabei handelt es sich um eine Art Zeichenkette, die aber bewußt in bestimmte Abschnitte unterteilt ist. Sie können die einzelnen Abschnitte durch Angabe eines Index ansprechen. Beispielsweise greift Array$ (0) auf das erste Element des Arrays zu.
Eine recht einfache Lösung des Problems ist es deshalb, die Teilzeichenketten für die zusammengesetzte Zeichenkette gleich in einen Array zu schreiben. Das könnte dann etwa folgendermaßen aussehen:

MyArray$(0)=ôErster Wertô
MyArray$(1)=ôZweiter Wertô
Da Sie jedoch nichts über das Zustandekommen Ihrer Zeichenkette mitgeteilt haben, kann eine so allgemeine Lösung eventuell zu Problemen führen. Deshalb stellt WIN Ihnen eine Art Add-on mit einer Routine zum Überführen der Zeichenkette in einen Array vor. Bei diesem Vorgehen sind lediglich minimale Änderungen an Ihrem Programm nötig. Sie brauchen nur einige Funktionsaufrufe zwischen dem Erzeugen der Zeichenkette und der Definition des Dialogs zu ergänzen. Um erst einmal die notwendigen Variablen zu erzeugen, ergänzen Sie Ihr Makro in der ersten Zeile um die folgende Anweisung:
Dim Shared MyArray$(10), MyString$
Damit legen Sie einen Array und eine Zeichenkette an, die für alle Routinen verfügbar sind. Dies ist die absolut simpelste Art, Daten zwischen Prozeduren zu teilen. Die Größe des Arrays ist im Beispiel auf zehn Elemente begrenzt. Bitte passen Sie die Größe an Ihre Aufgabenstellung an.
Die Zeichenkette bezeichnen Sie mit dem vorhandenen Namen. Wenn Sie die alte Kette innerhalb einer eigenen Routine ausdrücklich deklarieren, entfernen Sie diese Deklarationen, da es sonst zu Problemen kommen kann. An das Ende Ihres Listings fügen Sie die Prozedur aus dem Listing-Kasten unten ein oder kopieren sie aus der Datei DATFELD.TXT von der WIN-Monats-CD.
Solange in Ihrer Zeichenkette noch Zeichen vorhanden sind, durchläuft Word diese Schleife. Dabei prüft die Schleife zunächst die Zeichenkette auf ein zuvor beim Anlegen verwendetes Trennzeichen. Wenn Sie kein Komma verwenden, ersetzen Sie es bitte durch Ihr Trennzeichen. Wenn das Programm ein Trennzeichen findet, gibt es die Position des Zeichens, andernfalls eine Null an die Variable Pos zurück. Dann schreibt Word die Zeichen zwischen dem linken Rand der Zeichenkette und dem Trennzeichen in den Array.
Die folgende Anweisung verkürzt die Zeichenkette um den soeben ausgelesenen Teil. Um beim nächsten Durchlauf ein neues Array-Feld beschreiben zu können, ist noch die Zählvariable i um den Wert Eins zu erhöhen.
Sobald keine Trennzeichen mehr aufzufinden sind, schreibt der Else-Zweig den Rest der Zeichenkette in das aktuelle Array-Feld. Anschließend löscht er die Zeichenkette komplett.
Um die Prozedur aufzurufen, fügen Sie den Prozedurnamen zwischen der Erzeugungsroutine für die Zeichenkette und der Neudefinition des Datenfelds ein. Für die Anweisung DlgListenfeldDatenfeld verwenden Sie die Variable MyArray$() als Parameter. Damit sollte das automatische Auffüllen des Listenfelds keine Probleme mehr bereiten.
Listing: Zeichenketten in Arrays umwandeln
Sub CnvtStringToArray
i = 0
While Len (MyString$) > 0
Pos = InStr (1, MyString$, ô,ô)
If Pos <> 0 Then
MyArray$(i) = Left$(MyString$, Pos - 1)
MyString$ = Right$(MyString$, Len (MyString$) - Pos)
Else
MyArray$(i) = MyString$
MyString$ = ôô
EndIf
i = i + 1
Wend
End Sub