unit setdemo_main; {$mode objfpc}{$H+} interface uses Buttons, Forms, Controls, Graphics, Dialogs, ExtCtrls, dualdigitsset, SysUtils, Classes, strutils; type TButtonArr = array[TDigits] of TSpeedButton; { TMainForm } TMainForm = class(TForm) editSetA: TLabeledEdit; editSetZ: TLabeledEdit; editUnion: TLabeledEdit; editIntersection: TLabeledEdit; editSymmetricDiff: TLabeledEdit; editDiffAZ: TLabeledEdit; editDiffZA: TLabeledEdit; pnlA: TPanel; pnlResultSets: TPanel; pnlZ: TPanel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private ds: TDualAZSet; function CreateButtons(setID: Char): TButtonArr; procedure ButtonClick(Sender: TObject); procedure UpdateSetExpressions; public end; var MainForm: TMainForm; implementation {$R *.lfm} { TMainForm } procedure TMainForm.FormCreate(Sender: TObject); begin ds := TDualAZSet.Create; CreateButtons('A'); CreateButtons('Z'); end; procedure TMainForm.FormDestroy(Sender: TObject); begin ds.Free; end; function TMainForm.CreateButtons(setID: Char): TButtonArr; const spacing = 10; aLeft = 40; var i: integer; b: TSpeedButton; begin for i := Low(TDigits) to High(TDigits) do begin b := TSpeedButton.Create(Self); b.Top := spacing; b.Left := aLeft + i * (b.Width + spacing); b.Caption := IntToStr(i); b.Tag := i; b.Name := Format('%s%d', [setID, i]); case setId of 'A': b.Parent := pnlA; 'Z': b.Parent := pnlZ; end; b.OnClick := @ButtonClick; Result[i] := b; end; end; procedure TMainForm.ButtonClick(Sender: TObject); var b: TSpeedButton; begin // We only care about SpeedButtons. Just return for others. if not (Sender is TSpeedButton) then Exit; b := TSpeedButton(Sender); case b.Name[1] of 'A': begin if (b.Tag in ds.SetA) then ds.SetA := ds.SetA - [b.Tag] else ds.SetA := ds.SetA + [b.Tag]; editSetA.Caption := ds.SetAasText; end; 'Z': begin if (b.Tag in ds.SetZ) then ds.SetZ := ds.SetZ - [b.Tag] else ds.SetZ := ds.SetZ + [b.Tag]; editSetZ.Caption := ds.SetZasText; end; end; UpdateSetExpressions; end; procedure TMainForm.UpdateSetExpressions; begin editUnion.Caption := ds.UnionAsText; editSymmetricDiff.Caption := ds.SymDiffAsText; editIntersection.Caption := ds.IntersectionAsText; editDiffAZ.Caption := ds.DiffAZasText; editDiffZA.Caption := ds.DiffZAasText; end; end.