Código
//**** autoria de Paulo R. Maitan - pmaitan@ig.com.br
//
//**** No DataModule use os eventos do IBDataset
//**** AfterDelete e AfterPost para incrementar a Tag do IBDataset desta maneira
procedure TDataModule.IBDatasetAfterDelete(DataSet: TDataSet);
begin
IBDataset.Tag := IBDataset.Tag + 1;
end;
procedure TDataModule.IBDatasetAfterPost(DataSet: TDataSet);
begin
IBReceber.Tag := IBReceber.Tag + 1;
end;
------------------------------------------------------------------------------
//**** Formulario de manutenção::..
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DBCtrls, StdCtrls, Mask, Buttons;
type
TForm1 = class(TForm)
Label2: TLabel;
DBEdit2: TDBEdit;
Label3: TLabel;
DBEdit3: TDBEdit;
Label4: TLabel;
DBEdit4: TDBEdit;
DBNavigator1: TDBNavigator;
btCommit: TBitBtn;
btRollback: TBitBtn;
Label1: TLabel;
DBText1: TDBText;
Timer1: TTimer;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btCommitClick(Sender: TObject);
procedure btRollbackClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses UnitDM;
{$R *.dfm}
//**** Abre a Tabela
procedure TForm1.FormShow(Sender: TObject);
begin
DataModule.IBDataset.Open;
end;
//**** Fecha a tabala
procedure TForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
DataModule.IBDataset.Close;
end;
//**** Salva os dados definitivamente e mantem o ponteiro do registro na mesma posição
procedure TForm1.btCommitClick(Sender: TObject);
var
CurRec: Pointer;
begin
with DataModule.IBDataset do
begin
CurRec := GetBookmark;
DisableControls;
try
dm.IBTransaction1.Commit;
Tag := 0;
finally
Open;
GotoBookmark(CurRec);
FreeBookmark(CurRec);
EnableControls;
end;
Refresh;
end;
end;
//**** Cancela a gravação e mantem o ponteiro do registro na mesma posição
procedure TForm1.btRollbackClick(Sender: TObject);
var
CurRec: Pointer;
begin
with DataModule.IBDataset do
begin
CurRec := GetBookmark;
DisableControls;
try
dm.IBTransaction1.Rollback;
Tag := 0;
finally
Open;
GotoBookmark(CurRec);
FreeBookmark(CurRec);
EnableControls;
end;
Refresh;
end;
end;
//*** Liga e desliga os botões
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if DataModule.IBDataset.Tag = 0 then
begin
btCommit.Enabled := false;
btRollback.Enabled := false;
end
else
begin
btCommit.Enabled := true;
btRollback.Enabled := true;
end;
end;
//**** Se o Tag for maior que 0 (zero), é porque ouve deleção ou gravação de
//**** algum dado
//**** então você e questionado ao sair
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if DataModule.IBDataset.Tag > 0 then
begin
Case MessageBox(Application.Handle, 'Existe dados para serem gravados!' +
#13 + 'Gravar os dados?','Saindo...', MB_YESNOCANCEL + MB_ICONQUESTION +
MB_DEFBUTTON1) of
idYes:
begin
btCommitClick(Sender); //**** sai gravando
Self.Close;
end;
idNo:
begin
btRollbackClick(Sender); //**** sai cancelando
Self.Close;
end;
idCancel: //**** não sai
Abort;
end;
end
else
self.close; //**** não existe dados sai numa boa
end;
end.
Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009