Die Dialogseiten laden


Wie bei einem herkömmlichen Programm, das Dialogressourcen nutzt, müssen die einzelnen Seiten natürlich auch hier geladen werden. Die Reihenfolge, in der die Seiten später im Assistenten angezeigt werden, ergibt sich dabei aus der Reihenfolge, in der Sie sie laden lassen.

Zum Laden der Seiten benötigt man ein TPropSheetPage-Record. Dessen Eigenschaften entscheiden u.a. auch über das Aussehen der jeweiligen Seite. Doch fangen wir vorn an. Das Record muss zuerst mit seiner Größe initialisiert werden

psp.dwSize            := sizeof(psp);

Danach wird die dwFlags-Membervariable mit Werten gefüllt,

WertBedeutung
PSP_DEFAULTDer Wert ist Null und bedeutet laut PSDK: "uses the default meaning for all structure members". Ich gebe zu, ich habe keine Ahnung, wie man das am sinnvollsten übersetzen soll. :o)
PSP_HIDEHEADERDie Seite besitzt keinen Header.
PSP_HASHELPEs wird ein Hilfe-Button angezeigt, wenn die Seite sichtbar ist.
PSP_USEHEADERTITLEDie Seite besitzt einen Titel im Header; üblicherweise ist dieser Text fett gedruckt.
PSP_USEHEADERSUBTITLEDie Seite besitzt zusätzlichen Text im Header; üblicherweise unter dem Header in normaler Schrift, dafür aber leicht eingerückt.

(weitere Werte finden Sie im PSDK)

Für unsere erste Dialogseite benutzen wir nur die folgenden beiden Flags:

psp.dwFlags           := PSP_DEFAULT or PSP_HIDEHEADER;

Für eine so genannte "innere Seite", die einen Header anzeigen soll, sind anstelle von PSP_HIDEHEADER PSP_USEHEADERTITLE und ggf. PSP_USEHEADERSUBTITLE zu benutzen

psp.dwFlags           := PSP_DEFAULT or PSP_USEHEADERTITLE or
  PSP_USEHEADERSUBTITLE;

wobei dann natürlich auch die entsprechenden Strings zu benutzen sind. Im Fall des Beispielprogramms werden diese aus den Ressourcen geladen:

psp.pszHeaderTitle    := MAKEINTRESOURCE(IDS_P1TITLE);
psp.pszHeaderSubTitle := MAKEINTRESOURCE(IDS_P1SUBTITLE);

Zu guter Letzt werden die Anwendungsinstanz, eine Dialogprozedur und natürlich auch die Dialogressource selbst gebraucht:

psp.hInstance         := hInstance;
psp.pfnDlgProc        := @IntroDlgProc;
psp.pszTemplate       := MAKEINTRESOURCE(IDD_INTRODLG);

Das bedeutet, dass Sie nach Möglichkeit nicht die gleiche Dialogprozedur für verschiedene Seiten benutzen sollten. Das mag sich umständlich anhören, ist aber meiner Ansicht nach letztlich auch übersichtlicher.
Nun kommt der Zusammenhang von Assistenten und Property-Sheet, denn die eigentliche Seite wird mit dem Befehl "CreatePropertySheetPage" erzeugt. Rückgabewert ist das Handle der neu erzeugten Seite, sofern die Aktion erfolgreich war. Das Interessante hierbei ist allerdings, dass wir das Handle in einem Array

var
  ahpsp : array[0..3]of HPROPSHEETPAGE;

sichern:

ahpsp[0]              := CreatePropertySheetPage(psp);

Das liegt daran, dass unser Programm ja aus mehreren Seiten besteht, die auch alle angezeigt werden sollen.