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.