Opzet applicatie

Dit keer ga ik een master detail relatie opzetten tussen twee BufDataSets. We beginnen weer met een nieuwe applicatie via Nieuw -> Applicatie. Vervolgens zetten we de benodigde componenten op het form en saven het project als platen.lpi en het form als main.pas. Het form ziet er dan als volgt uit.

bufdataset master detail design

Afbeelding 1: Design applicatie main form.

Vervolgens de eigenschappen van de componenten aanpassen:

Het form:

  • Name: mainForm
  • Caption: Platen overzicht

BufDataset1:

  • Name: bdsPlaten
  • FieldDefs: 3 Items toevoegen via de fieldseditor
  • IndexFieldNames: ID

BufDataset1.FieldDefs.0:

  • Name: ID
  • DataType: ftAutoInc

BufDataset1.FieldDefs.1:

  • Name: Album
  • DataType: ftString
  • Size: 30

BufDataset1.FieldDefs.2:

  • Name: Artiest
  • DataType: ftString
  • Size: 30

DataSource1:

  • Name: dsPlaten
  • Dataset: bdsPlaten

BufDataset2:

  • Name: bdsTracks
  • FieldDefs: 3 items toevoegen via de fieldseditor
  • IndexFieldNames: ID

BufDataset2.FieldDefs.0:

  • Name: ID
  • DataType: ftAutoInc

BufDataset2.FieldDefs.1:

  • Name: AlbumID
  • DataType: ftInteger

BufDataset1.FieldDefs.2:

  • Name: Tracknaam
  • DataType: ftString
  • Size: 50

DataSource2:

  • Name: dsTracks
  • Dataset: bdsTracks

DBNavigator1:

  • DataSource: dsPlaten

DBGrid1:

  • Anchors: akBottom, akLeft, akRight, akTop
  • DataSource: dsPlaten

DBNavigator2:

  • Anchors: akBottom, akLeft
  • DataSource: dsTracks

DBGrid2:

  • Anchors: akBottom, akLeft, akRight
  • DataSource: dsTracks

Code

Nog wat code voor de goede werking. Voeg onder het kopje Private van het Type TmainForm

private
  fn1: string;
  fn2: string;

toe.

Eerst de OnCreate van het form om te bepalen of de bestanden al bestaan, anders bestanden aanmaken:

procedure TmainForm.FormCreate(Sender: TObject);
begin
  fn1 := 'platen.bds';
  if FileExists(fn1) then
  begin
    bdsPlaten.LoadFromFile(fn1);
    bdsPlaten.Active := True;
    bdsPlaten.First;
  end
  else
  begin
    bdsPlaten.CreateDataset;
    bdsPlaten.Active := True;
    bdsPlaten.SaveToFile(fn1);
  end;
  fn2 := 'tracks.bds';
  if FileExists(fn2) then
  begin
    bdsTracks.LoadFromFile(fn2);
    bdsTracks.Active := True;
    bdsTracks.First;
  end
  else
  begin
    bdsTracks.CreateDataset;
    bdsTracks.Active := True;
    bdsTracks.SaveToFile(fn2);
  end;
end;

Vervolgens de OnClose event, bestanden wegschrijven en app sluiten:

procedure TmainForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  bdsPlaten.SaveToFile(fn1);
  bdsTracks.SaveToFile(fn2);
  CloseAction := caFree;
end;

De OnFilteredRecord event van bdsTracks, zorgen dat alleen de records behorende bij de gekozen plaat in de andere dataset getoond worden:

procedure TmainForm.bdsTracksFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
  Accept := (bdsTracks.FieldByName('AlbumID').AsInteger = bdsPlaten.FieldByName('ID').AsInteger);
end;

De BeforeInsert event van bdsPlaten, om de tweede grid leeg te maken bij een nieuwe plaat:

procedure TmainForm.bdsPlatenBeforeInsert(DataSet: TDataSet);
begin
  DBGrid2.Clear;
end;

De OnAfterPost events van beide BufDatasets, om te zorgen dat de tracks op de goede volgorde staan:

procedure TmainForm.bdsTracksAfterPost(DataSet: TDataSet);
begin
  bdsTracks.First;
end;

procedure TmainForm.bdsPlatenAfterPost(DataSet: TDataSet);
begin
  bdsTracks.Filtered := False;
  bdsTracks.Filtered := True;
  bdsTracks.First;
end;

De OnBeforePost event van dbsTracks om het veld AlbumID automatisch te vullen:

procedure TmainForm.bdsTracksBeforePost(DataSet: TDataSet);
begin
  bdsTracks.FieldByName('AlbumID').Value := bdsPlaten.FieldByName('ID').Value;
end;

En tot slot de OnClick event van DBNavigator1:

procedure TmainForm.DBNavigator1Click(Sender: TObject; Button: TDBNavButtonType);
begin
  if ((Button = nbNext) or (Button = nbPrior) or (Button = nbFirst) or (Button = nbLast)) then
  begin
    bdsTracks.Filtered := False;
    bdsTracks.Filtered := True;
    bdsTracks.First;
  end;
end;

Resultaat

Het resultaat is als volgt:

Draaiend programma bufdatasetmasterdetail

Afbeelding 2: Applicatie draaiend met voorbeeld data.

Sourcecode beschikbaar op mijn github pagina.

 

©2022 Don Wilbrink.

E-mail: Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken.

Een Lazarus programma met gebruik van de BufDataset in plaats van een Database als SQLite of Firebird.

Opbouw applicatie.

Start een nieuwe Lazarus applicatie:

NieuwApplicatie

Afbeelding 1: Nieuwe applicatie aanmaken.

Druk op de OK knop om een lege applicatie aan te maken. Zet vervolgens de volgende componenten op het form:

  • BufDataset van de Data Access tab
  • DataSource van de Data Access tab
  • DBNavigator van de Data Controls tab
  • DBGrid van de Data Controls tab
  • Label van de Standard tab
  • ComboBox van de Standard tab

Je zou nu het volgende in de designer moeten hebben:

DesignAdressen

Afbeelding 2: Design adressen.

Zet de volgende eigenschappen bij de BufDataset:

Druk op de drie puntjes achter FieldDefs in de Object Inspector (...) om de editor te openen. Druk 6x op de Toevoegen (+) toets om 6 velden toe te voegen zet per veld de volgende eigenschappen:

FieldDefsBufDataset

Afbeelding 3: Fielddefs van de BufDataset.

Bij ID:

  • DataType: ftAutoinc
  • Name: ID

Bij Naam:

  • DataType: ftString
  • Name: Naam
  • Size: 20

Bij Achternaam:

  • DataType: ftString
  • Name: Achternaam
  • Size: 20

Bij Straat:

  • DataType: ftString
  • Name: Straat
  • Size: 20

Bij Postcode:

  • DataType: ftString
  • Name: Postcode
  • Size: 7

Bij Woonplaats:

  • DataType: ftString
  • Name: Woonplaats
  • Size: 20

Zet  bij DataSource de eigenschap Dataset op BufDataset1.

Zet bij DBNavigator de eigenschap DataSource op DataSource1 om verbinding met de Dataset te maken.

Zet bij DBGrid de volgende eigenschappen:

  • Anchors: [akTop,akLeft,akRight,akBottom] om de grid mee te laten bewegen met het form.
  • DataSource: Datasource1 voor de verbinding met de Dataset.

Zet bij het Label de Caption op Sorteer veld:

Zet bij de ComboBox de Items als volgt: (Druk op de drie puntjes achter Items (...) om de editor te openen)

ItemsComboBox

Afbeelding 4: Editor Items ComboBox.

Zet bij het Form de Caption op Adressenlijst.

Save het project als adressen.lpi en het form als main.pas.

Code.

 Vervolgens nog wat code voor een goede werking van het programma. Eerst het OnCreate event van het form:


procedure TForm1.FormCreate(Sender: TObject);
begin

  if FileExists('adressen.bds') then
    BufDataset1.LoadFromFile('adressen.bds')
  else
  begin
    BufDataset1.CreateDataset;
    BufDataset1.SaveToFile('adressen.bds');
  end;
end;

Vervolgens het OnClose event:

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  BufDataset1.SaveToFile('adressen.bds');
  CloseAction := caFree;
end;

En vervolgens de OnChange event van de ComboBox:

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  BufDataset1.IndexFieldNames := Combobox1.Text;
  BufDataset1.First;
end;

En als laatste de OnTiltleClick event van de DBGrid om te kunnen sorteren:

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
  BufDataset1.IndexFieldNames := Column.FieldName;
  ComboBox1.Text := Column.FieldName;
  BufDataset1.First;
end;

 

Resultaat.

Het lopende programma ziet er nu als volgt uit:

DraaiendAdressen

Afbeelding 5: Draaiend programma met voorbeeld data.

Met de combobox bepaal je op welk veld gesorteerd wordt of je klikt op de veldnaam in de header van de grid. Door de ID als Autoinc veld te definiëren wordt deze automatisch gevuld met een oplopende waarde. Dit werkt hier wel en niet bij de MemDataset. De source code van dit project is te downloaden van mijn GitHub pagina.

 

©2022 Don Wilbrink.

E-mail: Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken.

Het is erg simpel om styles te gebruiken bij een VCL programma. Begin een nieuw project en zet wat componenten op een form.

DesignForm

Afbeelding 1: Form in design view.

 

Ga vervolgens naar de projectoptions (Project -> Options...) en kies daar Appearance:

ProjectOptionsDialoog

Afbeelding 2: Project Options Dialoog.

 

Zet een vinkje bij bijvoorbeeld Iceberg Classico om als default style te fungeren. Druk op Save en run het programma voor het resultaat.

GestyledForm

Afbeelding 3: Gestylde form.

 

Open Project->Options... opnieuw. Zet vinkjes bij een aantal andere styles. En druk weer op Save.

ProjectOptionsDialoog2

Afbeelding 4: Project Options Dialoog met meerdere styles gekozen.

 

Voeg onder Private in het interface gedeelte in, zodat de form class er als volgt uitziet:

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    CheckBox1: TCheckBox;
    RadioButton1: TRadioButton;
    Button1: TButton;
    ListBox1: TListBox;

    Button2: TButton;
    BitBtn1: TBitBtn;
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
  private

    { Private declarations }
    procedure StylesListRefresh;
  public
    { Public declarations }
  end;

en druk op Ctrl+Shift+c om het geraamte van de procedure te maken.Ga vervolgens naar de OnCreate van de form en vul die als volgt in en maak de procedure StylesListRefresh af:

procedure TForm1.FormCreate(Sender: TObject);
begin
  StylesListRefresh;
end;

procedure TForm1.StylesListRefresh;
var
  stylename: string;
begin
  ListBox1.Clear;

  // retrieve all the styles linked in the executable
  for stylename in TStyleManager.StyleNames do
  begin
    ListBox1.Items.Add(stylename);
  end;
end;

Klik op Button2 en verander in de Oject Inspector de Caption in Kies style en de Name in btnKies. Klik dubbel op de knop om het click event te maken en vul het als volgt in:

procedure TForm1.btnKiesClick(Sender: TObject);
begin
  TStyleManager.SetStyle(ListBox1.Items[ListBox1.ItemIndex]);
end;

Run het programma voor het resultaat:

GestyledForm2

Afbeelding 5: Form met Wedgewood Light als style gekozen.

GestyledForm3

Afbeelding 6: Aqua Graphite gekozen.

 

Zo eenvoudig werken styles bij VCL programma's. Source onder Downloads beschikbaar: VCLStylesDemo.zip

Artikel geschreven aan de hand van eerste hoofdstuk uit het boek Delphi Cookbook van Packt publishing.

DelphiCookbook

 

©2022 Don Wilbrink.

E-mail: Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken.

Met ZeosDB database componenten kun je makkelijk database programma's maken. Je kunt ze hier (sourceforge.net) downloaden. Zip file uitpakken in een folder ergens onder je home folder. Bijvoorbeeld onder Windows (folders aanmaken):

C:\Users\(gebruiker)\source\ZeosDB

of onder Linux:

/home/(gebruiker)/source/ZeosDB

Je krijgt dan (hier onder Ubuntu):

ubuntu source

Start vervolgens Lazarus op en ga naar "Package" in het menu en vervolgens klik op "Open packagefile":

menu package

Je krijgt dan dit scherm, navigeer naar de getoonde folder.

Klik op zcomponent.lpk en dan Openen onderaan:

open pakket

Je krijgt dan dit scherm, klik hier op Use:

pakketzc

En vervolgens op Installeren:

installerenzc

Druk op OK:

auto instal

Druk op Ja en Lazarus wordt gerebuild en de componenten komen beschikbaar:

laz opn

Zeos Access tab:

zeos comp

 

©2022 Don Wilbrink.

E-mail: Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken.