vložil Jaro Beneš
23. září 2011 20:57
Class helper je známá věc, ale co třeba takový Record helper?
Poprvé se to objevilo jako mizerně dokumentovaná věc v BDS 2006 v Delphi for .NET. A teprve následně se to propagovalo do verze Win32. Tady měl Borland zpoždění - .NET verze byla vždycky o krok napřed.
I mějme nějaký příkladný záznam např. tento:
1type
2
3
4
5
6 TZazPoj = packed record
7
8 FillOK: Boolean;
9 FVERSE: Word;
10
11 FID: Integer;
12
13 FSMLOUVA: string[20];
14 FJMENO: string[48];
15
16 public
17 procedure Clear;
18 end;
19
20
21
22
23
24procedure TZazPoj.Clear;
25begin
26
27 FillChar(Self, SizeOf(Self), 0);
28end;
Nic moc, ale na ukázku to stačí. No a zde můžeme využít nový „dodaný“ kód a z venku pozměnit funkčnost (tento kód je plně funkční, napsaný v Delphi XE, ale je to funkční i v Delphi 2007).
Helper se píše úplně stejně jako pro class, ale klíčové slůvko class se nahradí record. Pro použití, pokud samozřejmě bude v jiné unitě než deklarace záznamu (pak to nemá smysl, může to být vloženo rovnou jako metody do záznamu), musí být tento unit uveden v uses jednotky, kde má být použit, pravidla viditelnosti jsou stejná jako pro class helper.
1type
2 TZazPojStore = record helper for TZazPoj
3 public
4 procedure SaveToBlob(Table: TDataset; BlobName: string);
5 function LoadFromBlob(Table: TDataset; BlobName: string): Boolean;
6 end;
7
8
9
10function TZazPojStore.LoadFromBlob(Table: TDataset; BlobName: string): Boolean;
11var
12 blobF: TBlobField;
13 bs: TStream;
14begin
15 Result := False;
16 if Table.FieldByName(BlobName).IsBlob then
17 begin
18 blobF := Table.FieldByName(BlobName) as TBlobField;
19 bs := Table.CreateBlobStream(blobF, bmRead);
20 try
21 bs.Read(Self, SizeOf(Self));
22 Result := True;
23 finally
24 bs.Free;
25 end;
26 end;
27end;
28
29procedure TZazPojStore.SaveToBlob(Table: TDataSet; BlobName: string);
30var
31 blobF: TBlobField;
32 bs: TStream;
33begin
34 blobF := Table.FieldByName(BlobName) as TBlobField;
35 bs := Table.CreateBlobStream(blobF, bmWrite);
36 try
37 bs.Write(Self, SizeOf(Self));
38 finally
39 bs.Free;
40 end;
41end;
A použití je snadné, viz načtení i uložení (stavy pro vložení nebo editaci si jistě každý dělá po svém)
var
MUJREC: TZazPoj;
Načtení záznamu z DB
Připojení je nastaveno v tomto případě rovnou z DBGridu (ZAZPOJGrid) přes datasource na dataset.
MUJREC.LoadFromBlob(ZAZPOJGrid.DataSource.DataSet, 'DATAREC');
Uložení záznamu do DB
MUJREC.SaveToBlob(ZAZPOJGrid.DataSource.DataSet, 'DATAREC');