Menu

[r2000]: / trunk / Src / USaveDialogEx.pas  Maximize  Restore  History

Download this file

218 lines (193 with data), 7.0 kB

  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
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
{
* USaveDialogEx.pas
*
* Implements a subclass of the Save dialog box to enable the dialog to align
* itself over its owner and to work correctly with the Vista task bar. Also
* adds support for help keywords and help button.
*
* Requires that Application.ModalPopupMode <> pmNone.
*
* $Rev$
* $Date$
*
* ***** BEGIN LICENSE BLOCK *****
*
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* The Original Code is USaveDialogEx.pas
*
* The Initial Developer of the Original Code is Peter Johnson
* (http://www.delphidabbler.com/).
*
* Portions created by the Initial Developer are Copyright (C) 2008-2009 Peter
* Johnson. All Rights Reserved.
*
* Contributor(s)
* NONE
*
* ***** END LICENSE BLOCK *****
}
unit USaveDialogEx;
interface
uses
// Delphi
Classes, Dialogs, Messages, Windows,
// Project
UCommonDlg;
type
{
TSaveDialogEx:
Subclasses the Save dialog box to enable the dialog to align itself over its
owner and to work correctly with the Vista task bar. Also adds support for
help keywords and help button.
}
TSaveDialogEx = class(TSaveDialog)
strict private
fHelpKeyword: string; // Value of HelpKeyword property
fWantDefaultHelpSupport: Boolean; // Value of WantDefaultHelpSupport prop
fHook: TFileDlgHook; // Object that wraps dlg and hook function
strict protected
function TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool;
override;
{Overridden method that updates the DialogData structure to route message
processing through a custom explorer hook object.
@param DialogFunc [in] Windows function to be called to execute dialog
box (GetOpenFileName() in this case).
@param DialogData [in] Data describing dialog box to be passed to
DialogFunc (in this case of type TOpenFileName).
}
function MessageHook(var Msg: TMessage): Boolean; override;
{Intercepts messages sent to the dialog window before the dialog’s window
procedure. This implementation changes default support for the help button
to include the new HelpKeyword property and to use the program's own help
manager.
@param Msg [in/out] Specifies message. Unchanged by this method. May be
modified by inherited implementation(s).
@return False to pass message on to dilog's window procedure, True to
prevent this.
}
procedure DoShow; override;
{Sets up dialog just before it is displayed.
}
function DisplayHelp: Boolean; virtual;
{Calls program's help manager to display help if HelpKeyword property is
set.
@return True if help manager was called or False if not (i.e.HelpKeyword
not set).
}
property WantDefaultHelpSupport: Boolean
read fWantDefaultHelpSupport write fWantDefaultHelpSupport;
{Indicates if support for default help processing is required. When false
the dialog never displays the help button. When true display depends on
state of HelpKeyword property}
public
constructor Create(AOwner: TComponent); override;
{Class constructor. Creates dialog box.
@param AOwner [in] Owning component. Dialog box will be aligned over
AOwner.
}
destructor Destroy; override;
{Class destructor. Tears down object.
}
function Execute: Boolean; override;
{Displays dialog box. Ensures help button is displayed if HelpKeyword
property is set.
@return True if user OKs and False if cancels.
}
published
property HelpKeyword: string
read fHelpKeyword write fHelpKeyword;
{Help keyword used to access help topic when help button clicked}
end;
implementation
uses
// Delphi
Sysutils, Controls, CommDlg,
// Project
UDlgHelper, UHelpMgr;
{ TSaveDialogEx }
constructor TSaveDialogEx.Create(AOwner: TComponent);
{Class constructor. Creates dialog box.
@param AOwner [in] Owning component. Dialog box will be aligned over AOwner.
}
begin
inherited;
fHook := TFileDlgHook.Create(Self);
// Enable default help processing
fWantDefaultHelpSupport := True;
end;
destructor TSaveDialogEx.Destroy;
{Class destructor. Tears down object.
}
begin
FreeAndNil(fHook);
inherited;
end;
function TSaveDialogEx.DisplayHelp: Boolean;
{Calls program's help manager to display help if HelpKeyword property is set.
@return True if help manager was called or False if not (HelpKeyword not
set).
}
begin
Result := TCommonDlgHelper.ShowHelp(HelpKeyword);
end;
procedure TSaveDialogEx.DoShow;
{Sets up dialog just before it is displayed.
}
begin
// Prevent task bar button press bringing owner window to foreground
TDlgHelper.SetDlgParentToOwner(Self);
inherited;
end;
function TSaveDialogEx.Execute: Boolean;
{Displays dialog box. Ensures help button is displayed if HelpKeyword property
is set.
@return True if user OKs and False if cancels.
}
begin
if WantDefaultHelpSupport and (HelpKeyword <> '') then
Options := Options + [ofShowHelp]
else
Options := Options - [ofShowHelp];
Result := inherited Execute;
end;
function TSaveDialogEx.MessageHook(var Msg: TMessage): Boolean;
{Intercepts messages sent to the dialog window before the dialog’s window
procedure. This implementation changes default support for the help button
to include the new HelpKeyword property and to use the program's own help
manager.
@param Msg [in/out] Specifies message. Unchanged by this method. May be
modified by inherited implementation(s).
@return False to pass message on to dilog's window procedure, True to
prevent this.
}
begin
if TCommonDlgHelper.IsHelpMessage(Msg) and WantDefaultHelpSupport then
Result := DisplayHelp
else
Result := inherited MessageHook(Msg);
end;
function TSaveDialogEx.TaskModalDialog(DialogFunc: Pointer;
var DialogData): Bool;
{Overridden method that updates the DialogData structure to route message
processing through a custom explorer hook object.
@param DialogFunc [in] Windows function to be called to execute dialog box
(GetOpenFileName() in this case).
@param DialogData [in] Data describing dialog box to be passed to DialogFunc
(in this case of type TOpenFilename).
}
begin
if NewStyleControls and not (ofOldStyleDialog in Options) then
fHook.Initialise(DialogData);
// Call inherited function with (modified) data structure
Result := inherited TaskModalDialog(DialogFunc, DialogData);
end;
end.
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.