📄 jvqpagemanager.pas
字号:
if FDestroyHandles then
DormantPages;
if (FPageOwner <> nil) and (FPageHistory.Count = 0) then
begin
FPageHistory.AddPageIndex(FPageOwner.PageIndex);
end;
end;
end;
end;
procedure TJvPageManager.SetPageProxies(Value: TList);
begin
// without this method the ObjectInspector will not show the property
end;
function TJvPageManager.GetProxyIndex(const PageName: string): Integer;
var
I: Integer;
begin
Result := -1;
for I := 0 to FPageProxies.Count - 1 do
begin
if TJvPageProxy(FPageProxies.Items[I]).PageName = PageName then
begin
Result := I;
Exit;
end;
end;
end;
procedure TJvPageManager.Resync;
var
I: Integer;
Index: Integer;
NewCount: Integer;
NewProxy: TJvPageProxy;
begin
if FPageOwner = nil then
Exit;
if PageCount > FPageProxies.Count then
begin
NewCount := PageCount - FPageProxies.Count;
for I := 1 to NewCount do
begin
NewProxy := TJvPageProxy.Create(Owner);
AddProxy(NewProxy);
if Assigned(FOnCheckProxy) then
FOnCheckProxy(NewProxy);
{NewProxy.Name := GetUniqueName(NewProxy);}
NewProxy.PageName := FindFreePage;
end;
end;
for I := FPageProxies.Count - 1 downto 0 do
begin
if FPageProxies.Count > PageCount then
begin
if (TJvPageProxy(FPageProxies.Items[I]).PageName <> '') and
(FPageOwner.Pages.IndexOf(TJvPageProxy(FPageProxies.Items[I]).PageName) = -1) then
TJvPageProxy(FPageProxies.Items[I]).Free;
end
else
Break;
end;
for I := 0 to FPageProxies.Count - 1 do
if Assigned(FOnCheckProxy) then
FOnCheckProxy(TObject(FPageProxies.Items[I]));
for I := 0 to PageCount - 1 do
begin
Index := GetProxyIndex(PageNames[I]);
if Index <> -1 then
FPageProxies.Move(Index, I);
end;
end;
procedure TJvPageManager.AddProxy(Proxy: TJvPageProxy);
begin
FPageProxies.Add(Proxy);
Proxy.FPageManager := Self;
end;
procedure TJvPageManager.RemoveProxy(Proxy: TJvPageProxy);
begin
Proxy.FPageManager := nil;
FPageProxies.Remove(Proxy);
end;
procedure TJvPageManager.DestroyProxies;
var
Proxy: TJvPageProxy;
begin
while FPageProxies.Count > 0 do
begin
Proxy := FPageProxies.Last;
RemoveProxy(Proxy);
Proxy.Free;
end;
end;
function TJvPageManager.GetPageCount: Integer;
begin
Result := 0;
if FPageOwner <> nil then
Result := FPageOwner.Pages.Count;
end;
function TJvPageManager.GetPageName(Index: Integer): string;
begin
Result := '';
if (FPageOwner <> nil) and (Index < PageCount) then
Result := FPageOwner.Pages[Index];
end;
function TJvPageManager.FindFreePage: string;
var
I: Integer;
begin
Result := '';
if PageOwner <> nil then
for I := 0 to PageOwner.Pages.Count - 1 do
if GetProxyIndex(PageOwner.Pages[I]) = -1 then
begin
Result := PageOwner.Pages[I];
Exit;
end;
end;
function TJvPageManager.GetPageIndex: Integer;
begin
if PageOwner <> nil then
Result := PageOwner.PageIndex
else
Result := PageNull;
end;
procedure TJvPageManager.SetPageIndex(Value: Integer);
var
Page: TPageItem;
OldPageIndex: Integer;
begin
if PageOwner <> nil then
begin
OldPageIndex := PageOwner.PageIndex;
PageOwner.PageIndex := Value;
if DestroyHandles then
DormantPages;
if OldPageIndex <> PageOwner.PageIndex then
begin
if not FUseHistory then
begin
PageHistory.AddPageIndex(PageOwner.PageIndex);
end
else
begin
case HistoryCommand of
hcNone:
;
hcAdd:
PageHistory.AddPageIndex(PageOwner.PageIndex);
hcBack:
PageHistory.Current := PageHistory.Current - 1;
hcForward:
PageHistory.Current := PageHistory.Current + 1;
hcGoto:
;
end;
end;
end;
HistoryCommand := hcAdd;
CheckBtnEnabled;
{ update owner form help context }
if FChangeHelpContext and (Owner <> nil) and (Owner is TForm) and
((Owner as TForm).HelpContext = 0) then
begin
Page := TPageItem(PageOwner.Pages.Objects[PageIndex]);
if Page <> nil then
(Owner as TForm).HelpContext := Page.HelpContext;
end;
end;
end;
function TJvPageManager.GetNextEnabled: Boolean;
begin
Result := GetNextPageIndex(PageIndex) >= 0;
end;
function TJvPageManager.GetPriorEnabled: Boolean;
begin
Result := GetPriorPageIndex(PageIndex) >= 0;
end;
procedure TJvPageManager.NextPage;
begin
ChangePage(True);
end;
procedure TJvPageManager.PriorPage;
begin
ChangePage(False);
end;
procedure TJvPageManager.GotoHistoryPage(HistoryIndex: Integer);
var
SaveCurrent: Integer;
begin
SaveCurrent := PageHistory.Current;
HistoryCommand := hcGoto;
PageHistory.Current := HistoryIndex;
try
SetPage(PageHistory.PageIndexes[HistoryIndex], False);
finally
if PageOwner.PageIndex <> PageHistory.PageIndexes[HistoryIndex] then
PageHistory.Current := SaveCurrent;
end;
end;
procedure TJvPageManager.PageEnter(Page: Integer; Next: Boolean);
var
ProxyIndex: Integer;
begin
ProxyIndex := GetProxyIndex(PageOwner.Pages.Strings[Page]);
if ProxyIndex <> PageNull then
begin
TJvPageProxy(FPageProxies.Items[ProxyIndex]).PageEnter(Next);
end;
end;
procedure TJvPageManager.PageLeave(Page: Integer; Next: Boolean);
var
ProxyIndex: Integer;
begin
ProxyIndex := GetProxyIndex(PageOwner.Pages.Strings[Page]);
if ProxyIndex <> PageNull then
TJvPageProxy(FPageProxies.Items[ProxyIndex]).PageLeave(Next);
end;
procedure TJvPageManager.PageShow(Page: Integer; Next: Boolean);
var
ProxyIndex: Integer;
begin
ProxyIndex := GetProxyIndex(PageOwner.Pages.Strings[Page]);
if ProxyIndex <> PageNull then
TJvPageProxy(FPageProxies.Items[ProxyIndex]).PageShow(Next);
end;
procedure TJvPageManager.PageHide(Page: Integer; Next: Boolean);
var
ProxyIndex: Integer;
begin
ProxyIndex := GetProxyIndex(PageOwner.Pages.Strings[Page]);
if ProxyIndex <> PageNull then
TJvPageProxy(FPageProxies.Items[ProxyIndex]).PageHide(Next);
end;
procedure TJvPageManager.PageChanged;
begin
if Assigned(FOnPageChanged) then
FOnPageChanged(Self);
end;
function TJvPageManager.GetPriorPageIndex(Page: Integer): Integer;
begin
if not FUseHistory then
begin
if Page < 1 then
Result := PageNull
else
Result := Page - 1;
end
else
begin
if PageHistory.Current < 1 then
Result := PageNull
else
Result := PageHistory.PageIndexes[PageHistory.Current - 1];
end;
if Assigned(FOnGetPriorPage) then
FOnGetPriorPage(Page, Result);
end;
function TJvPageManager.GetNextPageIndex(Page: Integer): Integer;
begin
if not FUseHistory then
begin
if Page >= PageCount - 1 then
Result := PageNull
else
Result := Page + 1;
end
else
begin
if PageHistory.Current >= PageHistory.Count - 1 then
Result := PageNull
else
Result := PageHistory.PageIndexes[PageHistory.Current + 1];
end;
if Assigned(FOnGetNextPage) then
FOnGetNextPage(Page, Result);
end;
procedure TJvPageManager.SetPage(NewPageIndex: Integer; Next: Boolean);
var
OldPageIndex: Integer;
begin
if (NewPageIndex >= 0) and (NewPageIndex < PageCount) then
begin
OldPageIndex := PageIndex;
PageLeave(OldPageIndex, Next);
PageEnter(NewPageIndex, Next);
SetPageIndex(NewPageIndex);
if NewPageIndex = PageIndex then
begin
PageHide(OldPageIndex, Next);
PageShow(NewPageIndex, Next);
PageChanged;
end;
end;
end;
procedure TJvPageManager.ChangePage(Next: Boolean);
var
NewPageIndex: Integer;
begin
if Next then
begin
NewPageIndex := GetNextPageIndex(PageIndex);
HistoryCommand := hcForward;
end
else
begin
NewPageIndex := GetPriorPageIndex(PageIndex);
HistoryCommand := hcBack;
end;
SetPage(NewPageIndex, Next);
end;
type
TWinControlAccessProtected = class(TWinControl);
procedure TJvPageManager.DormantPages;
var
I: Integer;
begin
if Assigned(FPageOwner) then
with PageOwner do
begin
for I := 0 to Pages.Count - 1 do
if PageIndex <> I then
TWinControlAccessProtected(Pages.Objects[I]).DestroyHandle;
end;
end;
//=== { TJvPageHistory } =====================================================
constructor TJvPageHistory.Create;
begin
inherited Create;
FCurrent := -1;
FHistoryCapacity := 10;
end;
destructor TJvPageHistory.Destroy;
begin
ResetHistory;
inherited Destroy;
end;
procedure TJvPageHistory.SetCurrent(Value: Integer);
begin
if Value < 0 then
Value := -1;
if Value > Count - 1 then
Value := Count - 1;
FCurrent := Value;
end;
procedure TJvPageHistory.SetHistoryCapacity(Value: Integer);
var
I: Integer;
begin
if Value < FHistoryCapacity then
begin
for I := 0 to Count - Value do
DeleteHistoryItem(0);
end;
FHistoryCapacity := Value;
end;
function TJvPageHistory.GetPageIndex(Index: Integer): Integer;
begin
Result := TJvPageHistoryItem(Items[Index]).Index;
end;
procedure TJvPageHistory.AddPageIndex(PageIndex: Integer);
var
I: Integer;
Item: TJvPageHistoryItem;
begin
for I := Count - 1 downto Current + 1 do
DeleteHistoryItem(I);
for I := 0 to Count - HistoryCapacity do
DeleteHistoryItem(0);
if Count < HistoryCapacity then
begin
Item := TJvPageHistoryItem.Create;
Item.Index := PageIndex;
Add(Item);
end;
Current := Count - 1;
end;
procedure TJvPageHistory.DeleteHistoryItem(Index: Integer);
var
Item: TJvPageHistoryItem;
begin
if (Index >= 0) and (Index < Count) then
begin
Item := TJvPageHistoryItem(Items[Index]);
Delete(Index);
Item.Free;
if Current > Count - 1 then
Current := Count - 1;
end;
end;
procedure TJvPageHistory.ResetHistory;
var
I: Integer;
begin
for I := Count - 1 downto 0 do
DeleteHistoryItem(I);
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$RCSfile: JvQPageManager.pas,v $';
Revision: '$Revision: 1.14 $';
Date: '$Date: 2004/09/07 23:11:34 $';
LogPath: 'JVCL\run'
);
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -