Alphabetisch sortierte Schriftbildvorschau

Ich benutze das in WIN 11/97 von Ralf Nebelo vorgestellte Makro zur Vorschau auf die Auswirkung eines Schriftartenwechsels. Leider sind die im Dialog angezeigten Schriftarten nicht alphabetisch sortiert. Meine Versuche, eine Sortierung zu erzeugen, blieben leider fruchtlos. Gibt es dennoch einen Weg, die verschiedenen Schriftarten in alphabetischer Reihenfolge anzuzeigen?

Auch wenn Microsoft bei Listenobjekten in Visual Basic auf eine Methode zum Sortieren der Listeneinträge verzichtet, steht es Ihnen frei, die Sortierung selbst in die Hand zu nehmen. Sie können das mit ein paar Änderungen der Prozedur UserForm_Initialize erreichen. Zunächst lesen Sie die unsortierten Schriftartennamen in ein zusätzliches Datenfeld und nicht gleich in das Listenfeld. Das Datenfeld sortieren Sie dann mit Hilfe eines geeigneten internen Sortierverfahrens.
Das WIN-Team hat für diese Sortieraufgabe Selection Sort gewählt, da diese Methode leicht verständlich ist und bei konstanten Durchschnittswerten stabil arbeitet. Anschließend übernehmen Sie das sortierte Datenfeld in das Listenfeld.
Um das Datenfeld anzulegen, ergänzen Sie die Dim-Anweisung in Zeile drei. Da Sie nicht wissen können, wie viele Schriftarten installiert sind, bleiben die Klammern hinter dem Bezeichner A zunächst leer. Eine Dim- Anweisung funktioniert aber nur mit festen Vorgaben, weshalb Sie die Größendefinition für das Datenfeld in den Programmablauf verschieben. Diese Neudefinition – siehe Zeile 13 – muß stattfinden, bevor Sie die Schriftarten in das Datenfeld einlesen.
Die Anweisung ReDim legt die Größe des Datenfelds auf die Anzahl verfügbarer Schriften fest. Die Korrektur mit dem Wert -2 resultiert aus der bei Null beginnenden Indizierung des Datenfelds, denn dabei soll die bereits verwendete Schriftart nicht noch einmal auswählbar sein. In den anschließenden Zeilen 14 bis 20 schreibt Word jede installierte Schriftart in das Datenfeld. Dabei bezeichnet die Laufvariable i die Anzahl der Durchläufe und gleichzeitig den aktuellen Index des Datenfelds. Falls die bereits benutzte Schriftart auftaucht, erhöht die Routine den Datenfeldindex nicht, so daß der folgende Durchlauf den letzten Eintrag überschreibt.
Jetzt ist das Datenfeld bereit für die Sortierung. Die Zeilen 22 bis 36 implementieren den Selection Sort. Beginnend beim ersten Datenfeldeintrag vergleicht die Routine nun alle Werte mit dem ersten. Sobald sie einen Wert findet, der kleiner als der Ausgangswert A(i) ist, findet ein Austausch der beiden Werte statt. Dadurch ist gewährleistet, daß am Ende des ersten Durchlaufs garantiert der kleinste Wert im ersten Element steht. Das Spiel wiederholt sich mit dem zweiten Datenfeldelement als Vergleichswert und so weiter, bis das Datenfeld komplett durchlaufen ist. Dabei fallen N2/2 Vergleiche und maximal N Austauschoperationen an. Für 100 installierte Schriftarten ergibt das 5 000 Vergleiche und maximal 100 Tauschoperationen.
Abschließend ist noch das aufgeräumte Datenfeld in das Listenfeld zu übertragen. Dazu verwenden Sie die bereits aus dem Makro bekannte Routine, wie in den Zeilen 38 bis 43 gezeigt.
Um die alphabetische Sortierung zu erhalten, müssen Sie dafür sorgen, daß Word die Vergleiche auch auf der richtigen Basis durchführt. Word vergleicht Texte typischerweise auf Basis der ASCII-Werte. Dabei ist allerdings der für den Großbuchstaben T kleiner als der für den Kleinbuchstaben a und taucht deshalb vorher in der Liste auf. Um die landesspezifische lexikalische Sortierung zu erhalten, geben Sie im Deklarationsbereich des Moduls noch die Anweisung Option Compare Text.
Beachten Sie, daß diese Anweisung die Sortierung für das gesamte Modul regelt. Sollten Sie die binäre Sortierreihenfolge in diesem Modul ebenfalls benötigen, kann dies zu Konflikten führen. In der Datei FRMSCHRIFTPROBE.FRM ist das im Kasten auf Seite 191 dargestellte Makro als Formulardatei auf der WIN-Monats-CD abgelegt. Um es zu laden, starten Sie den VB-Editor und führen Datei – Datei importieren aus. Falls Sie bereits ein Makro oder Formular mit dieser Bezeichnung geladen haben, sollten Sie es vorher schließen.

Makro-Listing: Alphabetisch sortierte Schriftbildvorschau
Private Sub UserForm_Initialize ()¶
Dim AktFont as Variant¶
Dim A () As Variant¶
Dim i, j, KleinerWert As Integer¶
If Selection.Type = wdSelectionNormal Then¶
Selection.Copy¶
With Me¶
.Caption = äSchriftprobeô¶
.StartupPosition = 0¶
.Left = Application.Width - .Width¶
End With¶
æ****************Daten in Array schreiben****************¶
ReDim A (Application.PortraitFontNames.Count - 2) As Variant¶
i = 0¶
For Each AktFont In Application.FontNames¶
A (i) = AktFont¶
If Not Selection.Font.Name = AktFont Then¶
i = i + 1¶
End If¶
Next¶
æ****************Daten im Array sortieren****************¶
i = 0¶
While i < Application.PortraitFontNames.Count - 2¶
j = i + 1¶
While j <= Application.PortraitFontNames.Count - 2¶
KleinerWert = i¶
If A (j) < A (KleinerWert) Then¶
KleinerWert = j¶
Speicher = A (KleinerWert)¶
A (KleinerWert) = A (i)¶
A (i) = Speicher¶
End If¶
j = j + 1¶
Wend¶
i = i + 1¶
Wend¶
æ****************Daten aus Array auslesen****************¶
With ListBox1¶
For i = 0 To Application.PortraitFontNames.Count - 2¶
.AddItem A (i)¶
Next¶
.SetFocus¶
End With¶
Else¶
MsgBox ôKein Text markiertô¶
End¶
End If¶
End Sub¶