@@ -32,26 +32,13 @@ interface
32
32
// / </remarks>
33
33
TPreferencesDlg = class (TGenericOKDlg, INoPublicConstruct)
34
34
pcMain: TPageControl;
35
+ lbPages: TListBox;
35
36
// / <summary>OK button click event handler. Writes preference data to
36
37
// / persistent storage.</summary>
37
38
procedure btnOKClick (Sender: TObject);
38
- // / <param>Called when current tab sheet has changed. Gets newly selected
39
- // / page to re-initialise its controls from local preferences.</param>
40
- // / <remarks>This enables any pages that depend on preferences that may
41
- // / have been changed in other pages to update appropriately.</remarks>
42
- procedure pcMainChange (Sender: TObject);
43
- // / <summary>Called just before active tab sheet is changed. Causes page
44
- // / about to be deselected to update local preferences with any changes.
45
- // / </summary>
46
- // / <remarks>We do this in case another page needs to update due to changes
47
- // / made on current page.</remarks>
48
- procedure pcMainChanging (Sender: TObject; var AllowChange: Boolean);
49
- // / <summary>Handles event triggered when user clicks on one of page
50
- // / control tabs. Ensures page control has focus.</summary>
51
- // / <remarks>Without this fix, page control does not always get focus when
52
- // / a tab is clicked.</remarks>
53
- procedure pcMainMouseDown (Sender: TObject; Button: TMouseButton;
54
- Shift: TShiftState; X, Y: Integer);
39
+ // / <summary>Handles event triggered when list box is clicked or changed
40
+ // / via keyboard.</summary>
41
+ procedure lbPagesClick (Sender: TObject);
55
42
strict private
56
43
class var
57
44
// / <summary>List of registered page frames</summary>
@@ -62,6 +49,8 @@ TPreferencesDlg = class(TGenericOKDlg, INoPublicConstruct)
62
49
// / <summary>Records if main UI needs to be updated to reflect changed
63
50
// / preferences.</summary>
64
51
fUpdateUI: Boolean;
52
+ // / <summary>Records index of currently select tab/list item.</summary>
53
+ fCurrentPageIdx: Integer;
65
54
// / <summary>Creates the required frames and displays each in a tab sheet
66
55
// / within the page control.</summary>
67
56
// / <param name="FrameClasses">array of TPrefsFrameClass [in] Class
@@ -83,6 +72,10 @@ TPreferencesDlg = class(TGenericOKDlg, INoPublicConstruct)
83
72
// / <summary>Gets reference to preferences frame on currently selected tab.
84
73
// / </summary>
85
74
function GetSelectedPage : TPrefsBaseFrame;
75
+ // / <summary>Selects given tab.</summary>
76
+ // / <remarks>Stores state of tab being closed and restores state of tab
77
+ // / being opened.</remarks>
78
+ procedure SelectTab (TS: TTabSheet);
86
79
strict protected
87
80
// / <summary>Gets the help A-link keyword to be used when help button
88
81
// / clicked.</summary>
@@ -241,6 +234,10 @@ procedure TPreferencesDlg.CreatePages(
241
234
Frame.Top := 4 ;
242
235
// set tab sheet caption to frame's display name
243
236
TS.Caption := Frame.DisplayName;
237
+ TS.TabVisible := False;
238
+
239
+ // Create list box item for page
240
+ lbPages.Items.AddObject(Frame.DisplayName, TS);
244
241
end ;
245
242
end ;
246
243
@@ -313,7 +310,18 @@ procedure TPreferencesDlg.InitForm;
313
310
for TabIdx := 0 to Pred(pcMain.PageCount) do
314
311
MapTabSheetToPage(TabIdx).LoadPrefs(fLocalPrefs);
315
312
// Select first TabSheet
316
- pcMain.ActivePageIndex := 0 ;
313
+ fCurrentPageIdx := 0 ;
314
+ pcMain.ActivePageIndex := fCurrentPageIdx;
315
+ lbPages.ItemIndex := fCurrentPageIdx;
316
+ end ;
317
+
318
+ procedure TPreferencesDlg.lbPagesClick (Sender: TObject);
319
+ begin
320
+ if lbPages.ItemIndex < 0 then
321
+ Exit;
322
+ if lbPages.ItemIndex = fCurrentPageIdx then
323
+ Exit;
324
+ SelectTab(lbPages.Items.Objects[lbPages.ItemIndex] as TTabSheet)
317
325
end ;
318
326
319
327
class function TPreferencesDlg.MapClassNameToPageClass (const ClsName: string):
@@ -351,24 +359,6 @@ function TPreferencesDlg.MapTabSheetToPage(
351
359
Assert(Assigned(Result), ClassName + ' .MapTabSheetToPage: Frame not found' );
352
360
end ;
353
361
354
- procedure TPreferencesDlg.pcMainChange (Sender: TObject);
355
- begin
356
- GetSelectedPage.Activate(fLocalPrefs);
357
- end ;
358
-
359
- procedure TPreferencesDlg.pcMainChanging (Sender: TObject;
360
- var AllowChange: Boolean);
361
- begin
362
- GetSelectedPage.Deactivate(fLocalPrefs);
363
- end ;
364
-
365
- procedure TPreferencesDlg.pcMainMouseDown (Sender: TObject; Button: TMouseButton;
366
- Shift: TShiftState; X, Y: Integer);
367
- begin
368
- if htOnItem in pcMain.GetHitTestInfoAt(X, Y) then
369
- pcMain.SetFocus;
370
- end ;
371
-
372
362
class procedure TPreferencesDlg.RegisterPage (const FrameCls: TPrefsFrameClass);
373
363
var
374
364
PageIdx: Integer; // loops through all registered frames
@@ -389,5 +379,14 @@ class procedure TPreferencesDlg.RegisterPage(const FrameCls: TPrefsFrameClass);
389
379
fPages.Insert(InsIdx, FrameCls);
390
380
end ;
391
381
382
+ procedure TPreferencesDlg.SelectTab (TS: TTabSheet);
383
+ begin
384
+ Assert(Assigned(TS), ClassName + ' .SelectTab: TS is nil' );
385
+ GetSelectedPage.Deactivate(fLocalPrefs);
386
+ pcMain.ActivePage := TS;
387
+ GetSelectedPage.Activate(fLocalPrefs);
388
+ fCurrentPageIdx := pcMain.ActivePageIndex;
389
+ end ;
390
+
392
391
end .
393
392
0 commit comments