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.
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:
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.
- Details
- Hits: 311
Een Lazarus programma met gebruik van de BufDataset in plaats van een Database als SQLite of Firebird.
Opbouw applicatie.
Start een nieuwe Lazarus applicatie:
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:
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:
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)
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:
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.
- Details
- Hits: 222
Het is erg simpel om styles te gebruiken bij een VCL programma. Begin een nieuw project en zet wat componenten op een form.
Afbeelding 1: Form in design view.
Ga vervolgens naar de projectoptions (Project -> Options...) en kies daar Appearance:
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.
Afbeelding 3: Gestylde form.
Open Project->Options... opnieuw. Zet vinkjes bij een aantal andere styles. En druk weer op Save.
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:
Afbeelding 5: Form met Wedgewood Light als style gekozen.
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.
©2022 Don Wilbrink.
E-mail: Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken.
- Details
- Hits: 299
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):
Start vervolgens Lazarus op en ga naar "Package" in het menu en vervolgens klik op "Open packagefile":
Je krijgt dan dit scherm, navigeer naar de getoonde folder.
Klik op zcomponent.lpk en dan Openen onderaan:
Je krijgt dan dit scherm, klik hier op Use:
En vervolgens op Installeren:
Druk op OK:
Druk op Ja en Lazarus wordt gerebuild en de componenten komen beschikbaar:
Zeos Access tab:
©2022 Don Wilbrink.
E-mail: Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken.
- Details
- Hits: 558