In Delphi heb ik een component gebouwd rond de Windows-functies om een wizard te tonen. Die component, TWizard, is nu helemaal klaar, maar er is een probleem. De wizard moet als een child window van mijn applicatie verschijnen, maar wordt in werkelijkheid behandeld als een aparte applicatie. Hij staat als een aparte applicatie in de taakbalk. Bovendien werken functies zoals ShowMessage niet naar behoren. Zij tonen het venster als een child van het window dat zichtbaar was voordat TWizard werd aangeroepen.
Kortom, TWizard wordt blijkbaar niet aan de window list toegevoegd. En dat terwijl TWizard precies hetzelfde doet als wat TCommonDialog, TOpenDialog en dergelijke doen:
Kortom, TWizard wordt blijkbaar niet aan de window list toegevoegd. En dat terwijl TWizard precies hetzelfde doet als wat TCommonDialog, TOpenDialog en dergelijke doen:
Delphi:
Hoe maak ik van mijn Wizard een child window?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| var ActiveWizard: TWizard = nil; function TWizard.TaskModalDialog(var Header: TPropSheetHeader): Integer; type TDialogFunc = function(var DialogData): Bool stdcall; var ActiveWindow: HWnd; WindowList: Pointer; FPUControlWord: Word; FocusState: TFocusState; begin Result := 0; try ActiveWindow := GetActiveWindow; WindowList := DisableTaskWindows(0); FocusState := SaveFocusState; try Application.HookMainWindow(MessageHook); asm // Avoid FPU control word change in NETRAP.dll, NETAPI32.dll, etc FNSTCW FPUControlWord end; try { In unit Dialogs heet de variabele ActiveWizard anders, namelijk CreationControl en is van het type TCommonDialog } ActiveWizard := Self; Result := PropertySheet(Header); finally ActiveWizard := nil; asm FNCLEX FLDCW FPUControlWord end; Application.UnhookMainWindow(MessageHook); end; finally EnableTaskWindows(WindowList); SetActiveWindow(ActiveWindow); RestoreFocusState(FocusState); end; except Application.HandleException(Self); end; end; |
Een goede grap mag vrienden kosten.

