mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-22 20:39:36 +01:00
* action classes added
This commit is contained in:
parent
5a323a0f6e
commit
d9908ccaba
193
fcl/inc/action.inc
Normal file
193
fcl/inc/action.inc
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
{
|
||||||
|
$Id$
|
||||||
|
This file is part of the Free Component Library (FCL)
|
||||||
|
Copyright (c) 1999-2000 by the Free Pascal development team
|
||||||
|
|
||||||
|
See the file COPYING.FPC, included in this distribution,
|
||||||
|
for details about the copyright.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
**********************************************************************}
|
||||||
|
|
||||||
|
{****************************************************************************}
|
||||||
|
{* TBasicActionLink *}
|
||||||
|
{****************************************************************************}
|
||||||
|
|
||||||
|
constructor TBasicActionLink.Create(AClient: TObject);
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
AssignClient(AClient);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TBasicActionLink.AssignClient(AClient: TObject);
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
destructor TBasicActionLink.Destroy;
|
||||||
|
begin
|
||||||
|
if FAction <> nil then
|
||||||
|
FAction.UnRegisterChanges(Self);
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TBasicActionLink.Change;
|
||||||
|
begin
|
||||||
|
if Assigned(OnChange) then
|
||||||
|
OnChange(FAction);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TBasicActionLink.Execute(AComponent: TComponent): Boolean;
|
||||||
|
begin
|
||||||
|
FAction.ActionComponent := AComponent;
|
||||||
|
try
|
||||||
|
Result := FAction.Execute;
|
||||||
|
finally
|
||||||
|
if FAction <> nil then
|
||||||
|
FAction.ActionComponent := nil;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TBasicActionLink.SetAction(Value: TBasicAction);
|
||||||
|
begin
|
||||||
|
if Value <> FAction then
|
||||||
|
begin
|
||||||
|
if FAction <> nil then FAction.UnRegisterChanges(Self);
|
||||||
|
FAction := Value;
|
||||||
|
if Value <> nil then Value.RegisterChanges(Self);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TBasicActionLink.IsOnExecuteLinked: Boolean;
|
||||||
|
begin
|
||||||
|
Result := True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TBasicActionLink.SetOnExecute(Value: TNotifyEvent);
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TBasicActionLink.Update: Boolean;
|
||||||
|
begin
|
||||||
|
Result := FAction.Update;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{****************************************************************************}
|
||||||
|
{* TBasicAction *}
|
||||||
|
{****************************************************************************}
|
||||||
|
|
||||||
|
constructor TBasicAction.Create(AOwner: TComponent);
|
||||||
|
begin
|
||||||
|
inherited Create(AOwner);
|
||||||
|
FClients := TList.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
destructor TBasicAction.Destroy;
|
||||||
|
begin
|
||||||
|
inherited Destroy;
|
||||||
|
while FClients.Count > 0 do
|
||||||
|
UnRegisterChanges(TBasicActionLink(FClients.Last));
|
||||||
|
FClients.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TBasicAction.HandlesTarget(Target: TObject): Boolean;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TBasicAction.ExecuteTarget(Target: TObject);
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TBasicAction.UpdateTarget(Target: TObject);
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TBasicAction.Execute: Boolean;
|
||||||
|
begin
|
||||||
|
if Assigned(FOnExecute) then
|
||||||
|
begin
|
||||||
|
FOnExecute(Self);
|
||||||
|
Result := True;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Result := False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TBasicAction.Update: Boolean;
|
||||||
|
begin
|
||||||
|
if Assigned(FOnUpdate) then
|
||||||
|
begin
|
||||||
|
FOnUpdate(Self);
|
||||||
|
Result := True;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Result := False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TBasicAction.SetOnExecute(Value: TNotifyEvent);
|
||||||
|
var
|
||||||
|
I: Integer;
|
||||||
|
begin
|
||||||
|
if (TMethod(Value).Code <> TMethod(OnExecute).Code) or
|
||||||
|
(TMethod(Value).Data <> TMethod(OnExecute).Data) then
|
||||||
|
begin
|
||||||
|
for I := 0 to FClients.Count - 1 do
|
||||||
|
TBasicActionLink(FClients[I]).SetOnExecute(Value);
|
||||||
|
FOnExecute := Value;
|
||||||
|
Change;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TBasicAction.Change;
|
||||||
|
begin
|
||||||
|
if Assigned(FOnChange) then
|
||||||
|
FOnChange(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TBasicAction.RegisterChanges(Value: TBasicActionLink);
|
||||||
|
begin
|
||||||
|
Value.FAction := Self;
|
||||||
|
FClients.Add(Value);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TBasicAction.UnRegisterChanges(Value: TBasicActionLink);
|
||||||
|
var
|
||||||
|
I: Integer;
|
||||||
|
begin
|
||||||
|
for I := 0 to FClients.Count - 1 do
|
||||||
|
if TBasicActionLink(FClients[I]) = Value then
|
||||||
|
begin
|
||||||
|
Value.FAction := nil;
|
||||||
|
FClients.Delete(I);
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2002-01-06 21:54:49 peter
|
||||||
|
* action classes added
|
||||||
|
|
||||||
|
}
|
||||||
@ -69,6 +69,9 @@ var
|
|||||||
{ TComponent implementation }
|
{ TComponent implementation }
|
||||||
{$i compon.inc}
|
{$i compon.inc}
|
||||||
|
|
||||||
|
{ TBasicAction implementation }
|
||||||
|
{$i action.inc}
|
||||||
|
|
||||||
{ Class and component registration routines }
|
{ Class and component registration routines }
|
||||||
{$I cregist.inc}
|
{$I cregist.inc}
|
||||||
|
|
||||||
@ -1182,7 +1185,10 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.7 2001-04-10 23:24:51 peter
|
Revision 1.8 2002-01-06 21:54:49 peter
|
||||||
|
* action classes added
|
||||||
|
|
||||||
|
Revision 1.7 2001/04/10 23:24:51 peter
|
||||||
* merged fixes
|
* merged fixes
|
||||||
|
|
||||||
Revision 1.6 2001/03/08 19:39:25 michael
|
Revision 1.6 2001/03/08 19:39:25 michael
|
||||||
|
|||||||
@ -1139,6 +1139,8 @@ type
|
|||||||
end;
|
end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TBasicAction = class;
|
||||||
|
|
||||||
TComponent = class(TPersistent)
|
TComponent = class(TPersistent)
|
||||||
private
|
private
|
||||||
FOwner: TComponent;
|
FOwner: TComponent;
|
||||||
@ -1205,6 +1207,7 @@ type
|
|||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
procedure DestroyComponents;
|
procedure DestroyComponents;
|
||||||
procedure Destroying;
|
procedure Destroying;
|
||||||
|
function ExecuteAction(Action: TBasicAction): Boolean; dynamic;
|
||||||
function FindComponent(const AName: string): TComponent;
|
function FindComponent(const AName: string): TComponent;
|
||||||
procedure FreeNotification(AComponent: TComponent);
|
procedure FreeNotification(AComponent: TComponent);
|
||||||
procedure RemoveFreeNotification(AComponent: TComponent);
|
procedure RemoveFreeNotification(AComponent: TComponent);
|
||||||
@ -1215,6 +1218,7 @@ type
|
|||||||
procedure RemoveComponent(AComponent: TComponent);
|
procedure RemoveComponent(AComponent: TComponent);
|
||||||
function SafeCallException(ExceptObject: TObject;
|
function SafeCallException(ExceptObject: TObject;
|
||||||
ExceptAddr: Pointer): Integer; override;
|
ExceptAddr: Pointer): Integer; override;
|
||||||
|
function UpdateAction(Action: TBasicAction): Boolean; dynamic;
|
||||||
// property ComObject: IUnknown read GetComObject;
|
// property ComObject: IUnknown read GetComObject;
|
||||||
property Components[Index: Integer]: TComponent read GetComponent;
|
property Components[Index: Integer]: TComponent read GetComponent;
|
||||||
property ComponentCount: Integer read GetComponentCount;
|
property ComponentCount: Integer read GetComponentCount;
|
||||||
@ -1229,6 +1233,60 @@ type
|
|||||||
property Tag: Longint read FTag write FTag default 0;
|
property Tag: Longint read FTag write FTag default 0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TBasicActionLink }
|
||||||
|
|
||||||
|
TBasicActionLink = class(TObject)
|
||||||
|
private
|
||||||
|
FOnChange: TNotifyEvent;
|
||||||
|
protected
|
||||||
|
FAction: TBasicAction;
|
||||||
|
procedure AssignClient(AClient: TObject); virtual;
|
||||||
|
procedure Change; virtual;
|
||||||
|
function IsOnExecuteLinked: Boolean; virtual;
|
||||||
|
procedure SetAction(Value: TBasicAction); virtual;
|
||||||
|
procedure SetOnExecute(Value: TNotifyEvent); virtual;
|
||||||
|
public
|
||||||
|
constructor Create(AClient: TObject); virtual;
|
||||||
|
destructor Destroy; override;
|
||||||
|
function Execute(AComponent: TComponent{$ifndef VER1_0} = nil{$endif}): Boolean; virtual;
|
||||||
|
function Update: Boolean; virtual;
|
||||||
|
property Action: TBasicAction read FAction write SetAction;
|
||||||
|
property OnChange: TNotifyEvent read FOnChange write FOnChange;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TBasicActionLinkClass = class of TBasicActionLink;
|
||||||
|
|
||||||
|
{ TBasicAction }
|
||||||
|
|
||||||
|
TBasicAction = class(TComponent)
|
||||||
|
private
|
||||||
|
FActionComponent: TComponent;
|
||||||
|
FOnChange: TNotifyEvent;
|
||||||
|
FOnExecute: TNotifyEvent;
|
||||||
|
FOnUpdate: TNotifyEvent;
|
||||||
|
protected
|
||||||
|
FClients: TList;
|
||||||
|
procedure Change; virtual;
|
||||||
|
procedure SetOnExecute(Value: TNotifyEvent); virtual;
|
||||||
|
property OnChange: TNotifyEvent read FOnChange write FOnChange;
|
||||||
|
public
|
||||||
|
constructor Create(AOwner: TComponent); override;
|
||||||
|
destructor Destroy; override;
|
||||||
|
function HandlesTarget(Target: TObject): Boolean; virtual;
|
||||||
|
procedure UpdateTarget(Target: TObject); virtual;
|
||||||
|
procedure ExecuteTarget(Target: TObject); virtual;
|
||||||
|
function Execute: Boolean; dynamic;
|
||||||
|
procedure RegisterChanges(Value: TBasicActionLink);
|
||||||
|
procedure UnRegisterChanges(Value: TBasicActionLink);
|
||||||
|
function Update: Boolean; virtual;
|
||||||
|
property ActionComponent: TComponent read FActionComponent write FActionComponent;
|
||||||
|
property OnExecute: TNotifyEvent read FOnExecute write SetOnExecute;
|
||||||
|
property OnUpdate: TNotifyEvent read FOnUpdate write FOnUpdate;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TBasicAction class reference type }
|
||||||
|
|
||||||
|
TBasicActionClass = class of TBasicAction;
|
||||||
|
|
||||||
{ Component registration handlers }
|
{ Component registration handlers }
|
||||||
|
|
||||||
@ -1331,7 +1389,10 @@ function LineStart(Buffer, BufPos: PChar): PChar;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.17 2001-12-03 21:39:58 peter
|
Revision 1.18 2002-01-06 21:54:49 peter
|
||||||
|
* action classes added
|
||||||
|
|
||||||
|
Revision 1.17 2001/12/03 21:39:58 peter
|
||||||
* seek(int64) overload only for 1.1 compiler
|
* seek(int64) overload only for 1.1 compiler
|
||||||
|
|
||||||
Revision 1.16 2001/11/24 20:41:04 carl
|
Revision 1.16 2001/11/24 20:41:04 carl
|
||||||
|
|||||||
@ -420,6 +420,18 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TComponent.ExecuteAction(Action: TBasicAction): Boolean;
|
||||||
|
begin
|
||||||
|
if Action.HandlesTarget(Self) then
|
||||||
|
begin
|
||||||
|
Action.ExecuteTarget(Self);
|
||||||
|
Result := True;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Result := False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
Function TComponent.FindComponent(const AName: string): TComponent;
|
Function TComponent.FindComponent(const AName: string): TComponent;
|
||||||
|
|
||||||
Var I : longint;
|
Var I : longint;
|
||||||
@ -509,9 +521,24 @@ begin
|
|||||||
SafeCallException:=0;
|
SafeCallException:=0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TComponent.UpdateAction(Action: TBasicAction): Boolean;
|
||||||
|
begin
|
||||||
|
if Action.HandlesTarget(Self) then
|
||||||
|
begin
|
||||||
|
Action.UpdateTarget(Self);
|
||||||
|
Result := True;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Result := False;
|
||||||
|
end;
|
||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.4 2001-12-03 21:39:58 peter
|
Revision 1.5 2002-01-06 21:54:50 peter
|
||||||
|
* action classes added
|
||||||
|
|
||||||
|
Revision 1.4 2001/12/03 21:39:58 peter
|
||||||
* seek(int64) overload only for 1.1 compiler
|
* seek(int64) overload only for 1.1 compiler
|
||||||
|
|
||||||
Revision 1.3 2001/01/08 18:36:01 sg
|
Revision 1.3 2001/01/08 18:36:01 sg
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user