📄 sadapter.pas
字号:
unit sAdapter;
{$I sDefs.inc}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
sConst, sCommondata{, sPanel};
type
{$IFNDEF NOTFORHELP}
TAddItemEvent = procedure(Item: TComponent; var CanBeAdded: boolean; var SkinSection: string) of object;
{$ENDIF} // NOTFORHELP
TsCtrlAdapter = class;
TacAdapterItem = class(TObject)
public
Ctrl : TWinControl;
SkinData : TsCommonData;
OldFontColor : integer;
OldWndProc: TWndMethod;
Adapter : TsCtrlAdapter;
constructor Create; virtual;
destructor Destroy; override;
procedure BeforeDelete; virtual;
end;
TacAdapterItems = array of TacAdapterItem;
TsCtrlAdapter = class(TComponent)
{$IFNDEF NOTFORHELP}
private
FAutoSearch: boolean;
FOnAddItem: TAddItemEvent;
public
CtrlClass : TsCtrlClass;
DefaultSection : string;
Items : TacAdapterItems;
function IsControlSupported(Control : TComponent) : boolean; virtual;
function Count : integer;
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
procedure DoHook(Index : integer; Ctrl : TWinControl); virtual;
function GetItem(Index : integer) : TacAdapterItem; virtual;
function GetCommonData(Index : integer) : TsCommonData; virtual;
procedure HookAll;
function IndexOf(Ctrl : TWinControl) : integer;
procedure Loaded; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
function Form: TScrollingWinControl;
{$ENDIF} // NOTFORHELP
procedure AddAllItems(OwnerCtrl : TWinControl = nil);
procedure AddNewItem(Ctrl : TWinControl); overload; virtual;
procedure AddNewItem(Ctrl : TWinControl; const SkinSection : string); overload; virtual;
procedure RemoveItem(Index : integer); virtual;
procedure RemoveAllItems;
published
property AutoSearch : boolean read FAutoSearch write FAutoSearch default True;
property OnAddItem: TAddItemEvent read FOnAddItem write FOnAddItem;
end;
implementation
uses math, sSkinProps, sVCLUtils;
{ TsCtrlAdapter }
procedure TsCtrlAdapter.AddNewItem(Ctrl: TWinControl); begin end;
procedure TsCtrlAdapter.AddNewItem(Ctrl: TWinControl; const SkinSection: string); begin end;
procedure TsCtrlAdapter.AddAllItems(OwnerCtrl : TWinControl = nil);
var
i : integer;
CanAdd : boolean;
sSection : string;
Owner : TWinControl;
begin
if OwnerCtrl = nil then Owner := Form else Owner := OwnerCtrl;
if Owner = nil then Exit;
for i := 0 to Owner.ComponentCount - 1 do begin
if IsControlSupported(Owner.Components[i]) then begin
CanAdd := True; sSection := s_Edit;
if Assigned(FOnAddItem) and not (csDesigning in ComponentState) then FOnAddItem(Owner.Components[i], CanAdd, sSection);
if CanAdd then AddNewItem(TWinControl(Owner.Components[i]), sSection);
end
else if (Owner.Components[i] is TCustomFrame) then AddAllItems(TWinControl(Owner.Components[i])); // Recursion
end;
end;
function TsCtrlAdapter.Count: integer;
begin
Result := Length(Items);
end;
constructor TsCtrlAdapter.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FAutoSearch := True;
end;
destructor TsCtrlAdapter.Destroy;
begin
RemoveAllItems;
inherited Destroy;
end;
procedure TsCtrlAdapter.DoHook(Index: integer; Ctrl: TWinControl); begin end;
function TsCtrlAdapter.GetCommonData(Index: integer): TsCommonData;
begin
Result := nil;
end;
function TsCtrlAdapter.Form: TScrollingWinControl;
begin
Result := nil;
if (csDesigning in ComponentState) then begin
if GetOwnerFrame(Self) = nil then Result := TScrollingWinControl(GetOwnerForm(Self));
end
else begin
Result := TScrollingWinControl(GetOwnerFrame(Self));
if (Result = nil) then
Result := TScrollingWinControl(GetOwnerForm(Self));
end;
end;
function TsCtrlAdapter.GetItem(Index: integer) : TacAdapterItem;
begin
Result := nil;
end;
procedure TsCtrlAdapter.HookAll;
begin
if Form <> nil then AddAllItems;
end;
function TsCtrlAdapter.IndexOf(Ctrl : TWinControl): integer;
var
i : integer;
begin
Result := -1;
for i := 0 to Length(Items) - 1 do if Items[i].Ctrl = Ctrl then begin
Result := i;
Exit;
end;
end;
procedure TsCtrlAdapter.Loaded;
begin
inherited;
if not (csDesigning in ComponentState) then AddAllItems;// else HookAll;
end;
procedure TsCtrlAdapter.Notification(AComponent: TComponent; Operation: TOperation);
var
i : integer;
Item : TacAdapterItem;
begin
inherited Notification(AComponent, Operation);
if (csDestroying in ComponentState) or (csDestroying in AComponent.ComponentState) or (csDesigning in ComponentState) then Exit;
case Operation of
opInsert : if IsControlSupported(AComponent) then AddNewItem(TWinControl(AComponent));
opRemove : if IsControlSupported(AComponent) then for i := 0 to Count - 1 do begin
Item := GetItem(i);
if (Item <> nil) and (Item.Ctrl = AComponent) then begin
RemoveItem(i);
Exit;
end;
end;
end;
end;
procedure TsCtrlAdapter.RemoveItem(Index: integer);
var
i, l : integer;
begin
if (Index < Count) then begin
Items[Index].BeforeDelete;
FreeAndNil(Items[Index]);
i := Index;
l := Length(Items) - 1;
while i <= l - 1 do begin
Items[i] := Items[i + 1];
inc(i);
end;
SetLength(Items, l - 1);
end;
end;
function TsCtrlAdapter.IsControlSupported(Control: TComponent): boolean;
begin
Result := Control is CtrlClass;
end;
procedure TsCtrlAdapter.RemoveAllItems;
var
l : integer;
begin
while Length(Items) > 0 do begin
l := Length(Items);
Items[l - 1].BeforeDelete;
FreeAndNil(Items[l - 1]);
SetLength(Items, l - 1);
end;
end;
{ TacAdapterItem }
constructor TacAdapterItem.Create;
begin
inherited Create;
OldFontColor := -1;
SkinData := TsCommonData.Create(Self, True);
SkinData.COC := COC_TsAdapter;
end;
procedure TacAdapterItem.BeforeDelete; begin end;
destructor TacAdapterItem.Destroy;
begin
FreeAndNil(SkinData);
inherited Destroy;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -