Standard Actions
Completando a estrutura das Standard Actions , gostaria de criar uma que aplicasse as atualizações no BD usando ApplyUpdates.
Pesquisando na net , encontrei um artigo de Andreas Smith que trata deste assunto , adicionando uma Action de Impressão da tela ativa.
segue o código....
You can register your own new action classes with
RegisterActions.
Here is a usefull example of a action printing the current form:
Don´t forget to add this unit to a design time package.
unit AjsStdActions;
interface
uses windows, StdActns, classes, forms;
type
TWindowPrint = class(TWindowAction)
public
constructor Create(AOwner: TComponent); override;
procedure ExecuteTarget(Target: TObject); override;
function HandlesTarget(Target: TObject): Boolean;override;
procedure UpdateTarget(Target: TObject); override;
end;
procedure Register;
implementation
uses ActnList, Dialogs, Menus;
{ TWindowPrint }
constructor TWindowPrint.Create(AOwner: TComponent);
begin
inherited;
// new default Shortcut
ShortCut := TextToShortCut(´F3´);
// new default Caption
Caption := ´Print Window´;
end;
procedure TWindowPrint.ExecuteTarget(Target: TObject);
begin
// only for testing
ShowMessage(´Printing Windows....´);
// print the current form
GetForm(Target).Print;
end;
function TWindowPrint.HandlesTarget(Target: TObject): Boolean;
begin
Result := ((Form <> nil) and (Target = Form) or
(Form = nil) and (Target is TForm));
end;
procedure TWindowPrint.UpdateTarget(Target: TObject);
begin
// override the behavior of TWindow.UpdateTarget
end;
procedure Register;
begin
// register our new action class
RegisterActions(´window´, [TWindowPrint], nil);
end;
end.
Bom , parece que funciona e fica publicado corretamente na IDE.
Agora , gostaria de estender e criar uma Action do tipo ApplyUpdates.
Tentei assim :
TDataSetApplyUpdates = class(TDataSetAction)
public
procedure ExecuteTarget(Target: TObject); override;
procedure UpdateTarget(Target: TObject); override;
end;
{ TDataSetApplyUpdates }
procedure TDataSetApplyUpdates.ExecuteTarget(Target: TObject);
begin
(GetDataSet(Target) as TClientDataset).ApplyUpdates(-1);
end;
procedure TDataSetApplyUpdates.UpdateTarget(Target: TObject);
begin
with GetDataSet(Target) do
Enabled := Active and CanModify and (State in dsEditModes)
and Modified;
end;
procedure Register;
begin
// register our new action class
RegisterActions(´Window´, [TWindowPrint], nil);
RegisterActions(´PsDataSet´, [TDataSetApplyUpdates], nil);
end;
end
Mas não consegui fazer funcionar.
Estes codigos foram adicionados a uma unit de um pacote de componentes e compilados normalmente.
As duas actions aparecem normalmente , mas a especializada em Apply dá um erro de Wrong Type.
Agradeço antecipadamente.
Pesquisando na net , encontrei um artigo de Andreas Smith que trata deste assunto , adicionando uma Action de Impressão da tela ativa.
segue o código....
You can register your own new action classes with
RegisterActions.
Here is a usefull example of a action printing the current form:
Don´t forget to add this unit to a design time package.
unit AjsStdActions;
interface
uses windows, StdActns, classes, forms;
type
TWindowPrint = class(TWindowAction)
public
constructor Create(AOwner: TComponent); override;
procedure ExecuteTarget(Target: TObject); override;
function HandlesTarget(Target: TObject): Boolean;override;
procedure UpdateTarget(Target: TObject); override;
end;
procedure Register;
implementation
uses ActnList, Dialogs, Menus;
{ TWindowPrint }
constructor TWindowPrint.Create(AOwner: TComponent);
begin
inherited;
// new default Shortcut
ShortCut := TextToShortCut(´F3´);
// new default Caption
Caption := ´Print Window´;
end;
procedure TWindowPrint.ExecuteTarget(Target: TObject);
begin
// only for testing
ShowMessage(´Printing Windows....´);
// print the current form
GetForm(Target).Print;
end;
function TWindowPrint.HandlesTarget(Target: TObject): Boolean;
begin
Result := ((Form <> nil) and (Target = Form) or
(Form = nil) and (Target is TForm));
end;
procedure TWindowPrint.UpdateTarget(Target: TObject);
begin
// override the behavior of TWindow.UpdateTarget
end;
procedure Register;
begin
// register our new action class
RegisterActions(´window´, [TWindowPrint], nil);
end;
end.
Bom , parece que funciona e fica publicado corretamente na IDE.
Agora , gostaria de estender e criar uma Action do tipo ApplyUpdates.
Tentei assim :
TDataSetApplyUpdates = class(TDataSetAction)
public
procedure ExecuteTarget(Target: TObject); override;
procedure UpdateTarget(Target: TObject); override;
end;
{ TDataSetApplyUpdates }
procedure TDataSetApplyUpdates.ExecuteTarget(Target: TObject);
begin
(GetDataSet(Target) as TClientDataset).ApplyUpdates(-1);
end;
procedure TDataSetApplyUpdates.UpdateTarget(Target: TObject);
begin
with GetDataSet(Target) do
Enabled := Active and CanModify and (State in dsEditModes)
and Modified;
end;
procedure Register;
begin
// register our new action class
RegisterActions(´Window´, [TWindowPrint], nil);
RegisterActions(´PsDataSet´, [TDataSetApplyUpdates], nil);
end;
end
Mas não consegui fazer funcionar.
Estes codigos foram adicionados a uma unit de um pacote de componentes e compilados normalmente.
As duas actions aparecem normalmente , mas a especializada em Apply dá um erro de Wrong Type.
Agradeço antecipadamente.
Emerson Azevedo
Curtidas 0