最近閒閒的就將以前寫過程式改成支援Firemonkey元件
unit uLed7SegItem;
interface
uses
system.Rtti, System.Types,System.Math.Vectors, Classes,
FMX.Objects ,FMX.Types,System.UITypes,FMX.Graphics;
type
//每段區段所屬的多邊線的點
TSeg7Point=array[0..7] of TPointF;
//TPolygon = array of TPointF;
//七段顯示器的區段
TSeg7Track =(Seg7a,Seg7b,Seg7c,Seg7d,Seg7e,Seg7f,Seg7g,Seg7dot,Seg7Colon);
TLed7SegItem =class(TBitmap)
private
FMargins :TBounds;
FDisplace:real;
FDisthickness:real;
FLedthickness:real;
FWordWidth,FWordHeight:real;
FOrigin:TPointF; //原點 在左上(配合Desktop 原點在左上)
FDistance1,FDistance2:TpointF;//區段長度1,2
FSeg7LedArray:array[TSeg7Track] of TSeg7Point;
FisSign:boolean;
procedure SetwordWidth(const Value: real);
procedure SetWordHeight(const Value: real);
procedure SetDisplace(const Value: real);
procedure SetDisthickness(const Value: real);
procedure SetLedthickness(const Value: real);
procedure setisSign(const Value: boolean);
protected
procedure DoGetOrigin;
public
constructor Create(const AWidth, AHeight: Integer);
destructor Destroy; override;
procedure PlotLed7Seg;
procedure DoDraw(iNum:byte;iCavnas:TCanvas);
function GetLed7SegPolygon(iIndex:TSeg7Track):TPolygon;
property Displace:real read FDisplace write SetDisplace;
property Disthickness:real read FDisthickness write SetDisthickness;
property Ledthickness:real read FLedthickness write SetLedthickness;
property WordWidth:real read FWordWidth write SetwordWidth;
property WordHeight:real read FWordHeight write SetWordHeight;
property isSign:boolean read FisSign write setisSign;
end;
var
//預設LED區段數值的開關(ON OFF);
DrawSeg7LedArray:array[0..9,TSeg7Track] of boolean=(
//Seg7a,Seg7b,Seg7c,Seg7d,Seg7e,Seg7f,Seg7g, Seg7dot,Seg7Colon
(true ,true ,true ,true ,true ,true ,false,false,false), //0
(false,true ,true ,false,false,false,false,false,false), //1
(true ,true ,false,true ,true ,false,true ,false,false), //2
(true ,true ,true ,true ,false,false,true ,false,false), //3
(false,true ,true ,false,false,true ,true ,false,false), //4
(true ,false,true ,true ,false,true ,true ,false,false), //5
(true ,false,true ,true ,true ,true ,true ,false,false), //6
(true ,true ,true ,false,false,true ,false ,false,false), //7
//(true ,true ,true ,false,false,false,false ,false,false), //7
(true ,true ,true ,true ,true ,true ,true ,false,false), //8
(true ,true ,true ,true ,false,true ,true ,false,false) //9
//(true ,true ,true ,false,false,true ,true ,false,false) //9
);
implementation
{ TLed7SegItem }
constructor TLed7SegItem.Create(const AWidth, AHeight: Integer);
begin
inherited;
FMargins := TBounds.Create(TRectF.Create(0,0,0,0));
FDisplace:=3;
FDisthickness:=1;
FLedthickness:=10;
WordWidth:=50;
WordHeight:=60;
// DoGetOrigin;
end;
destructor TLed7SegItem.Destroy;
begin
if assigned(FMargins) then FMargins.Free;
inherited;
end;
procedure TLed7SegItem.DoDraw(iNum: byte; iCavnas: TCanvas);
var
_i:TSeg7Track;
_aPolygon:TPolygon;
begin
PlotLed7Seg;
for _i := Seg7a to Seg7g do begin
if DrawSeg7LedArray[iNum][_i] then begin
_aPolygon:=GetLed7SegPolygon(_i);
iCavnas.FillPolygon(_aPolygon,1);
end;
end;
end;
procedure TLed7SegItem.DoGetOrigin;
begin
Width:=round(FWordWidth-FDisplace+FMargins.Left+FMargins.Right);
FOrigin.x:= FMargins.Left;
FDistance1.x:=FWordWidth -(FDisthickness+FLedthickness)*2;
FDistance2.x:=FDistance1.x +FDisplace;
Height:=round(FWordHeight+FDisthickness+FDisplace+FMargins.Top+FMargins.Bottom);
FOrigin.y:= FMargins.Top;
FDistance1.y:=FWordHeight -(FDisthickness*3+FLedthickness*4);
FDistance2.y:=FDistance1.y +(FDisthickness)*2;
end;
function TLed7SegItem.GetLed7SegPolygon(iIndex: TSeg7Track): TPolygon;
var
i:integer;
begin
if iIndex in [Seg7a..Seg7g] then begin
setlength(result,6);
for i := low(result) to High(result) do begin
result[i].X:=FSeg7LedArray[iIndex][i].X;
result[i].Y:=FSeg7LedArray[iIndex][i].Y;
end;
end;
end;
procedure TLed7SegItem.PlotLed7Seg;
begin
DoGetOrigin;
//Seg7a
FSeg7LedArray[Seg7a][0].X:= FOrigin.X +FDisplace+FDisthickness;
FSeg7LedArray[Seg7a][0].y:= FOrigin.Y +FDisplace;
FSeg7LedArray[Seg7a][1].x:= FSeg7LedArray[Seg7a][0].X +FDisplace;
FSeg7LedArray[Seg7a][1].y:= FOrigin.y;
FSeg7LedArray[Seg7a][2].x:= FSeg7LedArray[Seg7a][1].x +FDistance2.x;
FSeg7LedArray[Seg7a][2].y:= FOrigin.y;
FSeg7LedArray[Seg7a][3].x:= FSeg7LedArray[Seg7a][2].x +FDisplace;
FSeg7LedArray[Seg7a][3].y:= FSeg7LedArray[Seg7a][2].y +FDisplace;
FSeg7LedArray[Seg7a][4].x:= FSeg7LedArray[Seg7a][3].x -(FLedthickness-FDisplace);
FSeg7LedArray[Seg7a][4].y:= FSeg7LedArray[Seg7a][3].Y +(FLedthickness-FDisplace);
FSeg7LedArray[Seg7a][5].x:= FSeg7LedArray[Seg7a][0].x+(FLedthickness-FDisplace);
FSeg7LedArray[Seg7a][5].y:= FSeg7LedArray[Seg7a][4].y;
//Seg7b
FSeg7LedArray[Seg7b][0].X:= FSeg7LedArray[Seg7a][3].x +FDisthickness;
FSeg7LedArray[Seg7b][0].y:= FSeg7LedArray[Seg7a][3].y+FDisthickness;
FSeg7LedArray[Seg7b][1].x:= FSeg7LedArray[Seg7b][0].x +FDisplace;
FSeg7LedArray[Seg7b][1].y:= FSeg7LedArray[Seg7b][0].y+FDisplace;
FSeg7LedArray[Seg7b][2].x:= FSeg7LedArray[Seg7b][1].x ;
FSeg7LedArray[Seg7b][2].y:= FSeg7LedArray[Seg7b][1].y+FDistance2.y;
FSeg7LedArray[Seg7b][3].x:= FSeg7LedArray[Seg7b][2].x -FLedthickness/2;
FSeg7LedArray[Seg7b][3].y:= FSeg7LedArray[Seg7b][2].y +FLedthickness/2;
FSeg7LedArray[Seg7b][4].x:= FSeg7LedArray[Seg7b][3].x -FLedthickness/2;
FSeg7LedArray[Seg7b][4].y:= FSeg7LedArray[Seg7b][2].y;
FSeg7LedArray[Seg7b][5].x:= FSeg7LedArray[Seg7a][4].x+FDisthickness;
FSeg7LedArray[Seg7b][5].y:= FSeg7LedArray[Seg7a][4].y+FDisthickness;
//Seg7f
FSeg7LedArray[Seg7f][0].X:= FSeg7LedArray[Seg7a][0].x -FDisthickness;
FSeg7LedArray[Seg7f][0].y:= FSeg7LedArray[Seg7a][0].y+FDisthickness;
FSeg7LedArray[Seg7f][1].x:= FSeg7LedArray[Seg7a][5].x -FDisthickness;
FSeg7LedArray[Seg7f][1].y:= FSeg7LedArray[Seg7a][5].y+FDisthickness;
FSeg7LedArray[Seg7f][2].x:= FSeg7LedArray[Seg7f][1].x ;
FSeg7LedArray[Seg7f][2].y:= FSeg7LedArray[Seg7b][4].y;
FSeg7LedArray[Seg7f][3].x:= FSeg7LedArray[Seg7f][2].x -FLedthickness/2;
FSeg7LedArray[Seg7f][3].y:= FSeg7LedArray[Seg7f][2].y +FLedthickness/2;
FSeg7LedArray[Seg7f][4].x:= FSeg7LedArray[Seg7f][3].x -FLedthickness/2;
FSeg7LedArray[Seg7f][4].y:= FSeg7LedArray[Seg7f][2].y;
FSeg7LedArray[Seg7f][5].x:=FOrigin.X;
FSeg7LedArray[Seg7f][5].y:= FSeg7LedArray[Seg7f][0].y+FDisplace;
//Seg7c
FSeg7LedArray[Seg7c][0].X:= FSeg7LedArray[Seg7b][3].x ;
FSeg7LedArray[Seg7c][0].y:= FSeg7LedArray[Seg7b][3].y+FDisthickness*2;
FSeg7LedArray[Seg7c][1].x:= FSeg7LedArray[Seg7c][0].x +FLedthickness/2;
FSeg7LedArray[Seg7c][1].y:= FSeg7LedArray[Seg7c][0].y+FLedthickness/2;
FSeg7LedArray[Seg7c][2].x:= FSeg7LedArray[Seg7c][1].x ;
FSeg7LedArray[Seg7c][2].y:= FSeg7LedArray[Seg7c][1].y+FDistance2.y;
FSeg7LedArray[Seg7c][3].x:= FSeg7LedArray[Seg7c][2].x -FDisplace;
FSeg7LedArray[Seg7c][3].y:= FSeg7LedArray[Seg7c][2].y +FDisplace;
FSeg7LedArray[Seg7c][4].x:= FSeg7LedArray[Seg7c][3].x -(FLedthickness-FDisplace);
FSeg7LedArray[Seg7c][4].y:= FSeg7LedArray[Seg7c][3].y-(FLedthickness-FDisplace);
FSeg7LedArray[Seg7c][5].x:=FSeg7LedArray[Seg7c][0].X-FLedthickness/2;;
FSeg7LedArray[Seg7c][5].y:= FSeg7LedArray[Seg7c][0].y+FLedthickness/2;
//Seg7e
FSeg7LedArray[Seg7e][0].X:= FSeg7LedArray[Seg7f][3].x ;
FSeg7LedArray[Seg7e][0].y:= FSeg7LedArray[Seg7f][3].y+FDisthickness*2;
FSeg7LedArray[Seg7e][1].x:= FSeg7LedArray[Seg7e][0].x +FLedthickness/2;
FSeg7LedArray[Seg7e][1].y:= FSeg7LedArray[Seg7e][0].y+FLedthickness/2;
FSeg7LedArray[Seg7e][2].x:= FSeg7LedArray[Seg7e][1].x;
FSeg7LedArray[Seg7e][2].y:= FSeg7LedArray[Seg7c][4].y;
FSeg7LedArray[Seg7e][3].x:= FSeg7LedArray[Seg7e][2].x -(FLedthickness-FDisplace);
FSeg7LedArray[Seg7e][3].y:= FSeg7LedArray[Seg7e][2].y +(FLedthickness-FDisplace);
FSeg7LedArray[Seg7e][4].x:= FSeg7LedArray[Seg7e][3].x -FDisplace;
FSeg7LedArray[Seg7e][4].y:= FSeg7LedArray[Seg7e][3].y-FDisplace;
FSeg7LedArray[Seg7e][5].x:=FSeg7LedArray[Seg7e][0].X-FLedthickness/2;;
FSeg7LedArray[Seg7e][5].y:= FSeg7LedArray[Seg7e][0].y+FLedthickness/2;
//Seg7g
FSeg7LedArray[Seg7g][0].X:= FSeg7LedArray[Seg7f][3].x+ FDisthickness;
FSeg7LedArray[Seg7g][0].y:= FSeg7LedArray[Seg7f][3].y+FDisthickness;
FSeg7LedArray[Seg7g][1].x:= FSeg7LedArray[Seg7g][0].x +FLedthickness/2;
FSeg7LedArray[Seg7g][1].y:= FSeg7LedArray[Seg7g][0].y-FLedthickness/2;
FSeg7LedArray[Seg7g][2].x:= FSeg7LedArray[Seg7b][4].x-FDisthickness;
FSeg7LedArray[Seg7g][2].y:= FSeg7LedArray[Seg7b][4].y+FDisthickness;;
FSeg7LedArray[Seg7g][3].x:= FSeg7LedArray[Seg7g][2].x +FLedthickness/2;
FSeg7LedArray[Seg7g][3].y:= FSeg7LedArray[Seg7g][2].y +FLedthickness/2;
FSeg7LedArray[Seg7g][4].x:= FSeg7LedArray[Seg7g][2].x;
FSeg7LedArray[Seg7g][4].y:= FSeg7LedArray[Seg7g][2].y+FLedthickness;
FSeg7LedArray[Seg7g][5].x:=FSeg7LedArray[Seg7g][1].X;
FSeg7LedArray[Seg7g][5].y:= FSeg7LedArray[Seg7g][1].y+FLedthickness;
//Seg7d
FSeg7LedArray[Seg7d][0].X:= FSeg7LedArray[Seg7e][3].x+ FDisthickness;
FSeg7LedArray[Seg7d][0].y:= FSeg7LedArray[Seg7e][3].y+FDisthickness;
FSeg7LedArray[Seg7d][1].x:= FSeg7LedArray[Seg7e][2].x + FDisthickness;
FSeg7LedArray[Seg7d][1].y:= FSeg7LedArray[Seg7e][2].y+ FDisthickness;
FSeg7LedArray[Seg7d][2].x:= FSeg7LedArray[Seg7c][4].x-FDisthickness;
FSeg7LedArray[Seg7d][2].y:= FSeg7LedArray[Seg7c][4].y+FDisthickness;;
FSeg7LedArray[Seg7d][3].x:= FSeg7LedArray[Seg7c][3].x -FDisthickness;
FSeg7LedArray[Seg7d][3].y:= FSeg7LedArray[Seg7c][3].y +FDisthickness;
FSeg7LedArray[Seg7d][4].x:= FSeg7LedArray[Seg7d][3].x-FDisplace;
FSeg7LedArray[Seg7d][4].y:= FSeg7LedArray[Seg7d][3].y+FDisplace;
FSeg7LedArray[Seg7d][5].x:=FSeg7LedArray[Seg7d][0].X+FDisplace;
FSeg7LedArray[Seg7d][5].y:= FSeg7LedArray[Seg7d][4].y;
//Seg7dot
//Seg7Colon
end;
procedure TLed7SegItem.SetDisplace(const Value: real);
begin
FDisplace := Value;
DoGetOrigin;
end;
procedure TLed7SegItem.SetDisthickness(const Value: real);
begin
FDisthickness := Value;
DoGetOrigin;
end;
procedure TLed7SegItem.setisSign(const Value: boolean);
begin
FisSign := Value;
end;
procedure TLed7SegItem.SetLedthickness(const Value: real);
begin
FLedthickness := Value;
DoGetOrigin;
end;
procedure TLed7SegItem.SetWordHeight(const Value: real);
begin
FWordHeight := Value;
Height:=trunc(FWordHeight+FDisthickness+FDisplace+FMargins.Top+FMargins.Bottom);
FOrigin.y:= FMargins.Top;
FDistance1.y:=FWordHeight -(FDisthickness*3+FLedthickness*4);
FDistance2.y:=FDistance1.y +(FDisthickness)*2;
end;
procedure TLed7SegItem.SetwordWidth(const Value: real);
begin
FWordWidth := Value;
Width:=trunc(FWordWidth+FMargins.Left+FMargins.Right);
FOrigin.x:= FMargins.Left;
FDistance1.x:=FWordWidth -(FDisthickness+FLedthickness)*2;
FDistance2.x:=FDistance1.x +FDisplace;
// PlotLed7Seg;
end;
end.
下載網址
http://sourceforge.net/projects/firemonkeyled7seg/