Record helper

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  {  TZazPoj  }
    4
    5//je to jen příklad – musí být deklarován jako PACKED !!
    6  TZazPoj = packed record 
    7    {tohle je vychytávka na záznamy, sem ukládám, že jsou složky záznamu OK, a nemusím testovat další políčka}  
    8    FillOK: Boolean; 
    9    FVERSE: Word;
   10    {zde jsou data}
   11    FID: Integer;
   12    //stringy musí mít velikost, je to vlastně ShortString
   13    FSMLOUVA: string[20]; 
   14    FJMENO: string[48];
   15    {případně další složky nebo vnořené záznamy…}
   16  public
   17    procedure Clear;
   18  end;
   19
   20
   21
   22{ TZazPoj }
   23
   24procedure TZazPoj.Clear; //je to dobré i pro variantní záznamy
   25begin
   26  //v případě ne-PACKED nelze tímto jednoduchým způsobem mazat řetězce a pole!
   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{ TZazPojStore }
    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');


Nabízíme Delphi školení na různá témata, primárně ve Vaší firmě.

Tagy: ,

Praxe

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS