Add Set Demo example
This commit is contained in:
parent
c280226e4d
commit
39728691b3
95
set_demo/dualdigitsset.pas
Normal file
95
set_demo/dualdigitsset.pas
Normal file
@ -0,0 +1,95 @@
|
||||
unit dualdigitsset;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
SysUtils;
|
||||
|
||||
type
|
||||
TDigits = 0..9;
|
||||
TDigitSet = set of TDigits;
|
||||
|
||||
{ TDualAZSet }
|
||||
|
||||
TDualAZSet = class
|
||||
private
|
||||
FsetA, FsetZ: TDigitSet;
|
||||
function GetDiffAZAsText: string;
|
||||
function GetDiffZAAsText: string;
|
||||
function GetIntersectionAsText: string;
|
||||
function GetSetAasText: string;
|
||||
function GetSetZasText: string;
|
||||
function GetSymDiffAsText: string;
|
||||
function GetUnionAsText: string;
|
||||
function SetAsString(s: TDigitSet): string;
|
||||
public
|
||||
property DiffAZAsText: string read GetDiffAZAsText;
|
||||
property DiffZAAsText: string read GetDiffZAAsText;
|
||||
property IntersectionAsText: string read GetIntersectionAsText;
|
||||
property SetA: TDigitSet read FsetA write FsetA;
|
||||
property SetAasText: string read GetSetAasText;
|
||||
property SetZ: TDigitSet read FsetZ write FsetZ;
|
||||
property SetZasText: string read GetSetZasText;
|
||||
property SymDiffAsText: string read GetSymDiffAsText;
|
||||
property UnionAsText: string read GetUnionAsText;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
{ TDualAZSet }
|
||||
|
||||
function TDualAZSet.GetDiffAZAsText: string;
|
||||
begin
|
||||
Result := SetAsString(FsetA - FsetZ);
|
||||
end;
|
||||
|
||||
function TDualAZSet.GetDiffZAAsText: string;
|
||||
begin
|
||||
Result := SetAsString(FsetZ - FsetA);
|
||||
end;
|
||||
|
||||
function TDualAZSet.GetIntersectionAsText: string;
|
||||
begin
|
||||
Result := SetAsString(FsetA * FsetZ);
|
||||
end;
|
||||
|
||||
function TDualAZSet.GetSetAasText: string;
|
||||
begin
|
||||
Result := SetAsString(FsetA);
|
||||
end;
|
||||
|
||||
function TDualAZSet.GetSetZasText: string;
|
||||
begin
|
||||
Result := SetAsString(FsetZ);
|
||||
end;
|
||||
|
||||
function TDualAZSet.GetSymDiffAsText: string;
|
||||
begin
|
||||
Result := SetAsString(FsetA + FsetZ - FsetA * FsetZ);
|
||||
end;
|
||||
|
||||
function TDualAZSet.GetUnionAsText: string;
|
||||
begin
|
||||
Result := SetAsString(FsetA + FsetZ);
|
||||
end;
|
||||
|
||||
function TDualAZSet.SetAsString(s: TDigitSet): string;
|
||||
var d: TDigits;
|
||||
begin
|
||||
Result := EmptyStr;
|
||||
for d in TDigitSet do
|
||||
if (d in s) then
|
||||
begin
|
||||
if Length(Result) > 0
|
||||
then AppendStr(Result, ',');
|
||||
|
||||
AppendStr(Result, IntToStr(d));
|
||||
end;
|
||||
|
||||
Result := Format('[%s]', [Result]);
|
||||
end;
|
||||
|
||||
end.
|
||||
|
BIN
set_demo/setdemo.ico
Normal file
BIN
set_demo/setdemo.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 134 KiB |
83
set_demo/setdemo.lpi
Normal file
83
set_demo/setdemo.lpi
Normal file
@ -0,0 +1,83 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<CONFIG>
|
||||
<ProjectOptions>
|
||||
<Version Value="11"/>
|
||||
<General>
|
||||
<SessionStorage Value="InProjectDir"/>
|
||||
<MainUnit Value="0"/>
|
||||
<Title Value="Integer set demo"/>
|
||||
<Scaled Value="True"/>
|
||||
<ResourceType Value="res"/>
|
||||
<UseXPManifest Value="True"/>
|
||||
<XPManifest>
|
||||
<DpiAware Value="True"/>
|
||||
</XPManifest>
|
||||
<Icon Value="0"/>
|
||||
</General>
|
||||
<BuildModes Count="1">
|
||||
<Item1 Name="Default" Default="True"/>
|
||||
</BuildModes>
|
||||
<PublishOptions>
|
||||
<Version Value="2"/>
|
||||
<UseFileFilters Value="True"/>
|
||||
</PublishOptions>
|
||||
<RunParams>
|
||||
<FormatVersion Value="2"/>
|
||||
<Modes Count="0"/>
|
||||
</RunParams>
|
||||
<RequiredPackages Count="1">
|
||||
<Item1>
|
||||
<PackageName Value="LCL"/>
|
||||
</Item1>
|
||||
</RequiredPackages>
|
||||
<Units Count="3">
|
||||
<Unit0>
|
||||
<Filename Value="setdemo.lpr"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
</Unit0>
|
||||
<Unit1>
|
||||
<Filename Value="setdemo_main.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="MainForm"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
</Unit1>
|
||||
<Unit2>
|
||||
<Filename Value="dualdigitsset.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
</Unit2>
|
||||
</Units>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
<Version Value="11"/>
|
||||
<Target>
|
||||
<Filename Value="setdemo"/>
|
||||
</Target>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="$(ProjOutDir)"/>
|
||||
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
|
||||
</SearchPaths>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<DebugInfoType Value="dsDwarf2"/>
|
||||
</Debugging>
|
||||
<Options>
|
||||
<Win32>
|
||||
<GraphicApplication Value="True"/>
|
||||
</Win32>
|
||||
</Options>
|
||||
</Linking>
|
||||
</CompilerOptions>
|
||||
<Debugging>
|
||||
<Exceptions Count="3">
|
||||
<Item1>
|
||||
<Name Value="EAbort"/>
|
||||
</Item1>
|
||||
<Item2>
|
||||
<Name Value="ECodetoolError"/>
|
||||
</Item2>
|
||||
<Item3>
|
||||
<Name Value="EFOpenError"/>
|
||||
</Item3>
|
||||
</Exceptions>
|
||||
</Debugging>
|
||||
</CONFIG>
|
23
set_demo/setdemo.lpr
Normal file
23
set_demo/setdemo.lpr
Normal file
@ -0,0 +1,23 @@
|
||||
program setdemo;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
uses
|
||||
{$IFDEF UNIX}{$IFDEF UseCThreads}
|
||||
cthreads,
|
||||
{$ENDIF}{$ENDIF}
|
||||
Interfaces, // this includes the LCL widgetset
|
||||
Forms, setdemo_main, dualdigitsset
|
||||
{ you can add units after this };
|
||||
|
||||
{$R *.res}
|
||||
|
||||
begin
|
||||
RequireDerivedFormResource:=True;
|
||||
Application.Title:='Integer set demo';
|
||||
// Application.Scaled:=True;
|
||||
Application.Initialize;
|
||||
Application.CreateForm(TMainForm, MainForm);
|
||||
Application.Run;
|
||||
end.
|
||||
|
159
set_demo/setdemo_main.lfm
Normal file
159
set_demo/setdemo_main.lfm
Normal file
@ -0,0 +1,159 @@
|
||||
object MainForm: TMainForm
|
||||
Left = 668
|
||||
Height = 380
|
||||
Top = 250
|
||||
Width = 400
|
||||
Caption = 'Visualising two sets of digits.'
|
||||
ClientHeight = 380
|
||||
ClientWidth = 400
|
||||
OnCreate = FormCreate
|
||||
OnDestroy = FormDestroy
|
||||
LCLVersion = '2.0.12.0'
|
||||
object pnlA: TPanel
|
||||
Left = 0
|
||||
Height = 80
|
||||
Top = 0
|
||||
Width = 400
|
||||
Align = alTop
|
||||
ClientHeight = 80
|
||||
ClientWidth = 400
|
||||
Color = clGradientActiveCaption
|
||||
Font.Style = [fsBold]
|
||||
ParentColor = False
|
||||
ParentFont = False
|
||||
TabOrder = 0
|
||||
object editSetA: TLabeledEdit
|
||||
Left = 235
|
||||
Height = 22
|
||||
Top = 40
|
||||
Width = 150
|
||||
EditLabel.Height = 16
|
||||
EditLabel.Width = 34
|
||||
EditLabel.Caption = 'Set A'
|
||||
EditLabel.ParentColor = False
|
||||
LabelPosition = lpLeft
|
||||
LabelSpacing = 5
|
||||
ReadOnly = True
|
||||
TabOrder = 0
|
||||
TabStop = False
|
||||
end
|
||||
end
|
||||
object pnlZ: TPanel
|
||||
Left = 0
|
||||
Height = 80
|
||||
Top = 80
|
||||
Width = 400
|
||||
Align = alTop
|
||||
ClientHeight = 80
|
||||
ClientWidth = 400
|
||||
Color = clGradientInactiveCaption
|
||||
Font.Style = [fsBold]
|
||||
ParentColor = False
|
||||
ParentFont = False
|
||||
TabOrder = 1
|
||||
object editSetZ: TLabeledEdit
|
||||
Left = 235
|
||||
Height = 22
|
||||
Top = 40
|
||||
Width = 150
|
||||
EditLabel.Height = 16
|
||||
EditLabel.Width = 34
|
||||
EditLabel.Caption = 'Set Z'
|
||||
EditLabel.ParentColor = False
|
||||
LabelPosition = lpLeft
|
||||
LabelSpacing = 5
|
||||
ReadOnly = True
|
||||
TabOrder = 0
|
||||
TabStop = False
|
||||
end
|
||||
end
|
||||
object pnlResultSets: TPanel
|
||||
Left = 0
|
||||
Height = 220
|
||||
Top = 160
|
||||
Width = 400
|
||||
Align = alClient
|
||||
ClientHeight = 220
|
||||
ClientWidth = 400
|
||||
Color = clScrollBar
|
||||
Font.Style = [fsBold]
|
||||
ParentColor = False
|
||||
ParentFont = False
|
||||
TabOrder = 2
|
||||
object editUnion: TLabeledEdit
|
||||
Left = 235
|
||||
Height = 22
|
||||
Top = 10
|
||||
Width = 150
|
||||
EditLabel.Height = 16
|
||||
EditLabel.Width = 139
|
||||
EditLabel.Caption = 'Union of A && Z (A + Z)'
|
||||
EditLabel.ParentColor = False
|
||||
LabelPosition = lpLeft
|
||||
LabelSpacing = 5
|
||||
ReadOnly = True
|
||||
TabOrder = 4
|
||||
TabStop = False
|
||||
end
|
||||
object editIntersection: TLabeledEdit
|
||||
Left = 235
|
||||
Height = 22
|
||||
Top = 50
|
||||
Width = 150
|
||||
EditLabel.Height = 16
|
||||
EditLabel.Width = 177
|
||||
EditLabel.Caption = 'Intersection of A && Z (A * Z)'
|
||||
EditLabel.ParentColor = False
|
||||
LabelPosition = lpLeft
|
||||
LabelSpacing = 5
|
||||
ReadOnly = True
|
||||
TabOrder = 0
|
||||
TabStop = False
|
||||
end
|
||||
object editSymmetricDiff: TLabeledEdit
|
||||
Left = 235
|
||||
Height = 22
|
||||
Top = 90
|
||||
Width = 150
|
||||
EditLabel.Height = 16
|
||||
EditLabel.Width = 155
|
||||
EditLabel.Caption = 'Symmetric Diff. of A && Z'
|
||||
EditLabel.ParentColor = False
|
||||
LabelPosition = lpLeft
|
||||
LabelSpacing = 5
|
||||
ReadOnly = True
|
||||
TabOrder = 3
|
||||
TabStop = False
|
||||
end
|
||||
object editDiffAZ: TLabeledEdit
|
||||
Left = 235
|
||||
Height = 22
|
||||
Top = 130
|
||||
Width = 150
|
||||
EditLabel.Height = 16
|
||||
EditLabel.Width = 167
|
||||
EditLabel.Caption = 'Difference of A && Z (A - Z)'
|
||||
EditLabel.ParentColor = False
|
||||
LabelPosition = lpLeft
|
||||
LabelSpacing = 5
|
||||
ReadOnly = True
|
||||
TabOrder = 2
|
||||
TabStop = False
|
||||
end
|
||||
object editDiffZA: TLabeledEdit
|
||||
Left = 235
|
||||
Height = 22
|
||||
Top = 170
|
||||
Width = 150
|
||||
EditLabel.Height = 16
|
||||
EditLabel.Width = 167
|
||||
EditLabel.Caption = 'Difference of Z && A (Z - A)'
|
||||
EditLabel.ParentColor = False
|
||||
LabelPosition = lpLeft
|
||||
LabelSpacing = 5
|
||||
ReadOnly = True
|
||||
TabOrder = 1
|
||||
TabStop = False
|
||||
end
|
||||
end
|
||||
end
|
122
set_demo/setdemo_main.pas
Normal file
122
set_demo/setdemo_main.pas
Normal file
@ -0,0 +1,122 @@
|
||||
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.
|
||||
|
Loading…
Reference in New Issue
Block a user