📄 flexcards.pas
字号:
unit FlexCards;
interface
uses
SysUtils, Classes, FlexBase, FlexUtils, FlexProps, FlexControls;
type
TFlexCard = class
private
FControl: TFlexControl;
FSource: TFlexControl;
FPassId: integer;
FPersonId: integer;
FIsAlarm: boolean;
procedure SetIsAlarm(const Value: boolean);
procedure SetPassId(const Value: integer);
procedure SetPersonId(const Value: integer);
function CreateCardInstance: TFlexControl;
procedure Update;
procedure SetPosition;
public
constructor Create(APassId, APersonId: integer; AControl: TFlexControl;
AIsAlarm: boolean = false);
destructor Destroy; override;
procedure SavePosition;
property PassId: integer read FPassId write SetPassId;
property PersonId: integer read FPersonId write SetPersonId;
property IsAlarm: boolean read FIsAlarm write SetIsAlarm;
end;
var
FlexCardList: TList;
function ShowFlexCard(APassId, APersonId: integer; AControl: TFlexControl;
AIsAlarm: boolean = false): TFlexCard;
function FindFlexCard(BySource, ByCard: TFlexControl): TFlexCard;
procedure DestroyFlexCard(Source: TFlexControl);
procedure DestroyAllFlexCards;
procedure CardDestroyed(Card: TFlexControl);
implementation
uses
dMain;
function ShowFlexCard(APassId, APersonId: integer; AControl: TFlexControl;
AIsAlarm: boolean = false): TFlexCard;
var i: integer;
begin
Result := Nil;
if Assigned(FlexCardList) then
for i:=0 to FlexCardList.Count-1 do
if TFlexCard(FlexCardList[i]).FSource = AControl then begin
Result := TFlexCard(FlexCardList[i]);
break;
end;
if Assigned(Result) then with Result do begin
// Set new params
FPassId := APassId;
FPersonId := APersonId;
FIsAlarm := AIsAlarm;
Update;
end else
// Card not found. Create
Result := TFlexCard.Create(APassId, APersonId, AControl, AIsAlarm);
end;
function FindFlexCard(BySource, ByCard: TFlexControl): TFlexCard;
var i: integer;
begin
Result := Nil;
if not Assigned(FlexCardList) then exit;
if Assigned(BySource) then begin
for i:=0 to FlexCardList.Count-1 do
if TFlexCard(FlexCardList[i]).FSource = BySource then begin
Result := TFlexCard(FlexCardList[i]);
break;
end;
end else
for i:=0 to FlexCardList.Count-1 do
if TFlexCard(FlexCardList[i]).FControl = ByCard then begin
Result := TFlexCard(FlexCardList[i]);
break;
end;
end;
procedure DestroyFlexCard(Source: TFlexControl);
var Card: TFlexCard;
Control: TFlexControl;
begin
Card := FindFlexCard(Source, Nil);
if not Assigned(Card) then exit;
Control := Card.FControl;
Card.Free;
Control.Free;
end;
procedure DestroyAllFlexCards;
begin
while Assigned(FlexCardList) do
DestroyFlexCard(TFlexCard(FlexCardList[FlexCardList.Count-1]).FSource);
end;
procedure CardDestroyed(Card: TFlexControl);
var i: integer;
begin
if not Assigned(FlexCardList) then exit;
for i:=0 to FlexCardList.Count-1 do
if TFlexCard(FlexCardList[i]).FSource = Card then begin
FlexCardList.Delete(i);
break;
end;
if FlexCardList.Count = 0 then FreeAndNil(FlexCardList);
end;
// TFlexCard //////////////////////////////////////////////////////////////////
constructor TFlexCard.Create(APassId, APersonId: integer;
AControl: TFlexControl; AIsAlarm: boolean);
begin
FSource := AControl;
if not Assigned(FSource) then
raise Exception.Create('Error card create');
FPassId := APassId;
FPersonId := APersonId;
FIsAlarm := AIsAlarm;
FControl := CreateCardInstance;
SetPosition;
Update;
if not Assigned(FlexCardList) then FlexCardList := TList.Create;
FlexCardList.Add(Self);
end;
destructor TFlexCard.Destroy;
begin
CardDestroyed(FSource);
inherited;
end;
function TFlexCard.CreateCardInstance: TFlexControl;
var Flex: TFlexPanel;
Layer: TFlexLayer;
MS: TMemoryStream;
Filer: TFlexFiler;
begin
Result := Nil;
if not Assigned(FSource) then exit;
Flex := FSource.Owner;
Result := Flex.FindControl('Card');
Layer := Flex.Layers.ByName['Cards'];
if not Assigned(Result) or not Assigned(Layer) then exit;
MS := Nil;
Filer := Nil;
try
MS := TMemoryStream.Create;
Filer := TFlexFiler.Create(MS);
Result.SaveToFiler(Filer, '');
Filer.Rewind;
Result := Flex.LoadFlexControl(Filer, FSource.ParentScheme, Filer.LoadStr);
Result.Layer := Layer;
finally
MS.Free;
Filer.Free;
end;
end;
procedure TFlexCard.SetIsAlarm(const Value: boolean);
begin
if Value = FIsAlarm then exit;
FIsAlarm := Value;
Update;
end;
procedure TFlexCard.SetPassId(const Value: integer);
begin
if Value = FPassId then exit;
FPassId := Value;
Update;
end;
procedure TFlexCard.SetPersonId(const Value: integer);
begin
if Value = FPersonId then exit;
FPersonId := Value;
Update;
end;
procedure TFlexCard.Update;
var Caption, FirstName, LastName, IdNumb: TFlexText;
Background, Frame, Title: TFlexBox;
Index: integer;
begin
Caption := TFlexText(FControl.FindByName('Caption'));
FirstName := TFlexText(FControl.FindByName('FirstName'));
LastName := TFlexText(FControl.FindByName('LastName'));
IdNumb := TFlexText(FControl.FindByName('Id'));
Background := TFlexBox(FControl.FindByName('Background'));
Title := TFlexBox(FControl.FindByName('Title'));
Frame := TFlexBox(FControl.FindByName('Frame'));
// Set background texture
with Background.BrushProp.Bitmap.Canvas do
if FIsAlarm then begin
// Alarm
Pixels[0, 0] := $00B2B2F1;
Pixels[0, 1] := $009090EB;
Title.BrushProp.Color := $009090EB;
Frame.PenProp.Color := $003232B3;
end else begin
// Normal
Pixels[0, 0] := $0092D4A7;
Pixels[0, 1] := $0065B860;
Title.BrushProp.Color := $0065B860;
Frame.PenProp.Color := $003A853F;
end;
// Set caption
Index := dmMain.FindPass(FPassId);
if Index >= 0
then Caption.TextProp.Text := PPass(dmMain.Passes[Index]).Name
else Caption.TextProp.Text := '[unknown pass]';
// Set person
if FPersonID = 0 then begin
FirstName.TextProp.Text := '';
LastName.TextProp.Text := 'OPERATOR';
IdNumb.TextProp.Text := '';
end else begin
IdNumb.TextProp.Text := IntToStr(FPersonID);
Index := dmMain.FindPerson(FPersonID);
if Index < 0 then begin
FirstName.TextProp.Text := '<unknown>';
LastName.TextProp.Text := '<unknown>';
end else begin
FirstName.TextProp.Text := PPerson(dmMain.Personnel[Index]).FirstName;
LastName.TextProp.Text := PPerson(dmMain.Personnel[Index]).LastName;
end;
end;
end;
procedure TFlexCard.SetPosition;
begin
if FSource.UserData.IndexOfName('CardLeft') < 0 then begin
FControl.Left := FSource.Left + (FSource.Width - FControl.Width) div 2;
FControl.Top := FSource.Top - FControl.Height - ScalePixels(3);
SavePosition;
end else
try
FControl.Left := StrToInt(FSource.UserData.Values['CardLeft']);
FControl.Top := StrToInt(FSource.UserData.Values['CardTop']);
except
end;
end;
procedure TFlexCard.SavePosition;
begin
FSource.UserData.Values['CardLeft'] := IntToStr(FControl.Left);
FSource.UserData.Values['CardTop'] := IntToStr(FControl.Top);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -