diff --git a/components/industrialstuff/Example/LCDDisplay/project1.lpi b/components/industrialstuff/Example/LCDDisplay/project1.lpi index e6a8b385b..a3c2b7f12 100644 --- a/components/industrialstuff/Example/LCDDisplay/project1.lpi +++ b/components/industrialstuff/Example/LCDDisplay/project1.lpi @@ -118,11 +118,6 @@ - - - - - diff --git a/components/industrialstuff/Example/LCDDisplay/project1.lpr b/components/industrialstuff/Example/LCDDisplay/project1.lpr index a1d376a69..bd4100e04 100644 --- a/components/industrialstuff/Example/LCDDisplay/project1.lpr +++ b/components/industrialstuff/Example/LCDDisplay/project1.lpr @@ -10,7 +10,7 @@ uses athreads, {$ENDIF} Interfaces, // this includes the LCL widgetset - Forms, untMain, TLCDLines_unit; + Forms, untMain; {$R *.res} diff --git a/components/industrialstuff/Example/LCDDisplay/untmain.lfm b/components/industrialstuff/Example/LCDDisplay/untmain.lfm index d87280ae2..18d3e3d85 100644 --- a/components/industrialstuff/Example/LCDDisplay/untmain.lfm +++ b/components/industrialstuff/Example/LCDDisplay/untmain.lfm @@ -3,7 +3,7 @@ object frmMain: TfrmMain Height = 531 Top = 217 Width = 921 - Caption = 'LCDLines Demo' + Caption = 'LCDDisplay Demo' ClientHeight = 531 ClientWidth = 921 OnCreate = FormCreate diff --git a/components/industrialstuff/Example/LCDDisplay/untmain.pas b/components/industrialstuff/Example/LCDDisplay/untmain.pas index 78809c583..604647a92 100644 --- a/components/industrialstuff/Example/LCDDisplay/untmain.pas +++ b/components/industrialstuff/Example/LCDDisplay/untmain.pas @@ -63,7 +63,7 @@ type procedure seDisplayLineCountChange(Sender: TObject); procedure seWidthChange(Sender: TObject); private - LCDLines1: TLCDLines; + LCDDisplay: TLCDDisplay; public @@ -80,28 +80,28 @@ implementation procedure TfrmMain.cbtFrameColorColorChanged(Sender: TObject); begin - LCDLines1.FrameColor := cbtFrameColor.ButtonColor; + LCDDisplay.FrameColor := cbtFrameColor.ButtonColor; end; procedure TfrmMain.cbtBoardColorColorChanged(Sender: TObject); begin - LCDLines1.BoardColor := cbtBoardColor.ButtonColor; + LCDDisplay.BoardColor := cbtBoardColor.ButtonColor; end; procedure TfrmMain.cbtDotONColorColorChanged(Sender: TObject); begin - LCDLines1.DotColorON := cbtDotONColor.ButtonColor; + LCDDisplay.DotColorON := cbtDotONColor.ButtonColor; end; procedure TfrmMain.cbtDotOFFColorColorChanged(Sender: TObject); begin - LCDLines1.DotColorOFF := cbtDotOFFColor.ButtonColor; + LCDDisplay.DotColorOFF := cbtDotOFFColor.ButtonColor; end; procedure TfrmMain.FormCreate(Sender: TObject); begin - LCDLines1 := TLCDLines.Create(self); - with LCDLines1 do + LCDDisplay := TLCDDisplay.Create(self); + with LCDDisplay do begin Left := 24; Height := 101; @@ -111,7 +111,7 @@ begin DotColorOn := 5162664; DotColorOff := 2900284; DisplayCharCount := 0; - Lines.Add('TLCDLines'); + Lines.Add('TLCDDisplay'); ColorScheme := csInvGreen; Parent := self; end @@ -119,111 +119,111 @@ 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); + mmText.Lines := LCDDisplay.Lines; + seDisplayLineCount.Value := LCDDisplay.DisplayLineCount; + seDisplayCharCount.Value := LCDDisplay.DisplayCharCount; + seFrameSize.Value := LCDDisplay.FrameSize; + seDotSize.Value := LCDDisplay.DotSize; + seDotsSpace.Value := LCDDisplay.DotsSpace; + seWidth.Value := LCDDisplay.Width; + seHeigth.Value := LCDDisplay.Height; + cbAutoSize.Checked := LCDDisplay.AutoSize; + cbCharSpace.Checked := LCDDisplay.CharSpace; + cbtFrameColor.ButtonColor := LCDDisplay.FrameColor; + cbtBoardColor.ButtonColor := LCDDisplay.BoardColor; + cbtDotONColor.ButtonColor := LCDDisplay.DotColorOn; + cbtDotOFFColor.ButtonColor := LCDDisplay.DotColorOff; + rgFrameStyle.ItemIndex := integer(LCDDisplay.FrameStyle); + rgFrameColorStyle.ItemIndex := integer(LCDDisplay.FrameColorStyle); + rgDotShape.ItemIndex := integer(LCDDisplay.DotShape); + rgFrameHeight.ItemIndex := integer(LCDDisplay.FrameHeight); + cbColorSchemes.ItemIndex:= integer(LCDDisplay.ColorScheme); end; procedure TfrmMain.cbAutoSizeChange(Sender: TObject); begin - LCDLines1.AutoSize := cbAutoSize.Checked; + LCDDisplay.AutoSize := cbAutoSize.Checked; if not cbAutoSize.Checked then begin - LCDLines1.Width := seWidth.Value; - LCDLines1.Height := seHeigth.Value; + LCDDisplay.Width := seWidth.Value; + LCDDisplay.Height := seHeigth.Value; end; end; procedure TfrmMain.cbCharSpaceChange(Sender: TObject); begin - LCDLines1.CharSpace := cbCharSpace.Checked; + LCDDisplay.CharSpace := cbCharSpace.Checked; end; procedure TfrmMain.cbColorSchemesChange(Sender: TObject); begin - LCDLines1.ColorScheme := TColorScheme(cbColorSchemes.ItemIndex); + LCDDisplay.ColorScheme := TColorScheme(cbColorSchemes.ItemIndex); end; procedure TfrmMain.mmTextChange(Sender: TObject); begin - LCDLines1.Lines.Assign(mmText.Lines); - if LCDLines1.AutoSize then + LCDDisplay.Lines.Assign(mmText.Lines); + if LCDDisplay.AutoSize then begin - LCDLines1.InvalidatePreferredSize; - LCDLines1.AdjustSize; + LCDDisplay.InvalidatePreferredSize; + LCDDisplay.AdjustSize; end; - LCDLines1.Invalidate; + LCDDisplay.Invalidate; end; procedure TfrmMain.rgFrameStyleClick(Sender: TObject); begin - LCDLines1.FrameStyle := TFrameStyle(rgFrameStyle.ItemIndex); + LCDDisplay.FrameStyle := TFrameStyle(rgFrameStyle.ItemIndex); end; procedure TfrmMain.rgFrameColorStyleClick(Sender: TObject); begin - LCDLines1.FrameColorStyle := TFrameColorStyle(rgFrameColorStyle.ItemIndex); + LCDDisplay.FrameColorStyle := TFrameColorStyle(rgFrameColorStyle.ItemIndex); end; procedure TfrmMain.rgDotShapeClick(Sender: TObject); begin - LCDLines1.DotShape := TDotShape(rgDotShape.ItemIndex); + LCDDisplay.DotShape := TDotShape(rgDotShape.ItemIndex); end; procedure TfrmMain.rgFrameHeightClick(Sender: TObject); begin - LCDLines1.FrameHeight := TFrameHeight(rgFrameHeight.ItemIndex); + LCDDisplay.FrameHeight := TFrameHeight(rgFrameHeight.ItemIndex); end; procedure TfrmMain.seDisplayCharCountChange(Sender: TObject); begin - LCDLines1.DisplayCharCount := seDisplayCharCount.Value; + LCDDisplay.DisplayCharCount := seDisplayCharCount.Value; end; procedure TfrmMain.seDotSizeChange(Sender: TObject); begin - LCDLines1.DotSize := seDotSize.Value; + LCDDisplay.DotSize := seDotSize.Value; end; procedure TfrmMain.seDotsSpaceChange(Sender: TObject); begin - LCDLines1.DotsSpace := seDotsSpace.Value; + LCDDisplay.DotsSpace := seDotsSpace.Value; end; procedure TfrmMain.seFrameSizeChange(Sender: TObject); begin - LCDLines1.FrameSize := seFrameSize.Value; + LCDDisplay.FrameSize := seFrameSize.Value; end; procedure TfrmMain.seHeigthChange(Sender: TObject); begin - LCDLines1.Height := seHeigth.Value; + LCDDisplay.Height := seHeigth.Value; end; procedure TfrmMain.seDisplayLineCountChange(Sender: TObject); begin - LCDLines1.DisplayLineCount := seDisplayLineCount.Value; + LCDDisplay.DisplayLineCount := seDisplayLineCount.Value; end; procedure TfrmMain.seWidthChange(Sender: TObject); begin - LCDLines1.Width := seWidth.Value; + LCDDisplay.Width := seWidth.Value; end; end. diff --git a/components/industrialstuff/source/indlcddisplay.pas b/components/industrialstuff/source/indlcddisplay.pas index 48e4a7d45..121112d1f 100644 --- a/components/industrialstuff/source/indlcddisplay.pas +++ b/components/industrialstuff/source/indlcddisplay.pas @@ -22,20 +22,47 @@ type TColorScheme = (csCustom, csBlue, csGreen, csInvGreen); type - TDotMatrix = array of integer; - TDotMatrixList = specialize TFPGMap; + TDotRow = integer; + TDotRows = array of TDotRow; + TDotMatrixList = specialize TFPGMap; + + TCharDefs = class(TPersistent) + private + FCharList: TDotMatrixList; + FColCount: Integer; + FRowCount: Integer; + function GetCount: Integer; + function GetDotRows(AChar: String): TDotRows; + procedure SetColCount(AValue: Integer); + procedure SetDotRows(AChar: String; const AValue: TDotRows); + procedure SetRowCount(AValue: Integer); + function EmptyRows: TDotRows; + procedure ReadCharDefs(Reader: TReader); + procedure WriteCharDefs(Writer: TWriter); + protected + procedure DefineProperties(Filer: TFiler); override; + public + constructor Create; + destructor Destroy; override; + procedure Add(AChar: String; ADotRows: TDotRows); + procedure Delete(AChar: String); + procedure Clear; + property Count: Integer read GetCount; + property DotRows[AChar: String]: TDotRows read GetDotRows write SetDotRows; + published + property ColCount: Integer read FColCount write SetColCount; + property RowCount: Integer read FRowCount write SetRowCount; + end; TLCDDisplay = class(TGraphicControl) private - BitMap: TBitMap; + FBitmap: 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; @@ -63,8 +90,13 @@ type FFrameColorStyle: TFrameColorStyle; FDotShape: TDotShape; - FCharList: TDotMatrixList; + FCharDefs: TCharDefs; + function GetDotColCount: Integer; + function GetDotRowCount: INteger; + procedure SetDotColCount(AValue: Integer); + procedure SetDotRowCount(AValue: Integer); + procedure SetDotShape(const Value: TDotShape); procedure SetFrameColorStyle(const Value: TFrameColorStyle); procedure SetFrameHeight(const Value: TFrameHeight); @@ -87,8 +119,9 @@ type function CalcCharCount: integer; procedure InitCharList(AHorDots, AVertDots: integer); + //calculate widths and heigths of the char matrix, background border and frame - procedure DrawCalc(); + procedure Prepare(); //draw frame procedure DrawBorder(); //background grid of dots that are off @@ -103,29 +136,31 @@ type //draw frame shadow procedure DrawShadow(StartP, EndP: TPoint; LineColor1, LineColor2: TColor); procedure DrawBitmapToCanvas(); - + protected + // Basic method of auto-size calculation procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; {%H-}WithThemeSpace: boolean); override; + // Takes care of high-dpi scaling procedure DoAutoAdjustLayout(const AMode: TLayoutAdjustmentPolicy; const AXProportion, AYProportion: double); override; + // inherited painting routine 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; + // Adds a user-defined character and its dot matrix. + procedure AddCharDef(AChar: string; const Dots: TDotRows); property CharCount: longint read GetCharCount; + property DotColCount: integer read GetDotColCount; + property DotRowCount: integer read GetDotRowCount; property GlobalDotColsCount: longint read GetGlobalDotColsCount; - published - property AutoSize; + property AutoSize default true; property BorderSpacing; property ShowHint; property Visible; @@ -135,6 +170,8 @@ type property OnMouseMove; property OnMouseUp; + property CharDefs: TCharDefs read FCharDefs write FCharDefs; + 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; @@ -182,6 +219,169 @@ implementation uses Dialogs, LazUTF8, LazUnicode; +{ TCharDefs } + +constructor TCharDefs.Create; +begin + inherited; + FCharList := TDotMatrixList.Create; + FCharList.Sorted := True; +end; + +destructor TCharDefs.Destroy; +begin + FCharList.Free; + inherited; +end; + +{ Adds a new character dot matrix. } +procedure TCharDefs.Add(AChar: String; ADotRows: TDotRows); +begin + if Length(ADotRows) <> FRowCount then + raise Exception.Create('Incorrect number of rows.'); + FCharList.Add(AChar, ADotRows); +end; + +{ Clears all characters and their dot matrices. } +procedure TCharDefs.Clear; +begin + FCharList.Clear; +end; + +{ Prepares streaming of the dot matrices } +procedure TCharDefs.DefineProperties(Filer: TFiler); +begin + inherited DefineProperties(Filer); + Filer.DefineProperty('CharDefs', @ReadCharDefs, @WriteCharDefs, true); +end; + +{ Deletes the specified character and its dot matrix from the list. } +procedure TCharDefs.Delete(AChar: String); +var + idx: Integer; +begin + if FCharList.Find(AChar, idx) then + FCharList.Delete(idx); +end; + +{ Creates an empty row in which not dots are set. } +function TCharDefs.EmptyRows: TDotRows; +var + row: Integer; +begin + Result := nil; + SetLength(Result, FRowCount); + for row := 0 to FRowCount-1 do + Result[row] := 0; +end; + +{ Returns the number of characters contained. } +function TCharDefs.GetCount: Integer; +begin + Result := FCharList.Count; +end; + +{ Returns the dot matrix rows for the specified character. Each row is an + integer in which each bit is interpreted as a dot. } +function TCharDefs.GetDotRows(AChar: String): TDotRows; +var + idx: Integer; +begin + if FCharList.Find(AChar, idx) then + Result := FCharList.Data[idx] + else + Result := EmptyRows; +end; + +{ Reads the list of character name and dot matrices from the LFM file. The data + are stored in the LFM as a comma-separated list beginning with the character + name. } +procedure TCharDefs.ReadCharDefs(Reader: TReader); +var + i: Integer; + s: String; + ch: String; + sa: TStringArray; + rows: TDotRows = nil; +begin + Clear; + Reader.ReadListBegin; + while not Reader.EndOfList do + begin + s := Reader.ReadString; + if s[1] = ',' then + begin + ch := ','; + System.Delete(s, 1, 2); + end else + begin + i := pos(',', s); + ch := copy(s, 1, i-1); + System.Delete(s, 1, i); + end; + sa := s.Split(','); + SetLength(rows, Length(sa)); + for i := 0 to High(sa) do + rows[i] := StrToInt(sa[i]); + Add(ch, rows); + end; + Reader.ReadListEnd; +end; + +{ Returns the number of columns of the dot matrix. } +procedure TCharDefs.SetColCount(AValue: Integer); +begin + if FColCount = AValue then + exit; + FColCount := AValue; + FCharList.Clear; +end; + +{ Sets the dot matrix for the specified character } +procedure TCharDefs.SetDotRows(AChar: String; const AValue: TDotRows); +var + idx: Integer; +begin + if FCharList.Find(AChar, idx) then + FCharList.Data[idx] := AValue + else + Add(AChar, AValue); +end; + +{ Returns the number of rows of the dot matrix. } +procedure TCharDefs.SetRowCount(AValue: Integer); +begin + if FRowCount = AValue then + exit; + FRowCount := AValue; + FCharList.Clear; +end; + +{ Write the character and its dot matrix to the LFM. Each character is stored + as a comma-separated list of character and dotrow values. } +procedure TCharDefs.WriteCharDefs(Writer: TWriter); +var + i, j: Integer; + ch: String; + rows: TDotRows; + s: String; +begin + Writer.WriteListBegin; + for i := 0 to Count-1 do + begin + ch := FCharList.Keys[i]; + rows := DotRows[ch]; + s := ch; + for j := 0 to FRowCount-1 do + s := s + ',' + IntToStr(rows[j]); + Writer.WriteString(s); + end; + Writer.WriteListEnd; +end; + + +{ TLCDDisplay} + constructor TLCDDisplay.Create(AOwner: TComponent); begin inherited Create(AOwner); @@ -193,12 +393,10 @@ begin FDisplayLineCount := 2; FDisplayCharCount := 10; - FCharList := TDotMatrixList.Create; - FCharList.Sorted := True; - - FDotColsCount := 5; - FDotRowsCount := 7; - InitCharList(FDotColsCount, FDotRowsCount); + FCharDefs := TCharDefs.Create; + FCharDefs.ColCount := 5; + FCharDefs.RowCount := 7; + InitCharList(DotColCount, DotRowCount); FDotSize := 4; FDotsSpace := 1; @@ -210,44 +408,43 @@ begin FDotColorOn := clSkyBlue; FDotColorOff := clTeal; - BitMap := TBitMap.Create; + FBitmap := TBitMap.Create; FCountOn := 255; FLines := TStringList.Create; + AutoSize := true; end; destructor TLCDDisplay.Destroy; begin - BitMap.Free; - FCharList.Free; + FBitmap.Free; + FCharDefs.Free; FLines.Free; inherited Destroy; end; -procedure TLCDDisplay.AddDotMatrix(AChar: string; const Dots: array of integer); -var - matrix: TDotMatrix = nil; - i: integer; +procedure TLCDDisplay.AddCharDef(AChar: string; const Dots: TDotRows); 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); + FCharDefs.Add(AChar, Dots); end; procedure TLCDDisplay.CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: boolean); +var + nDotCols: Integer; + nDotRows: Integer; begin - FCharWidth := (DotSize * FDotColsCount) + (DotsSpace * (FDotColsCount + 1)); //pixels + nDotCols := DotColCount; + nDotRows := DotRowCount; + + FCharWidth := (DotSize * nDotCols) + (DotsSpace * (nDotCols + 1)); //pixels FCharCount := CalcCharCount; - FGlobalDotColsCount := (FCharCount * FDotColsCount) + (FCharCount - 1); //dots + FGlobalDotColsCount := (FCharCount * nDotCols) + (FCharCount - 1); //dots // total matrix width FLEDWidth := (FGlobalDotColsCount * DotSize) + ((FGlobalDotColsCount - 1) * DotsSpace); // total matrix height - FLEDHeight := (FDisplayLineCount * FDotRowsCount * (DotSize + DotsSpace)) + + FLEDHeight := (FDisplayLineCount * nDotRows * (DotSize + DotsSpace)) + ((FDisplayLineCount - 1) * (DotSize + DotsSpace)); if FCharSpace then FLEDHeight := FLEDHeight + ((FDisplayLineCount - 1) * DotsSpace); @@ -274,16 +471,22 @@ begin end; end; -procedure TLCDDisplay.DrawCalc(); +procedure TLCDDisplay.Prepare(); +var + nDotCols: Integer; + nDotRows: Integer; begin - FCharWidth := (DotSize * FDotColsCount) + (DotsSpace * (FDotColsCount + 1)); //pixels + nDotCols := DotColCount; + nDotRows := DotRowCount; + + FCharWidth := (DotSize * nDotCols) + (DotsSpace * (nDotCols + 1)); //pixels FCharCount := ((Width - (2 * FrameSize)) + DotSize) div (FCharWidth + DotSize); - FGlobalDotColsCount := (FCharCount * FDotColsCount) + (FCharCount - 1); //dots + FGlobalDotColsCount := (FCharCount * nDotCols) + (FCharCount - 1); //dots // total matrix width FLEDWidth := (FGlobalDotColsCount * DotSize) + ((FGlobalDotColsCount - 1) * DotsSpace); // total matrix height - FLEDHeight := (FDisplayLineCount * FDotRowsCount * (DotSize + DotsSpace)) + + FLEDHeight := (FDisplayLineCount * nDotRows * (DotSize + DotsSpace)) + ((FDisplayLineCount - 1) * (DotSize + DotsSpace)); if FCharSpace then FLEDHeight := FLEDHeight + ((FDisplayLineCount - 1) * DotsSpace); @@ -291,8 +494,8 @@ begin FBoardWidth := (Width - 2 * FrameSize - FLEDWidth) div 2; FBoardHeight := (Height - 2 * FrameSize - FLEDHeight) div 2; - BitMap.Width := Width; - BitMap.Height := Height; + FBitmap.Width := Width; + FBitmap.Height := Height; end; procedure TLCDDisplay.DrawBorder(); @@ -314,11 +517,11 @@ begin BEnd.X := Width - FrameSize; BEnd.Y := Height - FrameSize; - with BitMap.Canvas do + with FBitmap.Canvas do begin Brush.Color := FrameColor; Pen.Color := FrameColor; - Rectangle(0, 0, BitMap.Width, BitMap.Height); + Rectangle(0, 0, FBitmap.Width, FBitmap.Height); Brush.Color := FBoardColor; Pen.Color := FBoardColor; Rectangle(BStart.X, BStart.Y, BEnd.X, BEnd.Y); @@ -389,7 +592,7 @@ end; procedure TLCDDisplay.DrawShadow(StartP, EndP: TPoint; LineColor1, LineColor2: TColor); begin - with BitMap.Canvas do + with FBitmap.Canvas do begin Pen.Color := LineColor1; MoveTo(EndP.X, StartP.Y); @@ -409,8 +612,8 @@ var NRow, NCol: integer; begin - NRow := (FDotRowsCount + 1) * FDisplayLineCount - 1; - NCol := (FDotColsCount + 1) * FCharCount - 1; + NRow := (DotRowCount + 1) * FDisplayLineCount - 1; + NCol := (DotColCount + 1) * FCharCount - 1; for y := 0 to NRow - 1 do for x := 0 to NCol - 1 do @@ -428,8 +631,8 @@ begin //j - horizontal spaces for lc := 0 to FDisplayLineCount - 1 do begin - NRow := FDotRowsCount + 1; - NCol := (FDotColsCount + 1) * FCharCount - 1; + NRow := DotRowCount + 1; + NCol := (DotColCount + 1) * FCharCount - 1; j := 0; for y := 0 to (NRow * (lc + 1)) do @@ -458,12 +661,12 @@ end; procedure TLCDDisplay.DrawText(); var x, y, c: integer; - DotRow: integer; - DotOn: boolean; - i, j: integer; + dots: TDotRows; + dotRow: TDotRow; + dotOn: boolean; + i: integer; line: string; ch: string; - matrix: TDotMatrix; begin for i := 0 to FDisplayLineCount - 1 do begin @@ -476,12 +679,10 @@ begin 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 + dots := FCharDefs.DotRows[ch]; + for y := 0 to DotRowCount - 1 do begin - DotRow := matrix[y]; + DotRow := dots[y]; for x := 0 to 4 do begin DotOn := DotRow and (1 shl (5 - x - 1)) > 0; @@ -501,7 +702,7 @@ end; procedure TLCDDisplay.DrawChar(Row, Col, NChar: integer); begin - Col := Col + ((FDotColsCount + 1) * (NChar - 1)); + Col := Col + ((DotColCount + 1) * (NChar - 1)); if Col > FGlobalDotColsCount - 1 then Exit; if Col < 0 then @@ -534,7 +735,7 @@ begin exit; end; - with BitMap.Canvas do + with FBitmap.Canvas do begin Pen.Color := DotColor; Brush.Color := DotColor; @@ -548,7 +749,16 @@ end; procedure TLCDDisplay.DrawBitmapToCanvas(); begin - Canvas.Draw(0, 0, BitMap); + Canvas.Draw(0, 0, FBitmap); +end; + +procedure TLCDDisplay.Paint(); +begin + Prepare(); + DrawBorder(); + DrawGrid(); + DrawText(); + DrawBitmapToCanvas(); end; // Find the longest's line length @@ -578,118 +788,106 @@ procedure TLCDDisplay.InitCharList(AHorDots, AVertDots: integer); var i: integer; begin - FCharList.Clear; + FCharDefs.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 + AddCharDef('!', [4, 4, 4, 4, 4, 0, 4]); // #33 + AddCharDef('"', [10, 10, 0, 0, 0, 0, 0]); // #34 + AddCharDef('#', [0, 10, 31, 10, 31, 10, 0]); // #35 + AddCharDef('$', [4, 15, 20, 14, 5, 30, 4]); // #36 + AddCharDef('%', [25, 26, 2, 4, 8, 11, 19]); // #37 + AddCharDef('&', [12, 18, 20, 8, 21, 18, 13]); // #38 + AddCharDef('''', [4, 4, 0, 0, 0, 0, 0]); // #39 + AddCharDef('(', [2, 4, 8, 8, 8, 4, 2]); // #40 + AddCharDef(')', [8, 4, 2, 2, 2, 4, 8]); // #41 + AddCharDef('*', [0, 4, 21, 14, 21, 4, 0]); // #42 + AddCharDef('+', [0, 4, 4, 31, 4, 4, 0]); // #43 + AddCharDef(',', [0, 0, 0, 0, 12, 4, 8]); // #44 + AddCharDef('-', [0, 0, 0, 14, 0, 0, 0]); // #45 + AddCharDef('.', [0, 0, 0, 0, 0, 12, 12]); // #46 + AddCharDef('/', [1, 1, 2, 4, 8, 16, 16]); // #47 + AddCharDef('0', [14, 17, 19, 21, 25, 17, 14]); // #48 + AddCharDef('1', [4, 12, 4, 4, 4, 4, 14]); // #49 + AddCharDef('2', [14, 17, 1, 2, 4, 8, 31]); // #50 + AddCharDef('3', [14, 17, 1, 6, 1, 17, 14]); // #51 + AddCharDef('4', [2, 6, 10, 18, 31, 2, 2]); // #52 + AddCharDef('5', [31, 16, 30, 1, 1, 17, 14]); // #53 + AddCharDef('6', [14, 17, 16, 30, 17, 17, 14]); // #54 + AddCharDef('7', [31, 1, 1, 2, 4, 4, 4]); // #55 + AddCharDef('8', [14, 17, 17, 14, 17, 17, 14]); // #56 + AddCharDef('9', [14, 17, 17, 15, 1, 17, 14]); // #57 + AddCharDef(':', [0, 12, 12, 0, 12, 12, 0]); // #58 + AddCharDef(';', [0, 12, 12, 0, 12, 4, 8]); // #59 + AddCharDef('<', [2, 4, 8, 16, 8, 4, 2]); // #60 + AddCharDef('=', [0, 0, 31, 0, 31, 0, 0]); // #61 + AddCharDef('>', [8, 4, 2, 1, 2, 4, 8]); // #62 + AddCharDef('?', [14, 17, 1, 2, 4, 0, 4]); // #63 + AddCharDef('@', [14, 17, 19, 21, 23, 16, 15]); // #64 + AddCharDef('A', [14, 17, 17, 31, 17, 17, 17]); // #65 + AddCharDef('B', [30, 17, 17, 30, 17, 17, 30]); // #66 + AddCharDef('C', [14, 17, 16, 16, 16, 17, 14]); // #67 + AddCharDef('D', [30, 17, 17, 17, 17, 17, 30]); // #68 + AddCharDef('E', [31, 16, 16, 30, 16, 16, 31]); // #69 + AddCharDef('F', [31, 16, 16, 30, 16, 16, 16]); // #70 + AddCharDef('G', [14, 17, 16, 19, 17, 17, 14]); // #71 + AddCharDef('H', [17, 17, 17, 31, 17, 17, 17]); // #72 + AddCharDef('I', [14, 4, 4, 4, 4, 4, 14]); // #73 + AddCharDef('J', [1, 1, 1, 1, 17, 17, 14]); // #74 + AddCharDef('K', [17, 18, 20, 24, 20, 18, 17]); // #75 + AddCharDef('L', [16, 16, 16, 16, 16, 16, 31]); // #76 + AddCharDef('M', [17, 27, 21, 21, 17, 17, 17]); // #77 + AddCharDef('N', [17, 25, 21, 19, 17, 17, 17]); // #78 + AddCharDef('O', [14, 17, 17, 17, 17, 17, 14]); // #79 + AddCharDef('P', [30, 17, 17, 30, 16, 16, 16]); // #80 + AddCharDef('Q', [14, 17, 17, 17, 17, 14, 1]); // #81 + AddCharDef('R', [30, 17, 17, 30, 17, 17, 17]); // #82 + AddCharDef('S', [14, 17, 16, 14, 1, 17, 14]); // #83 + AddCharDef('T', [31, 4, 4, 4, 4, 4, 4]); // #84 + AddCharDef('U', [17, 17, 17, 17, 17, 17, 14]); // #85 + AddCharDef('V', [17, 17, 17, 17, 17, 10, 4]); // #86 + AddCharDef('W', [17, 17, 17, 17, 21, 27, 17]); // #87 + AddCharDef('X', [17, 10, 4, 4, 4, 10, 17]); // #88 + AddCharDef('Y', [17, 17, 17, 10, 4, 4, 4]); // #89 + AddCharDef('Z', [31, 1, 2, 4, 8, 16, 31]); // #90 + AddCharDef('[', [12, 8, 8, 8, 8, 8, 12]); // #91 + AddCharDef('\', [0, 16, 8, 4, 2, 1, 0]); // #92 + AddCharDef(']', [6, 2, 2, 2, 2, 2, 6]); // #93 + AddCharDef('^', [4, 10, 17, 0, 0, 0, 0]); // #94 + AddCharDef('_', [0, 0, 0, 0, 0, 0, 31]); // #95 + AddCharDef('`', [6, 4, 2, 0, 0, 0, 0]); // #96 + AddCharDef('a', [0, 0, 14, 1, 15, 17, 15]); // #97 + AddCharDef('b', [16, 16, 30, 17, 17, 17, 30]); // #98 + AddCharDef('c', [0, 0, 15, 16, 16, 16, 15]); // #99 + AddCharDef('d', [1, 1, 15, 17, 17, 17, 15]); // #100 + AddCharDef('e', [0, 0, 14, 17, 31, 16, 14]); // #101 + AddCharDef('f', [3, 4, 31, 4, 4, 4, 4]); // #102 + AddCharDef('g', [0, 0, 15, 17, 15, 1, 14]); // #103 + AddCharDef('h', [16, 16, 22, 25, 17, 17, 17]);// #104 + AddCharDef('i', [4, 0, 12, 4, 4, 4, 14]); // #105 + AddCharDef('j', [2, 0, 6, 2, 2, 18, 12]); // #106 + AddCharDef('k', [16, 16, 18, 20, 24, 20, 18]);// #107 + AddCharDef('l', [12, 4, 4, 4, 4, 4, 14]); // #108 + AddCharDef('m', [0, 0, 26, 21, 21, 21, 21]); // #109 + AddCharDef('n', [0, 0, 22, 25, 17, 17, 17]); // #110 + AddCharDef('o', [0, 0, 14, 17, 17, 17, 14]); // #111 + AddCharDef('p', [0, 0, 30, 17, 30, 16, 16]); // #112 + AddCharDef('q', [0, 0, 15, 17, 15, 1, 1]); // #113 + AddCharDef('r', [0, 0, 11, 12, 8, 8, 8]); // #114 + AddCharDef('s', [0, 0, 14, 16, 14, 1, 30]); // #115 + AddCharDef('t', [4, 4, 31, 4, 4, 4, 3]); // #116 + AddCharDef('u', [0, 0, 17, 17, 17, 19, 13]); // #117 + AddCharDef('v', [0, 0, 17, 17, 17, 10, 4]); // #118 + AddCharDef('w', [0, 0, 17, 17, 21, 21, 10]); // #119 + AddCharDef('x', [0, 0, 17, 10, 4, 10, 17]); // #120 + AddCharDef('y', [0, 0, 17, 17, 15, 1, 14]); // #121 + AddCharDef('z', [0, 0, 31, 2, 4, 8, 31]); // #122 + AddCharDef('{', [3, 4, 4, 8, 4, 4, 3]); // #123 + AddCharDef('|', [4, 4, 4, 4, 4, 4, 4]); // #124 + AddCharDef('}', [24, 4, 4, 2, 4, 4, 24]); // #125 + AddCharDef('~', [8, 21, 2, 0, 0, 0, 0]); // #126 end; end; -procedure TLCDDisplay.Paint(); -begin - DrawCalc(); - DrawBorder(); - DrawGrid(); - DrawText(); - DrawBitmapToCanvas(); -end; - procedure TLCDDisplay.SetBoardColor(const Value: TColor); begin if Value = FBoardColor then @@ -885,14 +1083,50 @@ end; function TLCDDisplay.GetCharCount: longint; begin - DrawCalc(); + Prepare(); Result := FCharCount; end; function TLCDDisplay.GetGlobalDotColsCount: longint; begin - DrawCalc(); + Prepare(); Result := FGlobalDotColsCount; end; +function TLCDDisplay.GetDotColCount: Integer; +begin + Result := FCharDefs.ColCount; +end; + +function TLCDDisplay.GetDotRowCount: Integer; +begin + Result := FCharDefs.RowCount; +end; + +procedure TLCDDisplay.SetDotColCount(AValue: Integer); +begin + if AValue = DotColCount then + exit; + FCharDefs.ColCount := AValue; + if AutoSize then + begin + InvalidatePreferredSize; + AdjustSize; + end; + Invalidate; +end; + +procedure TLCDDisplay.SetDotRowCount(AValue: Integer); +begin + if AValue = DotRowCount then + exit; + FCharDefs.RowCount := AValue; + if AutoSize then + begin + InvalidatePreferredSize; + AdjustSize; + end; + Invalidate; +end; + end.