Files
wp_xxyyzz 99bd06cca6 LazBarcodes: Add QRClock demo project.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8356 8e941d3f-bd1b-0410-a28a-d453659cc2b4
2022-07-20 12:29:04 +00:00

611 lines
22 KiB
ObjectPascal

unit main;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, ExtCtrls,
StdCtrls, Spin, Buttons, ExtDlgs, ubarcodes;
type
{ TMainForm }
TMainForm = class(TForm)
BarcodesTree: TTreeView;
btnSaveToFile: TBitBtn;
btnCopyToClipboard: TBitBtn;
btnFont: TButton;
cbHumanReadableText: TCheckBox;
cbAddChecksum: TCheckBox;
cbDisplayChecksum: TCheckBox;
cbAutoSize: TCheckBox;
cbRecommendedSymbolSize: TCheckBox;
clbColor: TColorButton;
clbForeground: TColorButton;
cmbBearerBarsBox: TComboBox;
clbBackground: TColorButton;
cbMaxicode_CountryCode: TComboBox;
edMaxicode_Primary: TEdit;
edMaxicode_ServiceCode: TEdit;
edMaxicode_Postcode: TEdit;
edText: TEdit;
FontDialog: TFontDialog;
gbGeometry: TGroupBox;
gbShow: TGroupBox;
gbChecksum: TGroupBox;
gbColors: TGroupBox;
lblMaxicode_Primary: TLabel;
lblMaxicode_ServiceCode: TLabel;
lblMaxicode_CountryCode: TLabel;
lblMaxicode_Postcode: TLabel;
lblWhiteSpaceWidth: TLabel;
lblScale: TLabel;
lblError: TLabel;
lblMargin: TLabel;
lblText: TLabel;
lblSymbolHeight: TLabel;
nbOptions: TNotebook;
pgOptions_Maxicode: TPage;
pgOptions_Plessey: TPage;
pgOptions_QR: TPage;
Panel1: TPanel;
Panel2: TPanel;
BarcodePanel: TPanel;
rgMaxicode_Mode: TRadioGroup;
rgPlessey_Checkchar: TRadioGroup;
rgQR_ECCLevel: TRadioGroup;
SaveDialog1: TSaveDialog;
seWhiteSpaceWidth: TSpinEdit;
seScale: TSpinEdit;
seMargin: TSpinEdit;
seSymbolHeight: TSpinEdit;
btnSampleText: TSpeedButton;
Splitter1: TSplitter;
procedure BarcodeChange(Sender: TObject);
procedure BarcodesTreeChange(Sender: TObject; Node: TTreeNode);
procedure BarcodesTreeCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; {%H-}State: TCustomDrawState; var DefaultDraw: Boolean);
procedure btnCopyToClipboardClick(Sender: TObject);
procedure btnFontClick(Sender: TObject);
procedure btnSampleTextClick(Sender: TObject);
procedure btnSaveToFileClick(Sender: TObject);
procedure cbAutoSizeChange(Sender: TObject);
procedure cbMaxicode_CountryCodeChange(Sender: TObject);
procedure cbRecommendedSymbolSizeChange(Sender: TObject);
procedure edMaxicode_PostcodeChange(Sender: TObject);
procedure edMaxicode_PrimaryChange(Sender: TObject);
procedure edMaxicode_ServiceCodeChange(Sender: TObject);
procedure edTextChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure rgMaxicode_ModeClick(Sender: TObject);
procedure rgPlessey_CheckcharClick(Sender: TObject);
procedure rgQR_ECCLevelClick(Sender: TObject);
procedure SaveDialogTypeChange(Sender: TObject);
private
FBarCode: TLazBarcodeCustomText;
FFileName: String;
procedure PopulateBarcodesTree;
procedure SelectBarCode(ANode: TTreeNode);
procedure UpdateErrorMsg;
public
end;
var
MainForm: TMainForm;
implementation
{$R *.lfm}
uses
TypInfo;
type
TLazBarcodeClass = class of TLazBarcodeCustomText;
TBarcodeAccess = class(TLazBarcodeCustomText);
TSimpleBarcodeAccess = class(TSimpleBarcode);
{ We must register all barcode classes because barcodes will be created in this
application based on a string containing the class name. }
procedure RegisterBarcodes;
begin
RegisterClass(TBarcodeC11);
RegisterClass(TBarcodeC128);
RegisterClass(TBarcode2of5);
RegisterClass(TBarcode3of9);
RegisterClass(TBarcodeEAN);
RegisterClass(TBarcodeChannelCode);
RegisterClass(TBarcodePlessey);
RegisterClass(TBarcodeTelepen);
RegisterClass(TBarcodeMedical);
RegisterClass(TBarcodePostal);
RegisterClass(TBarcodePDF417);
RegisterClass(TBarcodeQR);
RegisterClass(TBarcodeMicroQR);
RegisterClass(TBarcodeAztec);
RegisterClass(TBarcodeAztecRune);
RegisterClass(TBarcodeDatamatrix);
RegisterClass(TBarcodeMaxiCode);
end;
{ TMainForm }
procedure TMainForm.BarcodeChange(Sender: TObject);
begin
if FBarcode = nil then
exit;
if Sender = seScale then
TBarcodeAccess(FBarcode).Scale := seScale.Value
else
if Sender = seMargin then
TBarcodeAccess(FBarcode).Margin := seMargin.Value
else
if Sender = seWhiteSpaceWidth then
TBarcodeAccess(FBarcode).WhiteSpaceWidth := seWhiteSpaceWidth.Value
else
if Sender = seSymbolHeight then
TBarcodeAccess(FBarcode).SymbolHeight := seSymbolHeight.Value
else
if (Sender = cmbBearerBarsBox) then
TBarcodeAccess(FBarcode).BearerBarMode := TBarcodeBearerBarMode(cmbBearerBarsBox.ItemIndex)
else
if Sender = clbColor then
TBarcodeAccess(FBarcode).Color := clbColor.ButtonColor
else
if Sender = clbBackground then
TBarcodeAccess(FBarcode).BackgroundColor := clbBackground.ButtonColor
else
if Sender = clbForeground then
TBarcodeAccess(FBarcode).ForegroundColor := clbForeground.ButtonColor
else
if (Sender = cbHumanReadableText) and (FBarcode is TCustomBarcode) then
TBarcodeAccess(FBarcode).ShowHumanReadableText := cbHumanReadableText.Checked
else
if (Sender = cbAddChecksum) and (FBarcode is TSimpleBarcode) then
begin
TSimpleBarcodeAccess(FBarcode).AddChecksum := cbAddChecksum.Checked;
cbDisplayChecksum.Enabled := cbAddChecksum.Checked;
end
else
if (Sender = cbDisplayChecksum) and (FBarcode is TSimpleBarcode) then
TSimpleBarcodeAccess(FBarcode).DisplayChecksum := cbDisplayChecksum.Checked;
end;
procedure TMainForm.btnSampleTextClick(Sender: TObject);
begin
if FBarCode <> nil then
begin
FBarcode.SampleText;
edText.Text := FBarcode.Text;
end;
end;
procedure TMainForm.BarcodesTreeChange(Sender: TObject; Node: TTreeNode);
begin
SelectBarcode(Node);
end;
procedure TMainForm.BarcodesTreeCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if (Node.HasChildren) or (Node.Level = 0) then
Sender.Canvas.Font.Style := [fsBold]
else
Sender.Canvas.Font.Style := [];
DefaultDraw := true;
end;
procedure TMainForm.btnCopyToClipboardClick(Sender: TObject);
begin
FBarcode.CopyToClipboard;
end;
procedure TMainForm.btnFontClick(Sender: TObject);
begin
FontDialog.Font.Assign(FBarcode.Font);
if FontDialog.Execute then
FBarcode.Font.Assign(FontDialog.Font);
end;
procedure TMainForm.btnSaveToFileClick(Sender: TObject);
begin
with TSaveDialog.Create(self) do
try
Filter := 'Windows bitmap files (*.bmp)|*.bmp|' +
'Portable network graphic files (*.png)|*.png|' +
'JPEG image files (*.jpg;*.jpeg)|*.jpg;*.jpeg|' +
'TIFF image files (*.tiff; *.tif)|*.tiff;*.tif|'+
'XPM image files (*.xpm)|*.xpm|' +
'Scalable vector graphics files (*.svg)|*.svg|'+
'Encapsulated PostScript files (*.eps;*.ps)|*.eps;*.ps|'+
'All files (*.*)|*.*';
FilterIndex := 2;
DefaultExt := '.png';
InitialDir := ExtractFileName(FFileName);
OnTypeChange := @SaveDialogTypeChange;
if Execute then
begin
FFileName := FileName;
case lowercase(ExtractFileExt(FFileName)) of
'.bmp':
FBarcode.SaveToFile(FFileName, TBitmap);
'.png':
FBarcode.SaveToFile(FFileName, TPortableNetworkGraphic);
'.jpg', '.jpeg':
FBarcode.SaveTofile(FFileName, TJpegImage);
'.tif', '.tiff':
FBarcode.SaveToFile(FFileName, TTiffImage);
'.xpm':
FBarcode.SaveToFile(FFileName, TPixmap);
'.svg':
FBarcode.SaveToSvgFile(FFileName);
'.eps', '.ps':
Fbarcode.SaveToEpsFile(FFileName);
else
raise Exception.Create('Image type not supported.');
end;
end;
finally
Free;
end;
end;
procedure TMainForm.cbAutoSizeChange(Sender: TObject);
begin
if Assigned(FBarcode) then
begin
FBarcode.AutoSize := cbAutoSize.Checked;
if FBarcode.AutoSize then
begin
FBarcode.Align := alNone;
FBarcode.AnchorSideLeft.Control := FBarcode.Parent;
FBarcode.AnchorSideLeft.Side := asrCenter;
FBarcode.AnchorSideTop.Control := FBarcode.Parent;
FBarcode.AnchorSideTop.Side := asrCenter;
end else
begin
FBarcode.AnchorSideLeft.Control := nil;
FBarcode.AnchorSideTop.Control := nil;
FBarcode.Align := alClient;
end;
end;
end;
procedure TMainForm.cbMaxicode_CountryCodeChange(Sender: TObject);
var
s: String;
begin
if FBarcode is TBarcodeMaxicode then
begin
s := cbMaxicode_Countrycode.Items[cbMaxicode_Countrycode.ItemIndex];
TBarcodeMaxicode(FBarcode).CountryCode := StrToInt(Copy(s, 1, 3));
edMaxicode_Primary.Text := TBarcodeMaxicode(FBarcode).Primary;
end;
end;
procedure TMainForm.cbRecommendedSymbolSizeChange(Sender: TObject);
begin
seScale.Enabled := not cbRecommendedSymbolSize.Checked;
lblScale.Enabled := seScale.Enabled;
seMargin.Enabled := not cbRecommendedSymbolSize.Checked;
lblMargin.Enabled := seMargin.Enabled;
seWhitespaceWidth.Enabled := not cbRecommendedSymbolSize.Checked and IsPublishedProp(FBarcode, 'WhiteSpaceWidth');
lblWhitespaceWidth.Enabled := seWhitespaceWidth.Enabled;
seSymbolHeight.Enabled := not cbRecommendedSymbolSize.Checked and IsPublishedProp(FBarcode, 'SymbolHeight');
lblSymbolHeight.Enabled := seSymbolHeight.Enabled;
cmbBearerBarsBox.Enabled := not cbRecommendedSymbolSize.Checked and IsPublishedProp(FBarcode, 'BearerBarMode');
if FBarcode is TSimpleBarcode then
begin
TSimpleBarcode(FBarcode).RecommendedSymbolSize := cbRecommendedSymbolSize.Checked;
if not cbRecommendedSymbolSize.Checked then
begin
TSimpleBarcode(FBarcode).Scale := seScale.Value;
TSimpleBarcodeAccess(FBarcode).SymbolHeight := seSymbolHeight.Value;
TSimpleBarcode(FBarcode).Margin := seMargin.Value;
TSimpleBarcodeAccess(FBarcode).WhitespaceWidth := seWhiteSpaceWidth.Value;
TSimpleBarcodeAccess(FBarcode).BearerBarMode := TBarcodeBearerBarMode(cmbBearerBarsBox.ItemIndex);
end;
end else
if FBarcode is TBarcodePDF417 then
begin
seSymbolHeight.Enabled := not cbRecommendedSymbolSize.Checked;
lblSymbolHeight.Enabled := seSymbolHeight.Enabled;
end;
end;
procedure TMainForm.edMaxicode_PostcodeChange(Sender: TObject);
begin
if FBarcode is TBarcodeMaxicode then
begin
TBarcodeMaxicode(FBarcode).Postcode := edMaxicode_Postcode.Text;
edMaxicode_Primary.Text := TBarcodeMaxicode(FBarcode).Primary;
end;
end;
procedure TMainForm.edMaxicode_PrimaryChange(Sender: TObject);
begin
if FBarcode is TBarcodeMaxicode then
begin
TBarcodeMaxicode(FBarcode).Primary := edMaxicode_Primary.Text;
edMaxicode_Primary.Text := TBarcodeMaxicode(FBarcode).Primary;
end;
end;
procedure TMainForm.edMaxicode_ServiceCodeChange(Sender: TObject);
begin
if FBarcode is TBarcodeMaxicode then
begin
TBarcodeMaxicode(FBarcode).Servicecode := StrToInt(edMaxicode_Servicecode.Text);
edMaxicode_Primary.Text := TBarcodeMaxicode(FBarcode).Primary;
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
nbOptions.PageIndex := -1;
PopulateBarcodesTree;
end;
procedure TMainForm.rgMaxicode_ModeClick(Sender: TObject);
begin
if FBarcode is TBarcodeMaxicode then
begin
case rgMaxicode_Mode.ItemIndex of
-1: exit;
0: TBarcodeMaxicode(FBarcode).Mode := mcmAuto;
1: TBarcodeMaxicode(FBarcode).Mode := mcmMode2;
2: TBarcodeMaxicode(FBarcode).Mode := mcmMode3;
3: TBarcodeMaxicode(FBarcode).Mode := mcmMode4;
4: TBarcodeMaxicode(FBarcode).Mode := mcmMode5;
5: TBarcodeMaxicode(FBarcode).Mode := mcmMode6;
else raise Exception.Create('Mode not supported.');
end;
edMaxicode_Primary.Text := TBarcodeMaxicode(FBarcode).Primary;
end;
edMaxicode_Postcode.Visible := rgMaxicode_Mode.ItemIndex in [0, 1, 2];
lblMaxicode_Postcode.Visible := edMaxicode_Postcode.Visible;
cbMaxicode_Countrycode.Visible := edMaxicode_Postcode.Visible;
lblMaxicode_Countrycode.Visible := edMaxicode_Postcode.Visible;
edMaxicode_ServiceCode.Visible := edMaxicode_Postcode.Visible;
lblMaxicode_ServiceCode.Visible := edMaxicode_Postcode.Visible;
edMaxicode_Primary.Visible := edMaxicode_Postcode.Visible;
lblMaxicode_Primary.Visible := edMaxicode_Postcode.Visible;
end;
procedure TMainForm.rgPlessey_CheckcharClick(Sender: TObject);
begin
if FBarcode is TBarcodePlessey then
TBarcodePlessey(FBarcode).CheckChar := TPlesseyCheckChar(rgPlessey_CheckChar.ItemIndex);
end;
procedure TMainForm.rgQR_ECCLevelClick(Sender: TObject);
begin
if FBarcode is TBarcodeQR then
TBarcodeQR(FBarcode).ECCLevel := TBarcodeQR_ECCLevel(rgQR_ECCLevel.ItemIndex);
end;
procedure TMainForm.SaveDialogTypeChange(Sender: TObject);
var
dlg: TSaveDialog;
L: TStrings;
idx: Integer;
begin
dlg := Sender as TSaveDialog;
L := TStringList.Create;
try
L.StrictDelimiter := true;
L.Delimiter := '|';
L.DelimitedText := dlg.Filter;
idx := (dlg.FilterIndex - 1) * 2 + 1;
dlg.DefaultExt := ExtractfileExt(L[idx]);
finally
L.Free;
end;
end;
procedure TMainForm.edTextChange(Sender: TObject);
begin
FBarcode.Text := edText.Text;
UpdateErrorMsg;
end;
procedure TMainForm.PopulateBarcodesTree;
var
node, child: TTreeNode;
begin
with BarcodesTree do begin
Items.BeginUpdate;
try
Items.Clear;
node := Items.AddChild(nil, '1-DIMENSIONAL');
child := Items.AddChildObject(node, 'Code 11', PChar('TBarcodeC11'));
child := Items.AddChildObject(node, 'Code 128 and related', PChar('TBarcodeC128'));
Items.AddChildObject(child, 'Code-128', Pointer(PtrInt(bctCode128)));
Items.AddChildObject(child, 'EAN-128', Pointer(PtrInt(bctEAN128)));
child := Items.AddChildObject(node, '2-of-5 codes', PChar('TBarcode2of5'));
Items.AddChildObject(child, 'Standard 2-of-5', Pointer(PtrInt(bctCode25Standard)));
Items.AddChildObject(child, 'Data Logic 2-of-5', Pointer(PtrInt(bctCode25DataLogic)));
Items.AddChildObject(child, 'IATA 2-of-5', Pointer(PtrInt(bctCode25IATA)));
Items.AddChildObject(child, 'Industrial 2-of-5', Pointer(PtrInt(bctCode25Industrial)));
Items.AddChildObject(child, 'Interleaved 2-of-5', Pointer(PtrInt(bctCode25Interleaved)));
Items.AddChildObject(child, 'ITF-14', Pointer(PtrInt(bctITF14)));
child := Items.AddChildObject(node, '3-of-9 codes', PChar('TBarcode3of9'));
Items.AddChildObject(child, 'Code 3-of-9 (C39)', Pointer(ptrInt(bctCode39)));
Items.AddChildObject(child, 'Code 3-of-9 extended (C39+)', Pointer(PtrInt(bctCode39Ext)));
Items.AddChildObject(child, 'LOGMARS', Pointer(PtrInt(bctLOGMARS)));
Items.AddChildObject(child, 'Code 93', Pointer(PtrInt(bctCode93)));
child := Items.AddChildObject(node, 'Channel code', PChar('TBarcodeChannelCode'));
child := Items.AddChildObject(node, 'UPC/EAN codes', PChar('TBarcodeEAN'));
Items.AddChildObject(child, 'EAN-8, EAN-13', Pointer(PtrInt(bctEAN)));
Items.AddChildObject(child, 'EAN-14', Pointer(PtrInt(bctEAN14)));
Items.AddChildObject(child, 'ISBN', Pointer(PtrInt(bctISBN)));
Items.AddChildObject(child, 'NVE-18', Pointer(PtrInt(bctNVE18)));
Items.AddChildObject(child, 'UPC-A', Pointer(PtrInt(bctUPCA)));
Items.AddChildObject(child, 'UPC-E', Pointer(PtrInt(bctUPCE)));
child := Items.AddChildObject(node, 'MSI/Plessey', PChar('TBarcodePlessey'));
Items.AddChildObject(child, 'Plessey', Pointer(PtrInt(bctPlessey)));
Items.AddChildObject(child, 'MSI/Plessey', Pointer(PtrInt(bctMSIPlessey)));
child := Items.AddChildObject(node, 'Telepen', PChar('TBarcodeTelepen'));
Items.AddChildObject(child, 'Telepen', Pointer(PtrInt(bctTelepen)));
Items.AddChildObject(child, 'Telepen numeric', Pointer(PtrInt(bctTelepenNum)));
child := Items.AddChildObject(node, 'Medical/pharmaceutical', PChar('TBarcodeMedical'));
Items.AddChildObject(child, 'CodaBar', Pointer(PtrInt(bctCodaBar)));
Items.AddChildObject(child, 'Code32', Pointer(PtrInt(bctCode32)));
Items.AddChildObject(child, 'Pharma one-track', Pointer(PtrInt(bctPharmaOne)));
Items.AddChildObject(child, 'Pharma two-track', Pointer(PtrInt(bctPharmaTwo)));
Items.AddChildObject(child, 'Pharmazentralnummer (7-digit)', Pointer(PtrInt(bctPZN7)));
Items.AddChildObject(child, 'Pharmazentralnummer (8-digit)', Pointer(PtrInt(bctPZN8)));
child := Items.AddChildObject(node, 'Postal barcodes', PChar('TBarcodePostal'));
Items.AddChildObject(child, 'Australia Post Customer', Pointer(PtrInt(bctAustraliaPostCustomer)));
Items.AddChildObject(child, 'Australia Post Reply Paid', Pointer(PtrInt(bctAustraliaPostReplyPaid)));
Items.AddChildObject(child, 'Australia Post Routing', Pointer(PtrInt(bctAustraliaPostRoute)));
Items.AddChildObject(child, 'Australia Post Redirection', Pointer(PtrInt(bctAustraliaPostRedirect)));
Items.AddChildObject(child, 'DAFT', Pointer(PtrInt(bctDaft)));
Items.AddChildObject(child, 'Deutsche Post IdentCode', Pointer(PtrInt(bctDeutschePostIdentCode)));
Items.AddChildObject(child, 'Deutsche Post LeitCode', Pointer(PtrInt(bctDeutschePostLeitCode)));
Items.AddChildObject(child, 'FIM (Face Identification Mark)', Pointer(PtrInt(bctFIM)));
Items.AddChildObject(child, 'Japanese Post', Pointer(PtrInt(bctJapanPost)));
Items.AddChildObject(child, 'KIX', Pointer(PtrInt(bctKix)));
Items.AddChildObject(child, 'Korea Post', Pointer(PtrInt(bctKoreaPost)));
Items.AddChildObject(child, 'Planet', Pointer(PtrInt(bctPlanet)));
Items.AddChildObject(child, 'PostNet', Pointer(PtrInt(bctPostNet)));
Items.AddChildObject(child, 'Royal Mail RM4SCC', Pointer(PtrInt(bctRM4SCC)));
node := Items.AddChild(nil, 'STACKED');
child := Items.AddChildObject(node, 'PDF417 variants', PChar('TBarcodePDF417'));
Items.AddChildObject(child, 'PDF417', Pointer(PtrInt(bctPDF417)));
Items.AddChildObject(child, 'Compact PDF417', Pointer(PtrInt(bctPDF417trunc)));
Items.AddChildObject(child, 'MicroPDF417 (ISO 24728)', Pointer(PtrInt(bctMicroPDF417)));
node := Items.AddChild(nil, '2-DIMENSIONAL');
child := Items.AddChildObject(node, 'QR Code', PChar('TBarcodeQR'));
child := Items.AddChildObject(node, 'Micro QR', PChar('TBarcodeMicroQR'));
child := Items.AddChildObject(node, 'Aztec', PChar('TBarcodeAztec'));
child := Items.AddChildObject(node, 'Aztec Rune', PChar('TBarcodeAztecRune'));
child := Items.AddChildObject(node, 'Data Matrix', PChar('TBarcodeDataMatrix'));
child := Items.AddChildObject(node, 'Maxicode (ISO 16023)', PChar('TBarcodeMaxiCode'));
FullExpand;
finally
Items.EndUpdate;
end;
end;
end;
procedure TMainForm.SelectBarcode(ANode: TTreeNode);
var
barcodeClassName: String;
barcodeClass: TLazBarcodeClass;
barcodeType: Integer;
begin
if (ANode = nil) then
begin
if FBarcode <> nil then FBarcode.Hide;
exit;
end;
FreeAndNil(FBarcode);
// Determine from the node's Data field the class of the barcode to be created
// and/or the value of the BarcodeType property.
if (ANode.Level = 1) and not ANode.HasChildren then
barcodeClassName := PChar(ANode.Data)
else
if (ANode.Level = 2) then
begin
barcodeClassName := PChar(ANode.Parent.Data);
barcodeType := {%H-}PtrInt(ANode.Data);
end else
begin
if FBarcode <> nil then FBarcode.Hide;
exit;
end;
// Create barcode from information provided in the node's Data field.
barcodeClass := TLazBarcodeClass(GetClass(barcodeClassName));
FBarcode := barcodeClass.Create(self);
FBarcode.Parent := BarcodePanel;
// Apply general properties
FBarcode.Text := edText.Text;
TBarcodeAccess(FBarcode).Color := clbColor.ButtonColor;
TBarcodeAccess(FBarcode).BackgroundColor := clbBackground.ButtonColor;
TBarcodeAccess(FBarcode).ForegroundColor := clbForeground.ButtonColor;
TBarcodeAccess(FBarcode).Scale := seScale.Value;
TBarcodeAccess(FBarcode).Margin := seMargin.Value;
TBarcodeAccess(FBarcode).WhiteSpaceWidth := seWhitespaceWidth.Value;
TBarcodeAccess(FBarcode).BearerBarMode := TBarcodeBearerBarMode(cmbBearerBarsBox.ItemIndex);
TBarcodeAccess(FBarcode).SymbolHeight := seSymbolHeight.Value;
TBarcodeAccess(FBarcode).RecommendedSymbolSize := cbRecommendedSymbolSize.Checked;
// Apply specific properties for each barcode class - not very elegant...
if (FBarcode is TCustomBarcode) then
TBarcodeAccess(FBarcode).ShowHumanReadableText := cbHumanReadableText.Checked;
if (FBarcode is TSimpleBarCode) then
begin
TSimpleBarcodeAccess(FBarcode).AddChecksum := cbAddChecksum.Checked;
cbAddChecksum.Enabled := IsPublishedProp(FBarcode, 'AddChecksum');
TSimpleBarcodeAccess(FBarcode).DisplayChecksum := cbDisplayChecksum.Checked;
cbDisplayChecksum.Enabled := cbAddChecksum.Checked and IsPublishedProp(FBarcode, 'DisplayChecksum');
if (ANode.Level = 2) then
TSimpleBarcodeAccess(FBarcode).BarcodeType := TBarcodeType(barcodeType);
end;
cbAutoSizeChange(nil);
// Show options page corresponding to the selected barcode type.
if (FBarcode is TBarcodePlessey) and (TBarcodePlessey(FBarcode).BarcodeType = bctMSIPlessey) then
nbOptions.PageIndex := pgOptions_Plessey.PageIndex
else
if (FBarcode is TBarcodeQR) then
nbOptions.PageIndex := pgOptions_QR.PageIndex
else
if (FBarcode is TBarcodeMaxiCode) then
nbOptions.PageIndex := pgOptions_Maxicode.PageIndex
else
nbOptions.PageIndex := -1;
// Enable/disable GUI components
cbHumanReadableText.Enabled := not ((FBarcode is TBarcodeSquare) or (FBarcode is TBarcodePDF417));
btnFont.Enabled := cbHumanReadableText.Enabled;
seWhiteSpaceWidth.Enabled := IsPublishedProp(FBarcode, 'WhiteSpaceWidth') and not cbRecommendedSymbolSize.Checked;
lblWhitespaceWidth.Enabled := seWhiteSpaceWidth.Enabled;
if FBarcode is TBarcodePDF417 then
begin
seSymbolHeight.Enabled := not cbRecommendedSymbolSize.Checked;
lblSymbolHeight.Caption := 'Row height ratio';
end else
begin
seSymbolHeight.Enabled := not cbRecommendedSymbolSize.Checked and IsPublishedProp(FBarcode, 'SymbolHeight');
lblSymbolHeight.Caption := 'Symbol height';
end;
lblSymbolHeight.Enabled := seSymbolHeight.Enabled;
// Show error message from rendering, if available.
UpdateErrorMsg;
end;
procedure TMainForm.UpdateErrorMsg;
begin
lblError.Visible := FBarcode.ErrorString <> '';
lblError.Caption := FBarcode.ErrorString;
if FBarcode <> nil then
FBarcode.Visible := not lblError.Visible;
end;
initialization
RegisterBarcodes;
end.