Menu

[r4761]: / branches / parsnip / Src / UOpenDialogEx.pas  Maximize  Restore  History

Download this file

174 lines (149 with data), 5.3 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
{
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/
*
* Copyright (C) 2008-2014, Peter Johnson (www.delphidabbler.com).
*
* $Rev$
* $Date$
*
* Implements an open dialogue box subclass that aligns itself over its owner
* and works correctly with the Vista task bar. Dialogue also supports help
* keywords.
}
unit UOpenDialogEx;
interface
uses
// Delphi
Classes, Dialogs, Messages, Windows,
// Project
UCommonDlg;
type
{
TOpenDialogEx:
Subclasses the Open dialogue box to enable the dialogue to align itself over
its owner and to work correctly with the Vista task bar. Also adds support
for help keywords and help button.
}
TOpenDialogEx = class(TOpenDialog)
strict private
fHelpKeyword: string; // Value of HelpKeyword property
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 dialogue
box (GetOpenFileName() in this case).
@param DialogData [in] Data describing dialogue box to be passed to
DialogFunc (in this case of type TOpenFileName).
}
function MessageHook(var Msg: TMessage): Boolean; override;
{Intercepts messages sent to the dialogue window before the dialogue'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 dialogue just before it is displayed.
}
public
constructor Create(AOwner: TComponent); override;
{Class constructor. Creates dialogue box.
@param AOwner [in] Owning component. Dialogue box will be aligned over
AOwner.
}
destructor Destroy; override;
{Class destructor. Tears down object.
}
function Execute: Boolean; override;
{Displays dialogue 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,
// Project
UDlgHelper;
{ TOpenDialogEx }
constructor TOpenDialogEx.Create(AOwner: TComponent);
{Class constructor. Creates dialogue box.
@param AOwner [in] Owning component. Dialogue box will be aligned over
AOwner.
}
begin
inherited;
fHook := TFileDlgHook.Create(Self);
end;
destructor TOpenDialogEx.Destroy;
{Class destructor. Tears down object.
}
begin
fHook.Free;
inherited;
end;
procedure TOpenDialogEx.DoShow;
{Sets up dialogue just before it is displayed.
}
begin
// Prevent task bar button press bringing owner window to foreground
TDlgHelper.SetDlgParentToOwner(Self);
inherited;
end;
function TOpenDialogEx.Execute: Boolean;
{Displays dialogue box. Ensures help button is displayed if HelpKeyword
property is set.
@return True if user OKs and False if cancels.
}
begin
if HelpKeyword <> '' then
Options := Options + [ofShowHelp]
else
Options := Options - [ofShowHelp];
Result := inherited Execute;
end;
function TOpenDialogEx.MessageHook(var Msg: TMessage): Boolean;
{Intercepts messages sent to the dialogue window before the dialogue'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) then
Result := TCommonDlgHelper.ShowHelp(HelpKeyword)
else
Result := inherited MessageHook(Msg);
end;
function TOpenDialogEx.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 dialogue box
(GetOpenFileName() in this case).
@param DialogData [in] Data describing dialogue 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.