Nachdem alle Dialogseiten geladen wurden, kann der Container für den Assistenten erzeugt werden. Das System übernimmt, wie bereits erwähnt, die grundlegenden Funktionen. Wir benötigen lediglich ein weiteres Record,
ZeroMemory(@psh,sizeof(psh)); psh.dwSize := sizeof(psh); psh.hInstance := hInstance;
Als übergeordnetes Fenster benutzen wir in diesem Fall Null (den Desktop). Sie könnten hier auch das Handle Ihrer Anwendung benutzen, wenn Sie den Assistenten darüber starten:
psh.hwndParent := 0;
Als nächstes weisen wir die zuvor geladenen Dialogseiten zu. Hierfür benötigen wir das Handle-Array aus dem letzten Kapitel. Es muss der Membervariablen phpage übergeben werden, die ein Pointer ist. Darum müssen wir direkt das erste Element des Array referenzieren:
psh.phpage := @ahpsp[0];
Dann geben wir an, welche Seite unsere Startseite ist (null-basierender Index), und wie viele Seiten es insgesamt gibt:
psh.nStartPage := 0; psh.nPages := 4;
Die dwFlags-Membervariable habe ich nicht grundlos an das Ende gestellt. Hier geben Sie nämlich an, welche zusätzlichen Eigenschaften benötigt werden. Einige davon sind beim Assistenten allerdings nicht notwendig, weil sie nur bei den echten Property-Sheets Sinn machen. Für ein Assistenten-artige Aussehen mit Header und Bitmaps sind die drei folgenden Stilattribute zu setzen:
psh.dwFlags := PSH_WIZARD97 or PSH_WATERMARK or PSH_HEADER;
Auf Besonderheiten und andere Flags komme ich sofort
zurück, doch im Moment ist das Laden der Bitmaps von Interesse. Wie bereits angekündigt soll unser Assistent auf der Begrüßungs- und Beendenseite eine Bitmap am linken Rand anzeigen. Dazu dient das Flag PSDH_WATERMARK. Und PSH_HEADER bedeutet, dass wir auch in den "inneren" Seiten eine Bitmap anzeigen wollen, allerdings rechts oben, im Header.
Die Bitmaps lassen sich über zwei Wege laden. Sie könnten die hbmWatermark- und hbmHeader-Variablen benutzen. Diese erwarten eine, bspw. mit "LoadBitmap" zuvor geladene Grafik. Da sich die Bitmaps ja aber sowieso in den Ressourcen befinden, ist das Laden mit den beiden Membervariablen pszbmWatermark und pszbmHeader einfacher. Hier geben Sie nämlich nur den Namen der beiden Ressourcen an:
psh.pszbmWatermark := MAKEINTRESOURCE(IDB_WATERMARKBMP); psh.pszbmHeader := MAKEINTRESOURCE(IDB_HEADERBMP);
Es bleibt eigentlich nur noch eins zu tun: wir müssen den Assistenten anzeigen.
Dazu reicht der Aufruf des Befehls "PropertySheet",
dem wir das TPropSheetHeader-Record als Parameter übergeben:
PropertySheet(psh);
Den Rest übernimmt das System. Halt! So ganz vollständig ist die Sache natürlich noch nicht. Es fehlen noch die Dialogprozeduren, auf die aber im nächsten Kapitel eingegangen werden wird. Darum können wir uns jetzt noch ein paar Attribute anschauen:
| Wert | Bedeutung |
|---|---|
PSH_WIZARD | Erzeugt einen Assistenten ohne Header und ohne die Möglichkeit, links eine Begrüßungsgrafik anzuzeigen. |
PSH_WIZARD97 | Erzeugt einen moderner wirkenden Assistenten, der Header und eine Bitmap am linken Rand enthalten kann. * |
PSH_WIZARDCONTEXTHELP | Zeigt den Kontexthilfe-Button in der Titelleiste an. |
PSH_WIZARDHASFINISH | Zeigt den "Fertig stellen"-Button bei jeder Seite an. |
PSH_HASHELP | Zeigt einen deaktivierten Hilfe-Button an. Der Button wird nur bei Seiten aktiviert, die das PSP_HASHELP-Attribut benutzen. |
PSH_AEROWIZARD | Ein recht neuer Stil für Assistenten unter Windows Vista. ** |
Achtung!
Wenn es bei Ihnen zu dem Phänomen kommt, dass die Bitmaps gekachelt werden, dann liegt dies mit hoher Wahrscheinlichkeit an einem falschen bzw. veralteten Wert für PSH_WIZARD97. Da der Funktionsumfang von der Bibliothek "comctl32.dll" abhängig ist, die durch den Internet Explorer aktualisiert werden kann, gibt es einen Wert für Systeme mit einem IE kleiner als Version 5 und einen Wert für Systeme mit dem IE>=5. Im PSDK sieht die Definition von PSH_WIZARD97 wie folgt aus:
#if (_WIN32_IE < 0x0500) #define PSH_WIZARD97 0x00002000 #else #define PSH_WIZARD97 0x01000000 #endif
Wenn Sie Delphi 5 besitzen, dann werden Sie mit diesem Problem zu tun haben, da die "CommCtrl.pas"-Unit nur den alten Wert (IE<5) enthält, wodurch folgendes entsteht:

Ich habe daher in der, dem Beispielprogramm beiliegenden Unit "CommCtrl_Fragment.pas" den neuen Wert und weitere neue Werte definiert, damit Sie obigen Darstellungsfehler verhindern und auch gleichzeitig auf neuere Attribute u.ä. zugreifen können. Der alte Wert ist in dieser Unit als PSH_WIZARD97_IE4 gespeichert.
Unter Windows Vista gibt es ein paar neue Designrichtlinien für Assistenten. Mit Hilfe des Flags PSH_AEROWIZARD wird zum Beispiel der Zurück-Button entfernt und durch einen Pfeilbutton im oberen Teil des Fensters ersetzt. Ich empfehle hierzu die Lektüre des Windows SDK bzw. der Richtlinien auf der Microsoft-Homepage.