...

40 Grafische Programma's

Van Basic naar Pascal We zijn al een tijdje bezig tijdens de Pascal sessies op zaterdag met het vertalen van de Basic listings uit het boek "40 Grafische programma's in ZX Spectrum Basic" van Marcel Sutter. Ik ben bezig met een versie in Lazarus (GIthub - 40 Grafische Programmas 2) en in Delphi (Github - 40 Grafische Programmas Delphi). Ik heb nu ook een webversie gemaakt met Delphi en TMS Webcore. 40 grafische programma's. ©2023 Don Wilbrink. E-mail: RegularLabs.EmailProtector.unCloak("ep_ff835b5c");RegularLabs.EmailProtector.unCloak("ep_8189ccee", true);

18 juni 2023

...

BufDataSet Master Detail

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: RegularLabs.EmailProtector.unCloak("ep_ffc66f32", true);RegularLabs.EmailProtector.unCloak("ep_253e3ba5");RegularLabs.EmailProtector.unCloak("ep_0aea24fc", true);

30 oktober 2022

...

Lazarus programma met gebruik van BufDataset

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: RegularLabs.EmailProtector.unCloak("ep_7a886715", true);RegularLabs.EmailProtector.unCloak("ep_a62d6334");RegularLabs.EmailProtector.unCloak("ep_e70b2bea", true);

16 oktober 2022

...

Styles gebruiken bij een VCL programma

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: RegularLabs.EmailProtector.unCloak("ep_b9eebb16", true);RegularLabs.EmailProtector.unCloak("ep_58de44a6");RegularLabs.EmailProtector.unCloak("ep_ae6cbc92", true);

24 juli 2022

...

Lazarus installeren onder Linux

(Linux distributies gebaseerd op Debian zoals Ubuntu en Mint) Benodigdheden Voor het installeren van Lazarus onder Linux heb je Lazarus en Free Pascal nodig. Deze kun je downloaden vanaf de oficiële site van Lazarus: lazarus-ide.org Daar word je doorverwezen naar: sourceforge.net

9 februari 2022

Actueel

'Meld je aan voor de nieuwsbrief' van HCC!programmeren

'Abonneer je nu op de nieuwsbrief en blijf op de hoogte van onze activiteiten!'

Aanmelden