diff --git a/lcl/dialogs.pp b/lcl/dialogs.pp index b5879f43f1..4bbbff061b 100644 --- a/lcl/dialogs.pp +++ b/lcl/dialogs.pp @@ -642,7 +642,9 @@ type FOnDialogCreated: TNotifyEvent; FOnDialogDestroyed: TNotifyEvent; FOnExpanded: TNotifyEvent; + FOnHelp: TNotifyEvent; FOnHyperlinkClicked: TNotifyEvent; + FOnNavigated: TNotifyEvent; FOnRadioButtonClicked: TNotifyEvent; FOnTimer: TTaskDlgTimerEvent; FOnVerificationClicked: TNotifyEvent; @@ -674,9 +676,12 @@ type procedure DoOnExpandButtonClicked(Expanded: Boolean); dynamic; procedure DoOnTimer(TickCount: Cardinal; var Reset: Boolean); dynamic; procedure DoOnVerificationClicked(Checked: Boolean); dynamic; - //procedure DoOnHelp; dynamic; + procedure DoOnHelp; dynamic; procedure DoOnHyperlinkClicked(const AURL: string); dynamic; - //procedure DoOnNavigated; dynamic; + + //requires that a TaskDialog has pages, (see: https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.taskdialogpage.navigate?view=windowsdesktop-7.0) + //which might be implemented in a derived class, but the event handler must be in base class for Delphi compatibility. + procedure DoOnNavigated; dynamic; procedure SetRadioButtonFromRadioIndex(AIndex: Integer); public @@ -720,6 +725,8 @@ type property OnTimer: TTaskDlgTimerEvent read FOnTimer write FOnTimer; property OnRadioButtonClicked: TNotifyEvent read FOnRadioButtonClicked write FOnRadioButtonClicked; property OnHyperlinkClicked: TNotifyEvent read FOnHyperlinkClicked write FOnHyperlinkClicked; + property OnNavigated: TNotifyEvent read FOnNavigated write FOnNavigated; + property OnHelp: TNotifyEvent read FOnHelp write FOnHelp; end; TTaskDialog = class(TCustomTaskDialog) diff --git a/lcl/include/taskdialog.inc b/lcl/include/taskdialog.inc index c39ebc7a93..03ebc473d9 100644 --- a/lcl/include/taskdialog.inc +++ b/lcl/include/taskdialog.inc @@ -220,6 +220,12 @@ begin FOnVerificationClicked(Self); end; +procedure TCustomTaskDialog.DoOnHelp; +begin + if Assigned(FonHelp) then + FOnHelp(Self); +end; + procedure TCustomTaskDialog.DoOnHyperlinkClicked(const AURL: string); begin FURL := AURL; @@ -227,6 +233,12 @@ begin FOnHyperlinkClicked(Self); end; +procedure TCustomTaskDialog.DoOnNavigated; +begin + if Assigned(FOnNavigated) then + FOnNavigated(Self); +end; + procedure TCustomTaskDialog.SetRadioButtonFromRadioIndex(AIndex: Integer); begin if (AIndex >= TaskDialogFirstRadioButtonIndex) and (AIndex-TaskDialogFirstRadioButtonIndex < RadioButtons.Count) then diff --git a/lcl/interfaces/win32/win32wsdialogs.pp b/lcl/interfaces/win32/win32wsdialogs.pp index 23c9fb8bc2..9475844cb3 100644 --- a/lcl/interfaces/win32/win32wsdialogs.pp +++ b/lcl/interfaces/win32/win32wsdialogs.pp @@ -1721,7 +1721,11 @@ begin lParam: Must be zero. Return value: The return value is ignored. } - if IsConsole then writeln('ToDo: implement OnNavigated'); + Assert((Dlg is TCustomTaskDialog),'TaskDialogCallbackProc: dwRefData is NOT a TCustomTaskDialog'); + {$PUSH} + {$ObjectChecks OFF} + TTaskDialogAccess(Dlg).DoOnNavigated; + {$POP} end; TDN_TIMER: begin @@ -1769,7 +1773,11 @@ begin end; TDN_HELP: begin - if IsConsole then writeln('ToDo: implement TDN_HELP??'); + Assert((Dlg is TCustomTaskDialog),'TaskDialogCallbackProc: dwRefData is NOT a TCustomTaskDialog'); + {$PUSH} + {$ObjectChecks OFF} + TTaskDialogAccess(Dlg).DoOnHelp; + {$POP} end; end; end; diff --git a/lcl/taskdlgemulation.pp b/lcl/taskdlgemulation.pp index ec4f75a7c0..4fa5f4aff5 100644 --- a/lcl/taskdlgemulation.pp +++ b/lcl/taskdlgemulation.pp @@ -67,6 +67,7 @@ type procedure OnRadioButtonClick(Sender: TObject); procedure OnVerifyClicked(Sender: TObject); procedure OnTimer(Sender: TObject); + procedure DoOnHelp; protected procedure SetupControls; @@ -700,6 +701,14 @@ begin ResetTimer; end; +procedure TLCLTaskDialog.DoOnHelp; +begin + {$PUSH} + {$ObjectChecks OFF} + {%H-}TTaskDialogAccess(FDlg).DoOnHelp; + {$POP} +end; + procedure TLCLTaskDialog.OnRadioButtonClick(Sender: TObject); var ButtonID: Integer; @@ -957,7 +966,11 @@ begin if (Key = VK_F4) and (ssAlt in Shift) then//IMPORTANT: native task dialog blocks Alt+F4 to close the dialog -> we have to block it as well Key := 0; end; - + if (Key = VK_F1) and (Shift = []) then + begin + Key := 0; + DoOnHelp; + end; inherited KeyDown(Key, Shift); end;