Podstawy tworzenia ClientDataSet w obrazkach
Tworzymy nowy projekt.
Wybieramy VCL Forms Application.
Dodajemy do formy komponenty: dwa przyciski, ClientDataSet, DataSource, DBNavigator i DBGrid.
Zmieniamy nazwę ClientDataSet1 na CdsTable1 i nazwę DataSource1 na DsTable1.
Nazwę Button1 zmieniamy na BtnCreate, a własność Caption tego przycisku na Create.
Nazwę Button2 zmieniamy na BtnSave, a własność Caption tego przycisku na Save.
W Object Inspectorze wiążemy DsTable1 z CdsTable1.
W Object Inspectorze wiążemy DsTable1 z DBNavigator1
W Object Inspectorze wiążemy DsTable1 z DBGrid1.
Warto zaprojektować strukturę danych przed wprowadzeniem jej do projektu tj. przewidzieć jakie pola będą występować. W tym małym projekcie pozwoli to na używanie danych testowych bez konieczności ich wielokrotnego wprowadzania po zmianie struktury danych. Chociaż tutaj nie będzie mowy o indeksach, jest z nimi podobnie i też warto je przewidzieć wcześniej.
Klikamy prawym przyciskiem myszy na CdsTable1 i wybieramy z menu podręcznego Fields Editor (edytor pól).
W Fields Editorze klikamy prawym przyciskiem i wybieramy z menu podręcznego New Field (nowe pole).
Tworząc pole wpisujemy jego nazwę (tu: Id) i wybieramy typ (tu: AutoInc, czyli typ całkowity zwiększający wartość liczby o jeden przy każdym dopisaniu rekordu). Po tym klikamy OK.
Postępując podobnie tworzymy pole Imie typu String. W przypadku String należy dodatkowo podać maksymalną ilość znaków w stringu (tu: 20).
Jeszcze jedno pole - Wiek typu SmallInt.
Po wykonaniu powyższych działań powinniśmy otrzymać następującą strukturę.
Generujemy zdarzenia przycisków i wpisujemy do nich kod. Zapis odbywa się w formacie XML.
Możliwe są inne formaty: format binarny (dfBinary) i format XML oparty o UTF8 (dfXMLUTF8).
procedure TForm1.BtnCreateClick(Sender: TObject);
begin
CdsTable1.CreateDataSet;
end;
procedure TForm1.BtnSaveClick(Sender: TObject);
begin
{$IFDEF UNICODE}
CdsTable1.SaveToFile(GetCurrentDir + '\CdsTable1.XML', dfXML);
{$ELSE}
CdsTable1.SaveToFile(gsAppPath + 'CdsTable1.XML', dfXML);
{$ENDIF}
end;
Po uruchomieniu programu klikamy przycisk Create. To powoduje utworzenie struktury CdsTable1 w pamięci.
Save powoduje zapisanie struktury CdsTable1 w pliku XML tak, abyśmy mogli operować na danych.
Teraz potrzebne są jeszcze przyciski Load i Close. Pierwszy będzie wczytywał CdsTable1 z pliku XML wraz z danymi.
Close zamyka strukturę CdsTable1.
Po wpisaniu danych klikamy Save.
Przed zakończeniem klikamy Close.
A oto kod wszystkich zdarzeń kliknięcia przycisku.
procedure TForm1.BtnCreateClick(Sender: TObject);
begin
CdsTable1.CreateDataSet;
end;
procedure TForm1.BtnLoadClick(Sender: TObject);
begin
{$IFDEF UNICODE}
CdsTable1.LoadFromFile(GetCurrentDir + '\CdsTable1.XML');
{$ELSE}
CDS.LoadFromFile(gsAppPath + 'CdsTable1.XML');
{$ENDIF}
end;
procedure TForm1.BtnSaveClick(Sender: TObject);
begin
{$IFDEF UNICODE}
CdsTable1.SaveToFile(GetCurrentDir + '\CdsTable1.XML', dfXML);
{$ELSE}
CdsTable1.SaveToFile(gsAppPath + 'CdsTable1.XML', dfXML);
{$ENDIF}
end;
procedure TForm1.BtnCloseClick(Sender: TObject);
begin
CdsTable1.Close;
end;
W trakcie uruchamiania ze środowiska Delphi nasz plik XML powstaje w podfolderze projektu \Win32\Debug.
A tak wygląda plik XML, który został utworzony, wraz z przykładowymi danymi.
<?xml version="1.0" standalone="yes"?>
<DATAPACKET Version="2.0">
<METADATA>
<FIELDS>
<FIELD attrname="Id" fieldtype="i4" readonly="true" SUBTYPE="Autoinc"/>
<FIELD attrname="Imie" fieldtype="string" WIDTH="20"/>
<FIELD attrname="Wiek" fieldtype="i2"/>
</FIELDS>
<PARAMS CHANGE_LOG="1 0 4 2 0 4 3 0 4" AUTOINCVALUE="4"/>
</METADATA>
<ROWDATA>
<ROW RowState="4" Id="1" Imie="Tomek" Wiek="26"/>
<ROW RowState="4" Id="2" Imie="Jacek" Wiek="34"/>
<ROW RowState="4" Id="3" Imie="Anna" Wiek="31"/>
</ROWDATA>
</DATAPACKET>