⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flexcards.pas

📁 FlexGraphics是一套创建矢量图形的VCL组件
💻 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 + -