123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- {*******************************************************************************
- 单元名称: OrderCheckerFme.pas
- 单元说明: 动态添加审核人。
- 作者时间: Chenshilong, 2014-07-11
- *******************************************************************************}
- unit OrderCheckerFme;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, ExtCtrls, StdCtrls, pngimage, CslButton, cxHint;
- type
- TCheckerFrameType = (cftChecker, cftOwner, cftAdd);
- TCheckStatus = (csNotBegin, csChecking, csFinished, csNotPass); // 末审核,审核中,审核完成,审核不通过
- const
- CheckStatusNames: array[TCheckStatus] of string = ('未审核', '审核中', '审核通过', '审核不通过');
- CheckStatusColors: array[TCheckStatus] of TColor = ($00B7B7B7, $000099FF, $000E9D00, clRed);
- type
- TOrderCheckerFrame = class(TFrame)
- pnlChecker: TPanel;
- shpImage: TShape;
- imgOrderCheckerPic: TImage;
- lblOrderCheckerName: TLabel;
- lblOrderCheckerRole: TLabel;
- lblOrderCheckerCompany: TLabel;
- shpBotom: TShape;
- lblOrderCheckerNum: TLabel;
- lblOrderStatus: TLabel;
- lblLast: TLabel;
- lblAdd: TLabel;
- lblAddHint: TLabel;
- shpAdd: TShape;
- imgChecking: TImage;
- imgNotBegin: TImage;
- imgFinish: TImage;
- imgNotPass: TImage;
- btnDelete: TCslButton;
- lblOrderCheckerMemo: TLabel;
- procedure shpAddMouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure btnDeleteClick(Sender: TObject);
- private
- FUserID: Integer;
- FOrder: Integer;
- FUserName: string;
- FOwner: TObject;
- FCheckerFrameType: TCheckerFrameType;
- FCheckStatus: TCheckStatus;
- FUserRole: string;
- FCheckerMemo: string;
- procedure SetOrder(const Value: Integer);
- procedure SetCheckStatus(const Value: TCheckStatus);
- procedure SetCheckerMemo(const Value: string);
- { Private declarations }
- public
- { Public declarations }
- procedure Init(AType: TCheckerFrameType; AID: Integer; AName, ARole,
- ACompany, AImagePath, ACheckerMemo: string; ACheckStatus: TCheckStatus);
- function IsMe(AID: Integer; AName: string): string;
- function IsChecking: Boolean;
- function IsFinished: Boolean;
- property Owner: TObject read FOwner write FOwner;
- property UserID: Integer read FUserID write FUserID;
- property UserName: string read FUserName write FUserName;
- property UserRole: string read FUserRole write FUserRole;
- property Order: Integer read FOrder write SetOrder;
- property CheckerFrameType: TCheckerFrameType read FCheckerFrameType write FCheckerFrameType; // 审核人类型
- property CheckStatus: TCheckStatus read FCheckStatus write SetCheckStatus; // 审核状态
- property CheckerMemo: string read FCheckerMemo write SetCheckerMemo; // 审核意见
- end;
- implementation
- uses FindUserFrm, CheckerFme, PHPWebDm, ProjectData, ProjectFme,
- UtilMethods;
- {$R *.dfm}
- { TOrderCheckerFrame }
- procedure TOrderCheckerFrame.Init(AType: TCheckerFrameType; AID: Integer;
- AName, ARole, ACompany, AImagePath, ACheckerMemo: string; ACheckStatus: TCheckStatus);
- var bAdd, bOwner: Boolean;
- begin
- bAdd := AType = cftAdd;
- shpAdd.Visible := bAdd;
- lblAdd.Visible := bAdd;
- lblAddHint.Visible := bAdd;
- lblOrderCheckerName.Visible := not bAdd;
- lblOrderCheckerRole.Visible := not bAdd;
- lblOrderCheckerCompany.Visible := not bAdd;
- lblOrderStatus.Visible := not bAdd;
- shpImage.Visible := not bAdd;
- lblOrderCheckerMemo.Visible := not bAdd;
- bOwner := AType = cftOwner;
- lblLast.Visible := bOwner;
- lblOrderCheckerNum.Visible := not bOwner;
- CheckerFrameType := AType;
- CheckStatus := ACheckStatus;
- case AType of
- cftChecker, cftOwner:
- begin
- UserID := AID;
- UserName := IsMe(AID, AName);
- UserRole := ARole;
- lblOrderCheckerName.Caption := UserName;
- lblOrderCheckerRole.Caption := ARole;
- lblOrderCheckerCompany.Caption := ACompany;
- CheckerMemo := RecoverCharsFromJson(ACheckerMemo);
- if FileExists(AImagePath) then
- imgOrderCheckerPic.Picture.LoadFromFile(AImagePath)
- else
- imgOrderCheckerPic.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + 'DefaultImage.jpg');
- end;
- cftAdd:
- begin
- UserID := -1;
- UserName := '';
- UserRole := '';
- end;
- end;
- end;
- function TOrderCheckerFrame.IsChecking: Boolean;
- begin
- Result := CheckStatus = csChecking;
- end;
- function TOrderCheckerFrame.IsFinished: Boolean;
- begin
- Result := CheckStatus = csFinished;
- end;
- function TOrderCheckerFrame.IsMe(AID: Integer; AName: string): string;
- begin
- if AID = PHPWeb.UserID then
- Result := AName + '(我)'
- else
- Result := AName;
- end;
- // 审核状态:状态名称、颜色(状态名称、终审、编号)、图像边框
- procedure TOrderCheckerFrame.SetCheckStatus(const Value: TCheckStatus);
- var vColor: TColor;
- begin
- FCheckStatus := Value;
- lblOrderStatus.Caption := CheckStatusNames[Value];
- vColor := CheckStatusColors[Value];
- lblOrderCheckerNum.Font.Color := vColor;
- lblOrderStatus.Font.Color := vColor;
- lblLast.Font.Color := vColor;
- lblOrderCheckerMemo.Font.Color := vColor;
- // cxHintStyleController1.HintStyle.Color := clWindow; 气泡Hint,很帅,但是有Bug,频繁操作时会出错,废弃不用,可惜!
- // cxHintStyleController1.HintStyle.Font.Color := vColor;
- imgNotBegin.Visible := False;
- imgChecking.Visible := False;
- imgFinish.Visible := False;
- imgNotPass.Visible := False;
- if FCheckerFrameType <> cftAdd then
- begin
- case Value of
- csNotBegin:
- imgNotBegin.Visible := True;
- csChecking:
- imgChecking.Visible := True;
- csFinished:
- imgFinish.Visible := True;
- csNotPass:
- imgNotPass.Visible := True;
- end;
- end;
- end;
- procedure TOrderCheckerFrame.SetOrder(const Value: Integer);
- begin
- FOrder := Value;
- lblOrderCheckerNum.Caption := IntToStr(FOrder);
- lblOrderCheckerNum.Update;
- end;
- procedure TOrderCheckerFrame.shpAddMouseDown(Sender: TObject;
- Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
- var
- FindUserForm: TFindUserForm;
- begin
- if Button = mbLeft then
- begin
- FindUserForm := TFindUserForm.Create(nil);
- FindUserForm.ProjectData := TCheckerFrame(Owner).ProjectData;
- FindUserForm.Owner := Self;
- try
- FindUserForm.ShowModal;
- finally
- FindUserForm.Free;
- end;
- end;
- end;
- procedure TOrderCheckerFrame.btnDeleteClick(Sender: TObject);
- var sURL: string;
- vProj: TProjectData;
- vArr: array of string;
- begin
- if Application.MessageBox('确定要删除该审核人吗?', '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
- Exit;
- vProj := TProjectData(TCheckerFrame(Owner).ProjectData);
- sURL := Format('%suser/del/%d/%d/%d/audit', [PHPWeb.MeasureURL, Self.UserID,
- vProj.WebID, vProj.PhaseIndex]);
- vArr := VarArrayOf(['msg']);
- case PHPWeb.Search(sURL, [], [], vArr) of
- 1:
- begin
- // 这里直接调用Init方法会出问题,因为事件还没影响完就被释放了,运行出错。
- // 问题的根源在于触发事件的位置来自控件的内部(即使这里调用外部的方法来
- // 搞定它也不行),CS常规的设计方法是外部来控制它,而不是由自身来控制。
- // 这算是BS设计跟CS设计差异的一个体现吧。
- TCheckerFrame(Owner).tRefreshCheckers.Enabled := True;
- end;
- 0:
- begin
- Application.MessageBox(PChar(PHPWeb.PageError('无法删除审核人' + '[' + vArr[0] + ']')),
- '警告', MB_OK + MB_ICONWARNING);
- Exit;
- end;
- -1:
- begin
- Application.MessageBox(PChar(PHPWeb.NetError('无法删除审核人')),
- '警告', MB_OK + MB_ICONWARNING);
- end;
- end;
- end;
- procedure TOrderCheckerFrame.SetCheckerMemo(const Value: string);
- begin
- FCheckerMemo := Value;
- lblOrderCheckerMemo.Caption := ShortText(FCheckerMemo, 250);
- lblOrderCheckerMemo.Hint := CustomWidthText(FCheckerMemo, 300);
- lblOrderCheckerMemo.Update;
- end;
- end.
|