Componentes.Terceros.RemObj.../internal/6.0.43.801/1/RemObjects Samples/Data Abstract for Delphi/Refresh Update Data/fClientForm.pas
2010-01-29 16:17:43 +00:00

158 lines
4.5 KiB
ObjectPascal

unit fClientForm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
uROClient, uROClientIntf, uRORemoteService, uROBinMessage, Grids, DBGrids,
uROPoweredByRemObjectsButton, uDAPoweredByDataAbstractButton, ExtCtrls,
DASampleLibrary_Intf, uROTypes;
type
TClientForm = class(TForm, IUpdateEvent)
Panel1: TPanel;
DAPoweredByDataAbstractButton1: TDAPoweredByDataAbstractButton;
btLoad: TButton;
btEdit: TButton;
dgData: TDBGrid;
procedure FormCreate(Sender: TObject);
procedure btLoadClick(Sender: TObject);
procedure btEditClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure dgDataDblClick(Sender: TObject);
private
{ Private declarations }
fService: IDASampleService;
procedure SetCurrentRowLock(aState: boolean);
procedure WaitChannelFree;
procedure OnUpdateBlock(const pkFields: AnsiString; const senderGuid: Guid);
procedure OnUpdateUnblock(const pkField: AnsiString; const senderGuid: Guid; const isReadRow: Boolean);
procedure OnUpdateAllBlock(const pkFields: AnsiStringArray);
public
{ Public declarations }
end;
var
ClientForm: TClientForm;
implementation
uses
fClientDataModule, fEditClient, uROClasses, uDAInterfaces, Variants;
{$R *.dfm}
procedure TClientForm.btEditClick(Sender: TObject);
var
editForm: TfmEditClient;
begin
if ClientDataModule.tbl_Clients.RecordCount > 0 then begin
if dgData.DataSource.DataSet.FieldByName('Locked').AsString <> 'X' then begin
editForm := TfmEditClient.Create(self);
try
SetCurrentRowLock(true);
if editForm.EditClient(dgData.DataSource)
then with ClientDataModule do RemoteDataAdapter.ApplyUpdates([tbl_Clients]);
SetCurrentRowLock(false);
finally
editForm.Free;
end;
end
else ShowMessage('Can''t edit - record locked.');
end;
end;
procedure TClientForm.btLoadClick(Sender: TObject);
begin
with ClientDataModule do begin
tbl_Clients.ClearRows(true);
WaitChannelFree;
RemoteDataAdapter.Fill([tbl_Clients]);
end;
fService.BlockSetOfRows;
end;
procedure TClientForm.FormCreate(Sender: TObject);
begin
Application.Title := ClientForm.Caption;
with ClientDataModule do begin
// TODO: Until until DynamicRequest bug fixed
//Login;
fService := RemoteService as IDASampleService;
fService.Login(PlatformEnum_peWindowsDelphi, Caption);
EventReceiver.RegisterEventHandler(EID_UpdateEvent, self);
EventReceiver.Active := true;
fService.Subscribe(true);
end;
end;
procedure TClientForm.FormDestroy(Sender: TObject);
begin
WaitChannelFree;
with ClientDataModule do begin
EventReceiver.Active := false;
fService.Subscribe(false);
EventReceiver.UnRegisterEventHandler(self);
end;
end;
procedure TClientForm.OnUpdateAllBlock(const pkFields: AnsiStringArray);
var
i: integer;
begin
for i := 0 to pkFields.Count - 1 do OnUpdateBlock(pkFields.Items[i], '');
end;
procedure TClientForm.OnUpdateBlock(const pkFields: AnsiString;
const senderGuid: Guid);
begin
with ClientDataModule do begin
LockRow(AnsiStringToWideString(pkFields));
end;
end;
procedure TClientForm.OnUpdateUnblock(const pkField: AnsiString;
const senderGuid: Guid; const isReadRow: Boolean);
var
wb: TDAWhereBuilder;
exp: TDAWhereExpression;
expArr: array of TDAWhereExpression;
begin
with ClientDataModule do begin
UnlockRow(AnsiStringToWideString(pkField));
if isReadRow then begin
wb := TDAWhereBuilder.Create;
exp := wb.NewBinaryExpression(
wb.NewField(tbl_Clients.LogicalName, 'ClientId'),
wb.NewConstant(pkField, datGuid),
dboEqual);
SetLength(expArr, 1);
expArr[0] := exp;
RemoteDataAdapter.Fill([tbl_Clients], expArr, true, false, false);
wb.Free;
end;
end;
end;
procedure TClientForm.SetCurrentRowLock(aState: boolean);
var
id: {$IFDEF UNICODE}AnsiString{$ELSE}string{$ENDIF};
begin
id := dgData.DataSource.DataSet.FieldByName('ClientId').{$IFDEF UNICODE}AsAnsiString{$ELSE}AsString{$ENDIF};
WaitChannelFree;
if aState then fService.BlockRow(id)
else fService.UnblockRow(id, true);
end;
procedure TClientForm.dgDataDblClick(Sender: TObject);
begin
btEdit.Click;
end;
procedure TClientForm.WaitChannelFree;
begin
repeat until not ClientDataModule.Channel.Busy;
end;
end.