diff --git a/components/industrialstuff/Example/LCDDisplay/project1.lpi b/components/industrialstuff/Example/LCDDisplay/project1.lpi
new file mode 100644
index 000000000..e6a8b385b
--- /dev/null
+++ b/components/industrialstuff/Example/LCDDisplay/project1.lpi
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
diff --git a/components/industrialstuff/Example/LCDDisplay/project1.lpr b/components/industrialstuff/Example/LCDDisplay/project1.lpr
new file mode 100644
index 000000000..a1d376a69
--- /dev/null
+++ b/components/industrialstuff/Example/LCDDisplay/project1.lpr
@@ -0,0 +1,24 @@
+program project1;
+
+{$mode objfpc}{$H+}
+
+uses
+ {$IFDEF UNIX}
+ cthreads,
+ {$ENDIF}
+ {$IFDEF HASAMIGA}
+ athreads,
+ {$ENDIF}
+ Interfaces, // this includes the LCL widgetset
+ Forms, untMain, TLCDLines_unit;
+
+{$R *.res}
+
+begin
+ RequireDerivedFormResource:=True;
+ Application.Scaled:=True;
+ Application.Initialize;
+ Application.CreateForm(TfrmMain, frmMain);
+ Application.Run;
+end.
+
diff --git a/components/industrialstuff/Example/LCDDisplay/untmain.lfm b/components/industrialstuff/Example/LCDDisplay/untmain.lfm
new file mode 100644
index 000000000..d87280ae2
--- /dev/null
+++ b/components/industrialstuff/Example/LCDDisplay/untmain.lfm
@@ -0,0 +1,337 @@
+object frmMain: TfrmMain
+ Left = 510
+ Height = 531
+ Top = 217
+ Width = 921
+ Caption = 'LCDLines Demo'
+ ClientHeight = 531
+ ClientWidth = 921
+ OnCreate = FormCreate
+ OnShow = FormShow
+ LCLVersion = '2.3.0.0'
+ object rgFrameStyle: TRadioGroup
+ Left = 24
+ Height = 105
+ Top = 336
+ Width = 108
+ AutoFill = True
+ Caption = 'Frame style'
+ ChildSizing.LeftRightSpacing = 6
+ ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+ ChildSizing.EnlargeVertical = crsHomogenousChildResize
+ ChildSizing.ShrinkHorizontal = crsScaleChilds
+ ChildSizing.ShrinkVertical = crsScaleChilds
+ ChildSizing.Layout = cclLeftToRightThenTopToBottom
+ ChildSizing.ControlsPerLine = 1
+ ClientHeight = 85
+ ClientWidth = 104
+ Items.Strings = (
+ 'fsRelief'
+ 'fsNone'
+ 'fsLowered'
+ 'fsRaised'
+ )
+ OnClick = rgFrameStyleClick
+ TabOrder = 0
+ end
+ object rgFrameColorStyle: TRadioGroup
+ Left = 149
+ Height = 65
+ Top = 336
+ Width = 123
+ AutoFill = True
+ Caption = 'Frame color style'
+ ChildSizing.LeftRightSpacing = 6
+ ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+ ChildSizing.EnlargeVertical = crsHomogenousChildResize
+ ChildSizing.ShrinkHorizontal = crsScaleChilds
+ ChildSizing.ShrinkVertical = crsScaleChilds
+ ChildSizing.Layout = cclLeftToRightThenTopToBottom
+ ChildSizing.ControlsPerLine = 1
+ ClientHeight = 45
+ ClientWidth = 119
+ Items.Strings = (
+ 'stWindows'
+ 'stColor'
+ )
+ OnClick = rgFrameColorStyleClick
+ TabOrder = 1
+ end
+ object cbtFrameColor: TColorButton
+ Left = 288
+ Height = 25
+ Top = 410
+ Width = 123
+ BorderWidth = 2
+ ButtonColorAutoSize = False
+ ButtonColorSize = 16
+ ButtonColor = clBlack
+ Caption = 'Frame color'
+ Margin = 8
+ OnColorChanged = cbtFrameColorColorChanged
+ end
+ object rgDotShape: TRadioGroup
+ Left = 427
+ Height = 65
+ Top = 336
+ Width = 120
+ AutoFill = True
+ Caption = 'Dot shape'
+ ChildSizing.LeftRightSpacing = 6
+ ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+ ChildSizing.EnlargeVertical = crsHomogenousChildResize
+ ChildSizing.ShrinkHorizontal = crsScaleChilds
+ ChildSizing.ShrinkVertical = crsScaleChilds
+ ChildSizing.Layout = cclLeftToRightThenTopToBottom
+ ChildSizing.ControlsPerLine = 1
+ ClientHeight = 45
+ ClientWidth = 116
+ Items.Strings = (
+ 'stSquare'
+ 'stRound'
+ )
+ OnClick = rgDotShapeClick
+ TabOrder = 2
+ end
+ object mmText: TMemo
+ Left = 704
+ Height = 65
+ Top = 336
+ Width = 168
+ OnChange = mmTextChange
+ TabOrder = 3
+ end
+ object rgFrameHeight: TRadioGroup
+ Left = 563
+ Height = 65
+ Top = 336
+ Width = 120
+ AutoFill = True
+ Caption = 'Frame height'
+ ChildSizing.LeftRightSpacing = 6
+ ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+ ChildSizing.EnlargeVertical = crsHomogenousChildResize
+ ChildSizing.ShrinkHorizontal = crsScaleChilds
+ ChildSizing.ShrinkVertical = crsScaleChilds
+ ChildSizing.Layout = cclLeftToRightThenTopToBottom
+ ChildSizing.ControlsPerLine = 1
+ ClientHeight = 45
+ ClientWidth = 116
+ Items.Strings = (
+ 'double'
+ 'single'
+ )
+ OnClick = rgFrameHeightClick
+ TabOrder = 4
+ end
+ object Label1: TLabel
+ Left = 427
+ Height = 15
+ Top = 413
+ Width = 44
+ Caption = 'Dot size:'
+ Color = clDefault
+ ParentColor = False
+ end
+ object seDotSize: TSpinEdit
+ Left = 491
+ Height = 23
+ Top = 410
+ Width = 58
+ OnChange = seDotSizeChange
+ TabOrder = 5
+ end
+ object Label2: TLabel
+ Left = 427
+ Height = 15
+ Top = 441
+ Width = 60
+ Caption = 'Dots space:'
+ Color = clDefault
+ ParentColor = False
+ end
+ object seDotsSpace: TSpinEdit
+ Left = 491
+ Height = 23
+ Top = 438
+ Width = 58
+ OnChange = seDotsSpaceChange
+ TabOrder = 6
+ end
+ object Label3: TLabel
+ Left = 563
+ Height = 15
+ Top = 413
+ Width = 58
+ Caption = 'Frame size:'
+ Color = clDefault
+ ParentColor = False
+ end
+ object seFrameSize: TSpinEdit
+ Left = 625
+ Height = 23
+ Top = 410
+ Width = 58
+ OnChange = seFrameSizeChange
+ TabOrder = 7
+ end
+ object cbAutoSize: TCheckBox
+ Left = 149
+ Height = 19
+ Top = 413
+ Width = 64
+ Caption = 'AutoSize'
+ OnChange = cbAutoSizeChange
+ TabOrder = 8
+ end
+ object cbCharSpace: TCheckBox
+ Left = 704
+ Height = 19
+ Top = 470
+ Width = 76
+ Caption = 'Char space'
+ OnChange = cbCharSpaceChange
+ TabOrder = 9
+ end
+ object cbtBoardColor: TColorButton
+ Left = 288
+ Height = 25
+ Top = 436
+ Width = 123
+ BorderWidth = 2
+ ButtonColorAutoSize = False
+ ButtonColorSize = 16
+ ButtonColor = clBlack
+ Caption = 'Board color'
+ Margin = 8
+ OnColorChanged = cbtBoardColorColorChanged
+ end
+ object cbtDotONColor: TColorButton
+ Left = 288
+ Height = 25
+ Top = 464
+ Width = 123
+ BorderWidth = 2
+ ButtonColorAutoSize = False
+ ButtonColorSize = 16
+ ButtonColor = clBlack
+ Caption = 'Dot color ON'
+ Margin = 8
+ OnColorChanged = cbtDotONColorColorChanged
+ end
+ object cbtDotOFFColor: TColorButton
+ Left = 288
+ Height = 25
+ Top = 492
+ Width = 123
+ BorderWidth = 2
+ ButtonColorAutoSize = False
+ ButtonColorSize = 16
+ ButtonColor = clBlack
+ Caption = 'Dot color OFF'
+ Margin = 8
+ OnColorChanged = cbtDotOFFColorColorChanged
+ end
+ object seDisplayLineCount: TSpinEdit
+ Left = 814
+ Height = 23
+ Top = 410
+ Width = 58
+ OnChange = seDisplayLineCountChange
+ TabOrder = 10
+ end
+ object Label4: TLabel
+ Left = 704
+ Height = 15
+ Top = 413
+ Width = 95
+ Caption = 'Screen row count:'
+ Color = clDefault
+ ParentColor = False
+ end
+ object seWidth: TSpinEdit
+ Left = 625
+ Height = 23
+ Top = 438
+ Width = 58
+ OnChange = seWidthChange
+ TabOrder = 11
+ end
+ object Label5: TLabel
+ Left = 563
+ Height = 15
+ Top = 441
+ Width = 35
+ Caption = 'Width:'
+ Color = clDefault
+ ParentColor = False
+ end
+ object seHeigth: TSpinEdit
+ Left = 625
+ Height = 23
+ Top = 466
+ Width = 58
+ OnChange = seHeigthChange
+ TabOrder = 12
+ end
+ object Label6: TLabel
+ Left = 563
+ Height = 15
+ Top = 469
+ Width = 39
+ Caption = 'Heigth:'
+ Color = clDefault
+ ParentColor = False
+ end
+ object Label7: TLabel
+ Left = 704
+ Height = 15
+ Top = 441
+ Width = 91
+ Caption = 'Screen col count:'
+ Color = clDefault
+ ParentColor = False
+ end
+ object seDisplayCharCount: TSpinEdit
+ Left = 814
+ Height = 23
+ Top = 438
+ Width = 58
+ OnChange = seDisplayCharCountChange
+ TabOrder = 13
+ end
+ object cbColorSchemes: TComboBox
+ Left = 288
+ Height = 23
+ Top = 354
+ Width = 100
+ ItemHeight = 15
+ Items.Strings = (
+ 'csCustom'
+ 'csBlue'
+ 'csGreen'
+ 'csInvGreen'
+ )
+ OnChange = cbColorSchemesChange
+ TabOrder = 14
+ Text = 'cbColorSchemes'
+ end
+ object Label8: TLabel
+ Left = 288
+ Height = 15
+ Top = 336
+ Width = 76
+ Caption = 'Color scheme:'
+ Color = clDefault
+ ParentColor = False
+ end
+ object Label9: TLabel
+ Left = 288
+ Height = 15
+ Top = 392
+ Width = 119
+ Caption = 'Custom color scheme:'
+ Color = clDefault
+ ParentColor = False
+ end
+end
diff --git a/components/industrialstuff/Example/LCDDisplay/untmain.pas b/components/industrialstuff/Example/LCDDisplay/untmain.pas
new file mode 100644
index 000000000..78809c583
--- /dev/null
+++ b/components/industrialstuff/Example/LCDDisplay/untmain.pas
@@ -0,0 +1,229 @@
+unit untMain;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
+ Spin, indLCDDisplay;
+
+type
+
+ { TfrmMain }
+
+ TfrmMain = class(TForm)
+ cbAutoSize: TCheckBox;
+ cbCharSpace: TCheckBox;
+ cbtFrameColor: TColorButton;
+ cbtBoardColor: TColorButton;
+ cbtDotONColor: TColorButton;
+ cbtDotOFFColor: TColorButton;
+ cbColorSchemes: TComboBox;
+ Label1: TLabel;
+ Label2: TLabel;
+ Label3: TLabel;
+ Label4: TLabel;
+ Label5: TLabel;
+ Label6: TLabel;
+ Label7: TLabel;
+ Label8: TLabel;
+ Label9: TLabel;
+ mmText: TMemo;
+ rgFrameStyle: TRadioGroup;
+ rgFrameColorStyle: TRadioGroup;
+ rgDotShape: TRadioGroup;
+ rgFrameHeight: TRadioGroup;
+ seDotSize: TSpinEdit;
+ seFrameSize: TSpinEdit;
+ seDotsSpace: TSpinEdit;
+ seDisplayCharCount: TSpinEdit;
+ seWidth: TSpinEdit;
+ seHeigth: TSpinEdit;
+ seDisplayLineCount: TSpinEdit;
+ procedure cbAutoSizeChange(Sender: TObject);
+ procedure cbCharSpaceChange(Sender: TObject);
+ procedure cbColorSchemesChange(Sender: TObject);
+ procedure cbtFrameColorColorChanged(Sender: TObject);
+ procedure cbtBoardColorColorChanged(Sender: TObject);
+ procedure cbtDotONColorColorChanged(Sender: TObject);
+ procedure cbtDotOFFColorColorChanged(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ procedure mmTextChange(Sender: TObject);
+ procedure rgFrameStyleClick(Sender: TObject);
+ procedure rgFrameColorStyleClick(Sender: TObject);
+ procedure rgDotShapeClick(Sender: TObject);
+ procedure rgFrameHeightClick(Sender: TObject);
+ procedure seDisplayCharCountChange(Sender: TObject);
+ procedure seDotSizeChange(Sender: TObject);
+ procedure seDotsSpaceChange(Sender: TObject);
+ procedure seFrameSizeChange(Sender: TObject);
+ procedure seHeigthChange(Sender: TObject);
+ procedure seDisplayLineCountChange(Sender: TObject);
+ procedure seWidthChange(Sender: TObject);
+ private
+ LCDLines1: TLCDLines;
+
+ public
+
+ end;
+
+var
+ frmMain: TfrmMain;
+
+implementation
+
+{$R *.lfm}
+
+{ TfrmMain }
+
+procedure TfrmMain.cbtFrameColorColorChanged(Sender: TObject);
+begin
+ LCDLines1.FrameColor := cbtFrameColor.ButtonColor;
+end;
+
+procedure TfrmMain.cbtBoardColorColorChanged(Sender: TObject);
+begin
+ LCDLines1.BoardColor := cbtBoardColor.ButtonColor;
+end;
+
+procedure TfrmMain.cbtDotONColorColorChanged(Sender: TObject);
+begin
+ LCDLines1.DotColorON := cbtDotONColor.ButtonColor;
+end;
+
+procedure TfrmMain.cbtDotOFFColorColorChanged(Sender: TObject);
+begin
+ LCDLines1.DotColorOFF := cbtDotOFFColor.ButtonColor;
+end;
+
+procedure TfrmMain.FormCreate(Sender: TObject);
+begin
+ LCDLines1 := TLCDLines.Create(self);
+ with LCDLines1 do
+ begin
+ Left := 24;
+ Height := 101;
+ Top := 16;
+ Width := 290;
+ AutoSize := True;
+ DotColorOn := 5162664;
+ DotColorOff := 2900284;
+ DisplayCharCount := 0;
+ Lines.Add('TLCDLines');
+ ColorScheme := csInvGreen;
+ Parent := self;
+ end
+end;
+
+procedure TfrmMain.FormShow(Sender: TObject);
+begin
+ mmText.Lines := LCDLines1.Lines;
+ seDisplayLineCount.Value := LCDLines1.DisplayLineCount;
+ seDisplayCharCount.Value := LCDLines1.DisplayCharCount;
+ seFrameSize.Value := LCDLines1.FrameSize;
+ seDotSize.Value := LCDLines1.DotSize;
+ seDotsSpace.Value := LCDLines1.DotsSpace;
+ seWidth.Value := LCDLines1.Width;
+ seHeigth.Value := LCDLines1.Height;
+ cbAutoSize.Checked := LCDLines1.AutoSize;
+ cbCharSpace.Checked := LCDLines1.CharSpace;
+ cbtFrameColor.ButtonColor := LCDLines1.FrameColor;
+ cbtBoardColor.ButtonColor := LCDLines1.BoardColor;
+ cbtDotONColor.ButtonColor := LCDLines1.DotColorOn;
+ cbtDotOFFColor.ButtonColor := LCDLines1.DotColorOff;
+ rgFrameStyle.ItemIndex := integer(LCDLines1.FrameStyle);
+ rgFrameColorStyle.ItemIndex := integer(LCDLines1.FrameColorStyle);
+ rgDotShape.ItemIndex := integer(LCDLines1.DotShape);
+ rgFrameHeight.ItemIndex := integer(LCDLines1.FrameHeight);
+ cbColorSchemes.ItemIndex:= integer(LCDLines1.ColorScheme);
+end;
+
+procedure TfrmMain.cbAutoSizeChange(Sender: TObject);
+begin
+ LCDLines1.AutoSize := cbAutoSize.Checked;
+ if not cbAutoSize.Checked then
+ begin
+ LCDLines1.Width := seWidth.Value;
+ LCDLines1.Height := seHeigth.Value;
+ end;
+end;
+
+procedure TfrmMain.cbCharSpaceChange(Sender: TObject);
+begin
+ LCDLines1.CharSpace := cbCharSpace.Checked;
+end;
+
+procedure TfrmMain.cbColorSchemesChange(Sender: TObject);
+begin
+ LCDLines1.ColorScheme := TColorScheme(cbColorSchemes.ItemIndex);
+end;
+
+procedure TfrmMain.mmTextChange(Sender: TObject);
+begin
+ LCDLines1.Lines.Assign(mmText.Lines);
+ if LCDLines1.AutoSize then
+ begin
+ LCDLines1.InvalidatePreferredSize;
+ LCDLines1.AdjustSize;
+ end;
+ LCDLines1.Invalidate;
+end;
+
+procedure TfrmMain.rgFrameStyleClick(Sender: TObject);
+begin
+ LCDLines1.FrameStyle := TFrameStyle(rgFrameStyle.ItemIndex);
+end;
+
+procedure TfrmMain.rgFrameColorStyleClick(Sender: TObject);
+begin
+ LCDLines1.FrameColorStyle := TFrameColorStyle(rgFrameColorStyle.ItemIndex);
+end;
+
+procedure TfrmMain.rgDotShapeClick(Sender: TObject);
+begin
+ LCDLines1.DotShape := TDotShape(rgDotShape.ItemIndex);
+end;
+
+procedure TfrmMain.rgFrameHeightClick(Sender: TObject);
+begin
+ LCDLines1.FrameHeight := TFrameHeight(rgFrameHeight.ItemIndex);
+end;
+
+procedure TfrmMain.seDisplayCharCountChange(Sender: TObject);
+begin
+ LCDLines1.DisplayCharCount := seDisplayCharCount.Value;
+end;
+
+procedure TfrmMain.seDotSizeChange(Sender: TObject);
+begin
+ LCDLines1.DotSize := seDotSize.Value;
+end;
+
+procedure TfrmMain.seDotsSpaceChange(Sender: TObject);
+begin
+ LCDLines1.DotsSpace := seDotsSpace.Value;
+end;
+
+procedure TfrmMain.seFrameSizeChange(Sender: TObject);
+begin
+ LCDLines1.FrameSize := seFrameSize.Value;
+end;
+
+procedure TfrmMain.seHeigthChange(Sender: TObject);
+begin
+ LCDLines1.Height := seHeigth.Value;
+end;
+
+procedure TfrmMain.seDisplayLineCountChange(Sender: TObject);
+begin
+ LCDLines1.DisplayLineCount := seDisplayLineCount.Value;
+end;
+
+procedure TfrmMain.seWidthChange(Sender: TObject);
+begin
+ LCDLines1.Width := seWidth.Value;
+end;
+
+end.
diff --git a/components/industrialstuff/industrial.lpk b/components/industrialstuff/industrial.lpk
index 17f88239a..7604d5f16 100644
--- a/components/industrialstuff/industrial.lpk
+++ b/components/industrialstuff/industrial.lpk
@@ -28,79 +28,84 @@
+- Stop-light lamps
+- Analog gauges
+- Thermometer-like gauge
+- Knob
+- On/off switch
+- Multislider"/>
-
-
+
+ -
-
-
+
+ -
-
-
+
+ -
-
-
+
+ -
-
-
+
+ -
-
-
+
+ -
-
-
+
+ -
-
-
+
+ -
-
-
+
+ -
-
-
+
+ -
-
-
+
+ -
-
-
+
+ -
-
-
+
+ -
-
-
+
+ -
-
-
+
+
+ -
+
+
+
-
-
+
+ -
-
+
diff --git a/components/industrialstuff/industrial.pas b/components/industrialstuff/industrial.pas
index 88a6adec5..1e3c74088 100644
--- a/components/industrialstuff/industrial.pas
+++ b/components/industrialstuff/industrial.pas
@@ -10,7 +10,7 @@ interface
uses
IndLed, Sensors, AllIndustrialRegister, LedNumber, indGnouMeter, AdvLed,
indcyBaseLed, indcyClasses, indcyGraphics, indcyTypes, A3nalogGauge, MKnob,
- switches, indSliders, LazarusPackageIntf;
+ switches, indSliders, indLCDDisplay, LazarusPackageIntf;
implementation
diff --git a/components/industrialstuff/resources/industrial_icons.txt b/components/industrialstuff/resources/industrial_icons.txt
index 667541f2f..c49e62dd7 100644
--- a/components/industrialstuff/resources/industrial_icons.txt
+++ b/components/industrialstuff/resources/industrial_icons.txt
@@ -28,3 +28,6 @@ tonoffswitch_200.png
tmultislider.png
tmultislider_150.png
tmultislider_200.png
+tlcddisplay.png
+tlcddisplay_150.png
+tlcddisplay_200.png
diff --git a/components/industrialstuff/resources/tlcddisplay.png b/components/industrialstuff/resources/tlcddisplay.png
new file mode 100644
index 000000000..e0b0e31f8
Binary files /dev/null and b/components/industrialstuff/resources/tlcddisplay.png differ
diff --git a/components/industrialstuff/resources/tlcddisplay_150.png b/components/industrialstuff/resources/tlcddisplay_150.png
new file mode 100644
index 000000000..74e815ae2
Binary files /dev/null and b/components/industrialstuff/resources/tlcddisplay_150.png differ
diff --git a/components/industrialstuff/resources/tlcddisplay_200.png b/components/industrialstuff/resources/tlcddisplay_200.png
new file mode 100644
index 000000000..bc036ff08
Binary files /dev/null and b/components/industrialstuff/resources/tlcddisplay_200.png differ
diff --git a/components/industrialstuff/source/AllIndustrialRegister.pas b/components/industrialstuff/source/AllIndustrialRegister.pas
index 5982d8f93..c85842067 100644
--- a/components/industrialstuff/source/AllIndustrialRegister.pas
+++ b/components/industrialstuff/source/AllIndustrialRegister.pas
@@ -11,8 +11,8 @@ interface
uses
- Classes, LResources, AdvLed, IndLed, LedNumber, Sensors, IndGnouMeter,
- A3nalogGauge, MKnob, Switches, indSliders;
+ Classes, LResources, AdvLed, IndLed, LedNumber, Sensors, indGnouMeter,
+ A3nalogGauge, MKnob, Switches, indSliders, indLCDDisplay;
procedure Register;
@@ -26,7 +26,7 @@ begin
RegisterComponents ('Industrial',[
TAdvLed, TIndLed, TLedNumber, TStopLightSensor,
TAnalogSensor, TA3nalogGauge, TindGnouMeter,
- TmKnob, TOnOffSwitch, TMultiSlider
+ TmKnob, TOnOffSwitch, TMultiSlider, TLCDDisplay
]);
end;
diff --git a/components/industrialstuff/source/indlcddisplay.pas b/components/industrialstuff/source/indlcddisplay.pas
new file mode 100644
index 000000000..48e4a7d45
--- /dev/null
+++ b/components/industrialstuff/source/indlcddisplay.pas
@@ -0,0 +1,898 @@
+{
+ *****************************************************************************
+ See the file COPYING.modifiedLGPL.txt, included in your Lazarus installation
+ for details about the license.
+ *****************************************************************************
+ Based on LCDLine by Yuriy Tereshchenko
+ Initial Lazarus port and multi-line extension: Boban Spasic (spasic@gmail.com)
+ Further optimizations and extensions: Werner Pamler
+}
+unit indLCDDisplay;
+
+interface
+
+uses
+ SysUtils, Classes, Controls, fgl, Graphics, LResources, LCLIntf;
+
+type
+ TFrameStyle = (fsRelief, fsNone, fsLowered, fsRaised);
+ TFrameColorStyle = (stWindows, stColor);
+ TFrameHeight = (fhDouble, fhSingle);
+ TDotShape = (stSquare, stRound);
+ TColorScheme = (csCustom, csBlue, csGreen, csInvGreen);
+
+type
+ TDotMatrix = array of integer;
+ TDotMatrixList = specialize TFPGMap;
+
+ TLCDDisplay = class(TGraphicControl)
+ private
+ BitMap: TBitMap;
+ {
+ one char consists of Col x Row of dots
+ dots have size and space between dots
+ }
+ FDotSize: integer; // dot size in pixels
+ FDotsSpace: integer; // inter-dots space in pixels
+ FDotColsCount: integer; // number of dot-cols in char matrix
+ FDotRowsCount: integer; // number of dot-rows in char matrix
+ FCharCount: integer;
+ FGlobalDotColsCount: integer;
+ FCharWidth: integer;
+
+ FFrameSize: integer;
+ FBoardWidth: integer;
+ FBoardHeight: integer;
+ FLEDWidth: integer;
+ FLEDHeight: integer;
+
+ FFrameColor: TColor;
+ FBoardColor: TColor;
+ FDotColorOn: TColor;
+ FDotColorOff: TColor;
+
+ FLenText: integer;
+ FDisplayLineCount: integer;
+ FDisplayCharCount: integer;
+ FLines: TStringList;
+ FCharSpace: boolean;
+ FColorScheme: TColorScheme;
+ FCountOn: integer;
+ FFrameStyle: TFrameStyle;
+ FFrameHeight: TFrameHeight;
+ FFrameColorStyle: TFrameColorStyle;
+ FDotShape: TDotShape;
+
+ FCharList: TDotMatrixList;
+
+ procedure SetDotShape(const Value: TDotShape);
+ procedure SetFrameColorStyle(const Value: TFrameColorStyle);
+ procedure SetFrameHeight(const Value: TFrameHeight);
+ procedure SetFrameStyle(const Value: TFrameStyle);
+ procedure SetCharSpace(const Value: boolean);
+ procedure SetColorScheme(const Value: TColorScheme);
+
+ function GetCharCount: longint;
+ function GetGlobalDotColsCount: longint;
+ procedure SetDisplayLineCount(const Value: integer);
+ procedure SetDisplayCharCount(const Value: integer);
+ procedure SetLines(const Value: TStringList);
+ procedure SetDotColorOff(const Value: TColor);
+ procedure SetDotColorOn(const Value: TColor);
+ procedure SetBoardColor(const Value: TColor);
+ procedure SetFrameColor(const Value: TColor);
+ procedure SetFrameSize(const Value: integer);
+ procedure SetDotSize(const Value: integer);
+ procedure SetDotsSpace(const Value: integer);
+
+ function CalcCharCount: integer;
+ procedure InitCharList(AHorDots, AVertDots: integer);
+ //calculate widths and heigths of the char matrix, background border and frame
+ procedure DrawCalc();
+ //draw frame
+ procedure DrawBorder();
+ //background grid of dots that are off
+ procedure DrawGrid();
+ //space between chars
+ procedure DrawSpace();
+ //call DrawChar for every char
+ procedure DrawText();
+ //call DrawDot for every dot that is on
+ procedure DrawChar(Row, Col, NChar: integer);
+ procedure DrawDot(Row, Col: integer; DotColor: TColor);
+ //draw frame shadow
+ procedure DrawShadow(StartP, EndP: TPoint; LineColor1, LineColor2: TColor);
+ procedure DrawBitmapToCanvas();
+
+ protected
+ procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
+ {%H-}WithThemeSpace: boolean); override;
+ procedure DoAutoAdjustLayout(const AMode: TLayoutAdjustmentPolicy;
+ const AXProportion, AYProportion: double); override;
+ procedure Paint; override;
+
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+
+ procedure AddDotMatrix(AChar: string; const Dots: array of integer);
+
+ property DotColsCount: integer read FDotColsCount;
+ property DotRowsCount: integer read FDotRowsCount;
+
+ property CharCount: longint read GetCharCount;
+ property GlobalDotColsCount: longint read GetGlobalDotColsCount;
+
+
+ published
+ property AutoSize;
+ property BorderSpacing;
+ property ShowHint;
+ property Visible;
+ property OnClick;
+ property OnDblClick;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+
+ property DotSize: integer read FDotSize write SetDotSize default 4;
+ property DotsSpace: integer read FDotsSpace write SetDotsSpace default 1;
+ property FrameSize: integer read FFrameSize write SetFrameSize default 8;
+
+ property FrameColor: TColor read FFrameColor write SetFrameColor default clBtnFace;
+ // To use BoardColor, ColorScheme must be set to csCustom
+ property BoardColor: TColor read FBoardColor write SetBoardColor default clBlack;
+ // To use DotColorOn, ColorScheme must be set to csCustom
+ property DotColorOn: TColor read FDotColorOn write SetDotColorOn default clSkyBlue;
+ // To use DotColorOff, ColorScheme must be set to csCustom
+ property DotColorOff: TColor read FDotColorOff write SetDotColorOff default clTeal;
+ // Vertical screen size in chars
+ // Without AutoSize, if the frame is too small
+ // a part off the text will not be visible
+ // e.g. frame is big enough for one line
+ // and the text contains 3 lines
+ // - just the middle line will be visible
+ property DisplayLineCount: integer read FDisplayLineCount write SetDisplayLineCount default 2;
+ // Horizontal screen size in chars
+ // Set to <=0 (zero) to have a real AutoSize
+ // Has no effect without AutoSize
+ property DisplayCharCount: integer read FDisplayCharCount write SetDisplayCharCount default 10;
+ // The text to display
+ // It will be truncated according
+ // to ScreenRowCount and ScreenColCount
+ property Lines: TStringList read FLines write SetLines;
+ // Insert one-dot space between chars
+ property CharSpace: boolean read FCharSpace write SetCharSpace default False;
+ // Pre-defined color schemes
+ // Set to csCustom in order to use
+ // the BoardColor, DotColorOn and DotColorOff
+ property ColorScheme: TColorScheme
+ read FColorScheme write SetColorScheme default csCustom;
+ property FrameStyle: TFrameStyle
+ read FFrameStyle write SetFrameStyle default fsRelief;
+ property FrameHeight: TFrameHeight
+ read FFrameHeight write SetFrameHeight default fhDouble;
+ property FrameColorStyle: TFrameColorStyle
+ read FFrameColorStyle write SetFrameColorStyle default stWindows;
+ property DotShape: TDotShape read FDotShape write SetDotShape default stSquare;
+ end;
+
+implementation
+
+uses
+ Dialogs, LazUTF8, LazUnicode;
+
+constructor TLCDDisplay.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ ControlStyle := ControlStyle + [csOpaque];
+
+ Width := 156;
+ Height := 76;
+
+ FDisplayLineCount := 2;
+ FDisplayCharCount := 10;
+
+ FCharList := TDotMatrixList.Create;
+ FCharList.Sorted := True;
+
+ FDotColsCount := 5;
+ FDotRowsCount := 7;
+ InitCharList(FDotColsCount, FDotRowsCount);
+
+ FDotSize := 4;
+ FDotsSpace := 1;
+ FFrameSize := 8;
+ FBoardWidth := 4;
+
+ FFrameColor := clBtnFace;
+ FBoardColor := clBlack;
+ FDotColorOn := clSkyBlue;
+ FDotColorOff := clTeal;
+
+ BitMap := TBitMap.Create;
+ FCountOn := 255;
+
+ FLines := TStringList.Create;
+end;
+
+destructor TLCDDisplay.Destroy;
+begin
+ BitMap.Free;
+ FCharList.Free;
+ FLines.Free;
+ inherited Destroy;
+end;
+
+procedure TLCDDisplay.AddDotMatrix(AChar: string; const Dots: array of integer);
+var
+ matrix: TDotMatrix = nil;
+ i: integer;
+begin
+ if Length(Dots) <> FDotRowsCount then
+ raise Exception.Create('AddDotMatrix: Incorrect number of rows.');
+ SetLength(matrix, FDotRowsCount);
+ for i := 0 to FDotRowsCount - 1 do
+ matrix[i] := Dots[i];
+ FCharList.Add(AChar, matrix);
+end;
+
+procedure TLCDDisplay.CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
+ WithThemeSpace: boolean);
+begin
+ FCharWidth := (DotSize * FDotColsCount) + (DotsSpace * (FDotColsCount + 1)); //pixels
+ FCharCount := CalcCharCount;
+ FGlobalDotColsCount := (FCharCount * FDotColsCount) + (FCharCount - 1); //dots
+
+ // total matrix width
+ FLEDWidth := (FGlobalDotColsCount * DotSize) + ((FGlobalDotColsCount - 1) * DotsSpace);
+ // total matrix height
+ FLEDHeight := (FDisplayLineCount * FDotRowsCount * (DotSize + DotsSpace)) +
+ ((FDisplayLineCount - 1) * (DotSize + DotsSpace));
+ if FCharSpace then
+ FLEDHeight := FLEDHeight + ((FDisplayLineCount - 1) * DotsSpace);
+
+ //background around text matrix - left/right pixels
+ FBoardWidth := DotSize + DotsSpace;
+ //background around text matrix - up/down pixels
+ FBoardHeight := DotSize + DotsSpace;
+
+ //Total size incl. frame
+ PreferredWidth := FLEDWidth + (2 * FrameSize) + (2 * FBoardWidth);
+ PreferredHeight := FLEDHeight + (2 * FrameSize) + (2 * FBoardWidth);
+end;
+
+procedure TLCDDisplay.DoAutoAdjustLayout(const AMode: TLayoutAdjustmentPolicy;
+ const AXProportion, AYProportion: double);
+begin
+ inherited;
+ if AMode in [lapAutoAdjustWithoutHorizontalScrolling, lapAutoAdjustForDPI] then
+ begin
+ FDotSize := round(FDotSize * AXProportion);
+ FDotsSpace := round(FDotsSpace * AXProportion);
+ FFrameSize := round(FFrameSize * AXProportion);
+ end;
+end;
+
+procedure TLCDDisplay.DrawCalc();
+begin
+ FCharWidth := (DotSize * FDotColsCount) + (DotsSpace * (FDotColsCount + 1)); //pixels
+ FCharCount := ((Width - (2 * FrameSize)) + DotSize) div (FCharWidth + DotSize);
+ FGlobalDotColsCount := (FCharCount * FDotColsCount) + (FCharCount - 1); //dots
+
+ // total matrix width
+ FLEDWidth := (FGlobalDotColsCount * DotSize) + ((FGlobalDotColsCount - 1) * DotsSpace);
+ // total matrix height
+ FLEDHeight := (FDisplayLineCount * FDotRowsCount * (DotSize + DotsSpace)) +
+ ((FDisplayLineCount - 1) * (DotSize + DotsSpace));
+ if FCharSpace then
+ FLEDHeight := FLEDHeight + ((FDisplayLineCount - 1) * DotsSpace);
+
+ FBoardWidth := (Width - 2 * FrameSize - FLEDWidth) div 2;
+ FBoardHeight := (Height - 2 * FrameSize - FLEDHeight) div 2;
+
+ BitMap.Width := Width;
+ BitMap.Height := Height;
+end;
+
+procedure TLCDDisplay.DrawBorder();
+var
+ FStart, FEnd: TPoint;
+ BStart, BEnd: TPoint;
+ Color1, Color2, Color3, Color4: TColor;
+ C: longint;
+ R, G, B: integer;
+const
+ K1 = 4.637;
+ K2 = 1.364;
+ K3 = 1.372093;
+ K4 = 2.088495;
+begin
+
+ BStart.X := FrameSize;
+ BStart.Y := FrameSize;
+ BEnd.X := Width - FrameSize;
+ BEnd.Y := Height - FrameSize;
+
+ with BitMap.Canvas do
+ begin
+ Brush.Color := FrameColor;
+ Pen.Color := FrameColor;
+ Rectangle(0, 0, BitMap.Width, BitMap.Height);
+ Brush.Color := FBoardColor;
+ Pen.Color := FBoardColor;
+ Rectangle(BStart.X, BStart.Y, BEnd.X, BEnd.Y);
+ end;
+
+ if FrameStyle = fsNone then
+ Exit;
+
+ if FrameColorStyle = stWindows then
+ C := ColorToRGB(clBtnFace)
+ else
+ C := ColorToRGB(FrameColor);
+
+ R := RED(C);
+ G := GREEN(C);
+ B := BLUE(C);
+
+ if FrameColorStyle = stWindows then
+ Color1 := clWhite
+ else
+ Color1 := RGBToColor(Round(R / K1 + 200), Round(G / K1 + 200), Round(B / K1 + 200));
+
+ Color2 := RGBToColor(Round(R / K2 + 68), Round(G / K2 + 68), Round(B / K2 + 68));
+ Color3 := RGBToColor(Round(R / K3), Round(G / K3), Round(B / K3));
+
+ if FrameHeight = fhDouble then
+ Color4 := RGBToColor(Round(R / K4), Round(G / K4), Round(B / K4))
+ else
+ Color4 := Color3;
+
+ FStart.X := 0;
+ FStart.Y := 0;
+ FEnd.X := Width - 1;
+ FEnd.Y := Height - 1;
+
+ BStart.X := FrameSize;
+ BStart.Y := FrameSize;
+ BEnd.X := Width - FrameSize - 1;
+ BEnd.Y := Height - FrameSize - 1;
+
+ if (FrameStyle = fsRaised) or (FrameStyle = fsRelief) then
+ begin
+ DrawShadow(FStart, FEnd, Color1, Color4);
+
+ if FrameHeight = fhDouble then
+ begin
+ FStart.X := FStart.X + 1;
+ FStart.Y := FStart.Y + 1;
+ FEnd.X := FEnd.X - 1;
+ FEnd.Y := FEnd.Y - 1;
+ DrawShadow(FStart, FEnd, Color2, Color3);
+ end;
+ end;
+
+ if (FrameStyle = fsLowered) or (FrameStyle = fsRelief) then
+ begin
+ DrawShadow(BStart, BEnd, Color3, Color1);
+ if FrameHeight = fhDouble then
+ begin
+ BStart.X := BStart.X + 1;
+ BStart.Y := BStart.Y + 1;
+ BEnd.X := BEnd.X - 1;
+ BEnd.Y := BEnd.Y - 1;
+ DrawShadow(BStart, BEnd, Color4, Color2);
+ end;
+ end;
+end;
+
+procedure TLCDDisplay.DrawShadow(StartP, EndP: TPoint; LineColor1, LineColor2: TColor);
+begin
+ with BitMap.Canvas do
+ begin
+ Pen.Color := LineColor1;
+ MoveTo(EndP.X, StartP.Y);
+ LineTo(StartP.X, StartP.Y);
+ LineTo(StartP.X, EndP.Y);
+
+ Pen.Color := LineColor2;
+ MoveTo(EndP.X, StartP.Y);
+ LineTo(EndP.X, EndP.Y);
+ LineTo(StartP.X - 1, EndP.Y);
+ end;
+end;
+
+procedure TLCDDisplay.DrawGrid();
+var
+ y, x: integer;
+ NRow, NCol: integer;
+begin
+
+ NRow := (FDotRowsCount + 1) * FDisplayLineCount - 1;
+ NCol := (FDotColsCount + 1) * FCharCount - 1;
+
+ for y := 0 to NRow - 1 do
+ for x := 0 to NCol - 1 do
+ DrawDot(y, x, FDotColorOff);
+
+end;
+
+procedure TLCDDisplay.DrawSpace();
+var
+ y, x: integer;
+ NRow, NCol: integer;
+ i, j, lc: integer;
+begin
+ //i - vertical spaces
+ //j - horizontal spaces
+ for lc := 0 to FDisplayLineCount - 1 do
+ begin
+ NRow := FDotRowsCount + 1;
+ NCol := (FDotColsCount + 1) * FCharCount - 1;
+
+ j := 0;
+ for y := 0 to (NRow * (lc + 1)) do
+ begin
+ i := 0;
+ for x := 0 to NCol - 1 do
+ begin
+ if ((i = 5) or (j = 7)) and (y < (NRow * (lc + 1))) then
+ begin
+ DrawDot(y, x, FBoardColor);
+ i := 0;
+ end
+ else
+ i := i + 1;
+ end;
+ if j = 7 then
+ begin
+ j := 0;
+ end
+ else
+ j := j + 1;
+ end;
+ end;
+end;
+
+procedure TLCDDisplay.DrawText();
+var
+ x, y, c: integer;
+ DotRow: integer;
+ DotOn: boolean;
+ i, j: integer;
+ line: string;
+ ch: string;
+ matrix: TDotMatrix;
+begin
+ for i := 0 to FDisplayLineCount - 1 do
+ begin
+ if i < FLines.Count then
+ begin
+ line := FLines[i];
+ FLenText := UTF8Length(line);
+
+ c := 0;
+ for ch in line do
+ begin
+ Inc(c);
+ if not FCharList.Find(ch, j) then
+ exit;
+ matrix := FCharList[ch];
+ for y := 0 to FDotRowsCount - 1 do
+ begin
+ DotRow := matrix[y];
+ for x := 0 to 4 do
+ begin
+ DotOn := DotRow and (1 shl (5 - x - 1)) > 0;
+ if DotOn then
+ DrawChar(y + 8 * i, x, c);
+ end; // for x
+ end; // for y
+ end; // for ch
+ end;
+
+ if CharSpace then
+ DrawSpace();
+ end;
+end;
+
+
+procedure TLCDDisplay.DrawChar(Row, Col, NChar: integer);
+begin
+
+ Col := Col + ((FDotColsCount + 1) * (NChar - 1));
+ if Col > FGlobalDotColsCount - 1 then
+ Exit;
+ if Col < 0 then
+ Exit;
+ DrawDot(Row, Col, FDotColorOn);
+
+end;
+
+procedure TLCDDisplay.DrawDot(Row, Col: integer; DotColor: TColor);
+var
+ DotR: TRect;
+begin
+ DotR.Left := FrameSize + FBoardWidth + (DotSize + DotsSpace) * Col;
+ DotR.Top := FrameSize + FBoardHeight + (DotSize + DotsSpace) * Row;
+ DotR.Right := DotR.Left + DotSize;
+ DotR.Bottom := DotR.Top + DotSize;
+
+ if FFrameHeight = fhSingle then
+ begin
+ if (DotR.Top <= FFrameSize) or (DotR.Bottom >= Height - FFrameSize) then
+ exit;
+ if (DotR.Left <= FFrameSize) or (DotR.Right >= Width - FFrameSize) then
+ exit;
+ end
+ else
+ begin
+ if (DotR.Top <= FFrameSize + 1) or (DotR.Bottom >= Height - FFrameSize - 1) then
+ exit;
+ if (DotR.Left <= FFrameSize + 1) or (DotR.Right >= Width - FFrameSize - 1) then
+ exit;
+ end;
+
+ with BitMap.Canvas do
+ begin
+ Pen.Color := DotColor;
+ Brush.Color := DotColor;
+
+ if DotShape = stSquare then
+ FillRect(DotR)
+ else
+ Ellipse(DotR.Left, DotR.Top, DotR.Right, DotR.Bottom);
+ end;
+end;
+
+procedure TLCDDisplay.DrawBitmapToCanvas();
+begin
+ Canvas.Draw(0, 0, BitMap);
+end;
+
+// Find the longest's line length
+function TLCDDisplay.CalcCharCount: integer;
+var
+ len: integer;
+ i, tmp: integer;
+begin
+ len := 1;
+ if FDisplayCharCount > 0 then
+ Result := FDisplayCharCount
+ else
+ begin
+ for i := 0 to FDisplayLineCount - 1 do
+ begin
+ if i < Lines.Count then
+ begin
+ tmp := UTF8Length(Lines[i]);
+ if tmp > Len then Len := tmp;
+ end;
+ end;
+ Result := Len;
+ end;
+end;
+
+procedure TLCDDisplay.InitCharList(AHorDots, AVertDots: integer);
+var
+ i: integer;
+begin
+ FCharList.Clear;
+ if (AHorDots = 5) and (AVertDots = 7) then
+ begin
+ for i := 0 to 32 do
+ AddDotMatrix(char(i), [0, 0, 0, 0, 0, 0, 0]);
+ AddDotMatrix('!', [4, 4, 4, 4, 4, 0, 4]); // #33
+ AddDotMatrix('"', [10, 10, 0, 0, 0, 0, 0]); // #34
+ AddDotMatrix('#', [0, 10, 31, 10, 31, 10, 0]); // #35
+ AddDotMatrix('$', [4, 15, 20, 14, 5, 30, 4]); // #36
+ AddDotMatrix('%', [25, 26, 2, 4, 8, 11, 19]); // #37
+ AddDotMatrix('&', [12, 18, 20, 8, 21, 18, 13]); // #38
+ AddDotMatrix('''', [4, 4, 0, 0, 0, 0, 0]); // #39
+ AddDotMatrix('(', [2, 4, 8, 8, 8, 4, 2]); // #40
+ AddDotMatrix(')', [8, 4, 2, 2, 2, 4, 8]); // #41
+ AddDotMatrix('*', [0, 4, 21, 14, 21, 4, 0]); // #42
+ AddDotMatrix('+', [0, 4, 4, 31, 4, 4, 0]); // #43
+ AddDotMatrix(',', [0, 0, 0, 0, 12, 4, 8]); // #44
+ AddDotMatrix('-', [0, 0, 0, 14, 0, 0, 0]); // #45
+ AddDotMatrix('.', [0, 0, 0, 0, 0, 12, 12]); // #46
+ AddDotMatrix('/', [1, 1, 2, 4, 8, 16, 16]); // #47
+ AddDotMatrix('0', [14, 17, 19, 21, 25, 17, 14]); // #48
+ AddDotMatrix('1', [4, 12, 4, 4, 4, 4, 14]); // #49
+ AddDotMatrix('2', [14, 17, 1, 2, 4, 8, 31]); // #50
+ AddDotMatrix('3', [14, 17, 1, 6, 1, 17, 14]); // #51
+ AddDotMatrix('4', [2, 6, 10, 18, 31, 2, 2]); // #52
+ AddDotMatrix('5', [31, 16, 30, 1, 1, 17, 14]); // #53
+ AddDotMatrix('6', [14, 17, 16, 30, 17, 17, 14]); // #54
+ AddDotMatrix('7', [31, 1, 1, 2, 4, 4, 4]); // #55
+ AddDotMatrix('8', [14, 17, 17, 14, 17, 17, 14]); // #56
+ AddDotMatrix('9', [14, 17, 17, 15, 1, 17, 14]); // #57
+ AddDotMatrix(':', [0, 12, 12, 0, 12, 12, 0]); // #58
+ AddDotMatrix(';', [0, 12, 12, 0, 12, 4, 8]); // #59
+ AddDotMatrix('<', [2, 4, 8, 16, 8, 4, 2]); // #60
+ AddDotMatrix('=', [0, 0, 31, 0, 31, 0, 0]); // #61
+ AddDotMatrix('>', [8, 4, 2, 1, 2, 4, 8]); // #62
+ AddDotMatrix('?', [14, 17, 1, 2, 4, 0, 4]); // #63
+ AddDotMatrix('@', [14, 17, 19, 21, 23, 16, 15]); // #64
+ AddDotMatrix('A', [14, 17, 17, 31, 17, 17, 17]); // #65
+ AddDotMatrix('B', [30, 17, 17, 30, 17, 17, 30]); // #66
+ AddDotMatrix('C', [14, 17, 16, 16, 16, 17, 14]); // #67
+ AddDotMatrix('D', [30, 17, 17, 17, 17, 17, 30]); // #68
+ AddDotMatrix('E', [31, 16, 16, 30, 16, 16, 31]); // #69
+ AddDotMatrix('F', [31, 16, 16, 30, 16, 16, 16]); // #70
+ AddDotMatrix('G', [14, 17, 16, 19, 17, 17, 14]); // #71
+ AddDotMatrix('H', [17, 17, 17, 31, 17, 17, 17]); // #72
+ AddDotMatrix('I', [14, 4, 4, 4, 4, 4, 14]); // #73
+ AddDotMatrix('J', [1, 1, 1, 1, 17, 17, 14]); // #74
+ AddDotMatrix('K', [17, 18, 20, 24, 20, 18, 17]); // #75
+ AddDotMatrix('L', [16, 16, 16, 16, 16, 16, 31]); // #76
+ AddDotMatrix('M', [17, 27, 21, 21, 17, 17, 17]); // #77
+ AddDotMatrix('N', [17, 25, 21, 19, 17, 17, 17]); // #78
+ AddDotMatrix('O', [14, 17, 17, 17, 17, 17, 14]); // #79
+ AddDotMatrix('P', [30, 17, 17, 30, 16, 16, 16]); // #80
+ AddDotMatrix('Q', [14, 17, 17, 17, 17, 14, 1]); // #81
+ AddDotMatrix('R', [30, 17, 17, 30, 17, 17, 17]); // #82
+ AddDotMatrix('S', [14, 17, 16, 14, 1, 17, 14]); // #83
+ AddDotMatrix('T', [31, 4, 4, 4, 4, 4, 4]); // #84
+ AddDotMatrix('U', [17, 17, 17, 17, 17, 17, 14]); // #85
+ AddDotMatrix('V', [17, 17, 17, 17, 17, 10, 4]); // #86
+ AddDotMatrix('W', [17, 17, 17, 17, 21, 27, 17]); // #87
+ AddDotMatrix('X', [17, 10, 4, 4, 4, 10, 17]); // #88
+ AddDotMatrix('Y', [17, 17, 17, 10, 4, 4, 4]); // #89
+ AddDotMatrix('Z', [31, 1, 2, 4, 8, 16, 31]); // #90
+ AddDotMatrix('[', [12, 8, 8, 8, 8, 8, 12]); // #91
+ AddDotMatrix('\', [0, 16, 8, 4, 2, 1, 0]); // #92
+ AddDotMatrix(']', [6, 2, 2, 2, 2, 2, 6]); // #93
+ AddDotMatrix('^', [4, 10, 17, 0, 0, 0, 0]); // #94
+ AddDotMatrix('_', [0, 0, 0, 0, 0, 0, 31]); // #95
+ AddDotMatrix('`', [6, 4, 2, 0, 0, 0, 0]); // #96
+ AddDotMatrix('a', [0, 0, 14, 1, 15, 17, 15]); // #97
+ AddDotMatrix('b', [16, 16, 30, 17, 17, 17, 30]); // #98
+ AddDotMatrix('c', [0, 0, 15, 16, 16, 16, 15]); // #99
+ AddDotMatrix('d', [1, 1, 15, 17, 17, 17, 15]); // #100
+ AddDotMatrix('e', [0, 0, 14, 17, 31, 16, 14]); // #101
+ AddDotMatrix('f', [3, 4, 31, 4, 4, 4, 4]); // #102
+ AddDotMatrix('g', [0, 0, 15, 17, 15, 1, 14]); // #103
+ AddDotMatrix('h', [16, 16, 22, 25, 17, 17, 17]);// #104
+ AddDotMatrix('i', [4, 0, 12, 4, 4, 4, 14]); // #105
+ AddDotMatrix('j', [2, 0, 6, 2, 2, 18, 12]); // #106
+ AddDotMatrix('k', [16, 16, 18, 20, 24, 20, 18]);// #107
+ AddDotMatrix('l', [12, 4, 4, 4, 4, 4, 14]); // #108
+ AddDotMatrix('m', [0, 0, 26, 21, 21, 21, 21]); // #109
+ AddDotMatrix('n', [0, 0, 22, 25, 17, 17, 17]); // #110
+ AddDotMatrix('o', [0, 0, 14, 17, 17, 17, 14]); // #111
+ AddDotMatrix('p', [0, 0, 30, 17, 30, 16, 16]); // #112
+ AddDotMatrix('q', [0, 0, 15, 17, 15, 1, 1]); // #113
+ AddDotMatrix('r', [0, 0, 11, 12, 8, 8, 8]); // #114
+ AddDotMatrix('s', [0, 0, 14, 16, 14, 1, 30]); // #115
+ AddDotMatrix('t', [4, 4, 31, 4, 4, 4, 3]); // #116
+ AddDotMatrix('u', [0, 0, 17, 17, 17, 19, 13]); // #117
+ AddDotMatrix('v', [0, 0, 17, 17, 17, 10, 4]); // #118
+ AddDotMatrix('w', [0, 0, 17, 17, 21, 21, 10]); // #119
+ AddDotMatrix('x', [0, 0, 17, 10, 4, 10, 17]); // #120
+ AddDotMatrix('y', [0, 0, 17, 17, 15, 1, 14]); // #121
+ AddDotMatrix('z', [0, 0, 31, 2, 4, 8, 31]); // #122
+ AddDotMatrix('{', [3, 4, 4, 8, 4, 4, 3]); // #123
+ AddDotMatrix('|', [4, 4, 4, 4, 4, 4, 4]); // #124
+ AddDotMatrix('}', [24, 4, 4, 2, 4, 4, 24]); // #125
+ AddDotMatrix('~', [8, 21, 2, 0, 0, 0, 0]); // #126
+ AddDotMatrix(#127, [0, 0, 0, 0, 0, 0, 0]); // #127
+ end;
+end;
+
+procedure TLCDDisplay.Paint();
+begin
+ DrawCalc();
+ DrawBorder();
+ DrawGrid();
+ DrawText();
+ DrawBitmapToCanvas();
+end;
+
+procedure TLCDDisplay.SetBoardColor(const Value: TColor);
+begin
+ if Value = FBoardColor then
+ Exit;
+ FBoardColor := Value;
+ SetColorScheme(csCustom);
+end;
+
+procedure TLCDDisplay.SetDotColorOff(const Value: TColor);
+begin
+ if Value = FDotColorOff then
+ Exit;
+ FDotColorOff := Value;
+ SetColorScheme(csCustom);
+end;
+
+procedure TLCDDisplay.SetDotColorOn(const Value: TColor);
+begin
+ if Value = FDotColorOn then
+ Exit;
+ FDotColorOn := Value;
+ SetColorScheme(csCustom);
+end;
+
+procedure TLCDDisplay.SetDotSize(const Value: integer);
+begin
+ if Value = DotSize then
+ Exit;
+ FDotSize := Value;
+ if AutoSize then
+ begin
+ InvalidatePreferredSize;
+ AdjustSize;
+ end;
+ Invalidate;
+end;
+
+procedure TLCDDisplay.SetDotsSpace(const Value: integer);
+begin
+ if Value = DotsSpace then
+ Exit;
+ FDotsSpace := Value;
+ if AutoSize then
+ begin
+ InvalidatePreferredSize;
+ AdjustSize;
+ end;
+ Invalidate;
+end;
+
+procedure TLCDDisplay.SetDotShape(const Value: TDotShape);
+begin
+ if Value = DotShape then
+ Exit;
+ FDotShape := Value;
+ Invalidate;
+end;
+
+procedure TLCDDisplay.SetFrameColor(const Value: TColor);
+begin
+ if Value = FrameColor then
+ Exit;
+ FFrameColor := Value;
+ Invalidate;
+end;
+
+procedure TLCDDisplay.SetFrameColorStyle(const Value: TFrameColorStyle);
+begin
+ if Value = FrameColorStyle then
+ Exit;
+ FFrameColorStyle := Value;
+ Invalidate;
+end;
+
+procedure TLCDDisplay.SetFrameHeight(const Value: TFrameHeight);
+begin
+ if Value = FrameHeight then
+ Exit;
+ FFrameHeight := Value;
+ if AutoSize then
+ begin
+ InvalidatePreferredSize;
+ AdjustSize;
+ end;
+ Invalidate;
+end;
+
+procedure TLCDDisplay.SetFrameSize(const Value: integer);
+begin
+ if Value = FrameSize then
+ Exit;
+ FFrameSize := Value;
+ if AutoSize then
+ begin
+ InvalidatePreferredSize;
+ AdjustSize;
+ end;
+ Invalidate;
+end;
+
+procedure TLCDDisplay.SetFrameStyle(const Value: TFrameStyle);
+begin
+ if Value = FrameStyle then
+ Exit;
+ FFrameStyle := Value;
+ if AutoSize then
+ begin
+ InvalidatePreferredSize;
+ AdjustSize;
+ end;
+ Invalidate;
+end;
+
+procedure TLCDDisplay.SetCharSpace(const Value: boolean);
+begin
+ if Value = CharSpace then
+ Exit;
+ FCharSpace := Value;
+ Invalidate;
+end;
+
+procedure TLCDDisplay.SetColorScheme(const Value: TColorScheme);
+begin
+ if Value = FColorScheme then Exit;
+ case Value of
+ csBlue: begin
+ FBoardColor := clBlack;
+ FDotColorOff := clTeal;
+ FDotColorOn := clSkyBlue;
+ end;
+ csGreen: begin
+ FBoardColor := 5162664;
+ FDotColorOff := 5162664;
+ FDotColorOn := 2900284;
+ end;
+ csInvGreen: begin
+ FBoardColor := clBlack;
+ FDotColorOff := 2900284;
+ FDotColorOn := 5162664;
+ end;
+ csCustom: begin
+ end;
+ end;
+ FColorScheme := Value;
+ Invalidate;
+end;
+
+procedure TLCDDisplay.SetDisplayLineCount(const Value: integer);
+begin
+ if Value = FDisplayLineCount then
+ Exit;
+ FDisplayLineCount := Value;
+ if AutoSize then
+ begin
+ InvalidatePreferredSize;
+ AdjustSize;
+ end;
+ Invalidate;
+end;
+
+procedure TLCDDisplay.SetDisplayCharCount(const Value: integer);
+begin
+ if Value = FDisplayCharCount then
+ Exit;
+ FDisplayCharCount := Value;
+ if AutoSize then
+ begin
+ InvalidatePreferredSize;
+ AdjustSize;
+ end;
+ Invalidate;
+end;
+
+procedure TLCDDisplay.SetLines(const Value: TStringList);
+var
+ i: integer;
+begin
+ FLines.Clear;
+ for i := 0 to FDisplayLineCount - 1 do
+ begin
+ if i < Value.Count then
+ FLines.Add(Value[i])
+ else
+ FLines.Add(' ');
+ end;
+ if AutoSize then
+ begin
+ InvalidatePreferredSize;
+ AdjustSize;
+ end;
+ Invalidate;
+end;
+
+function TLCDDisplay.GetCharCount: longint;
+begin
+ DrawCalc();
+ Result := FCharCount;
+end;
+
+function TLCDDisplay.GetGlobalDotColsCount: longint;
+begin
+ DrawCalc();
+ Result := FGlobalDotColsCount;
+end;
+
+end.
diff --git a/components/industrialstuff/source/industrial_icons.res b/components/industrialstuff/source/industrial_icons.res
index 7a1a338ca..99d459810 100644
Binary files a/components/industrialstuff/source/industrial_icons.res and b/components/industrialstuff/source/industrial_icons.res differ