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

📄 ffieldframe.pas

📁 Workflow Studio是一款专为商业进程管理(BPM)设计的Delphi VCL框架。通过Workflow Studio你可以轻易地将工作流与BPM功能添加到你的应用程序里。这样能使你或你的最
💻 PAS
字号:
unit fFieldFrame;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, ComCtrls, StdCtrls, wsClasses;

type
  TfrFieldFrame = class(TFrame)
    Panel1: TPanel;
    lvVars: TListView;
    Splitter1: TSplitter;
    Panel2: TPanel;
    Label1: TLabel;
    edCaption: TEdit;
    cbReadOnly: TCheckBox;
    cbRequired: TCheckBox;
    Label2: TLabel;
    cbVariable: TComboBox;
    Panel3: TPanel;
    btAdd: TButton;
    btDelete: TButton;
    procedure btAddClick(Sender: TObject);
    procedure lvVarsSelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
    procedure PropertyChanged(Sender: TObject);
    procedure btDeleteClick(Sender: TObject);
    procedure lvVarsEdited(Sender: TObject; Item: TListItem;
      var S: String);
    procedure edCaptionChange(Sender: TObject);
  private
    { Private declarations }
    FFields: TTaskFields;
    FUpdatingControls: integer;
    procedure BeginUpdateControls;
    procedure DeleteCurrentVar;
    procedure EndUpdateControls;
    procedure LoadVarInEditors(AVar: TTaskField);
    procedure SaveEditorsInVar(AVar: TTaskField);
    procedure SetControlsEnabled(AEnabled: boolean);
    procedure UpdateListItem(AItem: TListItem; AVar: TTaskField);
    procedure VarsToInterface;
    procedure ClearEditors;
    procedure FillVariableCombo(ADiagram: TWorkflowDiagram);
    procedure Localize;
    function TaskFieldFromItem(AItem: TListItem): TTaskField;
  protected
    procedure Loaded; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure LoadTaskInEditors(ATask: TTaskDefinition; ADiagram: TWorkflowDiagram);
    procedure SaveEditorsInTask(ATask: TTaskDefinition);
    procedure ClearAll; 
  end;

implementation
uses wsBlocks, wsRes;

{$R *.DFM}

procedure TfrFieldFrame.VarsToInterface;
var
  c: integer;
begin
  lvVars.Items.Clear;
  for c := 0 to FFields.Count - 1 do
    UpdateListItem(lvVars.Items.Add, FFields[c]);
  ClearEditors;
  if lvVars.Items.Count > 0 then
    lvVars.Selected := lvVars.Items[0];
end;

procedure TfrFieldFrame.UpdateListItem(AItem: TListItem; AVar: TTaskField);
begin
  AItem.Caption := AVar.Caption;
  {$WARNINGS OFF}
  AItem.Data := AVar;
  {$WARNINGS ON}
end;

procedure TfrFieldFrame.btAddClick(Sender: TObject);
var
  NewVar: TTaskField;
  //NewName: string;
  //i: integer;
  NewItem: TListItem;
begin
  if lvVars.Enabled then
  begin
    {Add variable in collection}
    NewVar := FFields.Add;

    NewVar.Caption := _str(SEnterVariableCaption);

    {Create item in list view}
    NewItem := lvVars.Items.Add;
    UpdateListItem(NewItem, NewVar);

    {select and start renaming the item. EditCaption already selects the item}
    NewItem.EditCaption;
  end;
end;

function TfrFieldFrame.TaskFieldFromItem(AItem: TListItem): TTaskField;
begin
  {$WARNINGS OFF}
  result := TTaskField(AItem.Data);
  {$WARNINGS ON}
end;

procedure TfrFieldFrame.lvVarsSelectItem(Sender: TObject;
  Item: TListItem; Selected: Boolean);
begin
  if (lvVars.SelCount = 1) then
    LoadVarInEditors(TaskFieldFromItem(lvVars.Selected))
  else
    ClearEditors;
end;

procedure TfrFieldFrame.LoadVarInEditors(AVar: TTaskField);
begin
  if AVar <> nil then
  begin
    BeginUpdateControls;
    try
      edCaption.Text := AVar.Caption;
      cbReadOnly.Checked := AVar.ReadOnly;
      cbRequired.Checked := AVar.Required;
      cbVariable.Text := AVar.WorkflowVarName;
      SetControlsEnabled(true);
    finally
      EndUpdateControls;
    end;
  end;
end;


procedure TfrFieldFrame.SaveEditorsInVar(AVar: TTaskField);
begin
  if AVar <> nil then
  begin
    AVar.Caption := edCaption.Text;
    AVar.ReadOnly := cbReadOnly.Checked;
    AVar.Required := cbRequired.Checked;
    AVar.WorkflowVarName := cbVariable.Text;
  end;
end;

procedure TfrFieldFrame.ClearEditors;
begin
  BeginUpdateControls;
  try
    edCaption.Text := '';
    cbReadOnly.Checked := false;
    cbRequired.Checked := false;
    cbVariable.Text := '';

    SetControlsEnabled(false);
  finally
    EndUpdateControls;
  end;
end;

procedure TfrFieldFrame.PropertyChanged(Sender: TObject);
begin
  if (lvVars.SelCount = 1) and (FUpdatingControls = 0) then
    SaveEditorsInVar(TaskFieldFromItem(lvVars.Selected));
end;

procedure TfrFieldFrame.btDeleteClick(Sender: TObject);
begin
  if lvVars.Enabled then
  begin
    if MessageDlg(_str(SConfirmDeleteItems), 
       mtConfirmation,[mbYes,mbNo],0) = mrYes then
    begin
       while lvVars.SelCount > 0 do
          DeleteCurrentVar;
       if lvVars.Items.Count > 0 then
          lvVars.Selected := lvVars.Items[lvVars.items.Count - 1]
       else
          ClearEditors;
       lvVars.SetFocus;
    end;
  end;
end;

procedure TfrFieldFrame.DeleteCurrentVar;
begin
  if Assigned(lvVars.Selected) then
  begin
    TaskFieldFromItem(lvVars.Selected).Free;
    {$WARNINGS OFF}
    lvVars.Selected.Data := nil;
    {$WARNINGS ON}
    lvVars.Selected.Free;
  end;
end;

constructor TfrFieldFrame.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FFields := TTaskFields.Create(nil, TTaskField);
end;

destructor TfrFieldFrame.Destroy;
begin
  FFields.Free;
  inherited;
end;

procedure TfrFieldFrame.BeginUpdateControls;
begin
  inc(FUpdatingControls);
end;

procedure TfrFieldFrame.EndUpdateControls;
begin
  dec(FUpdatingControls);
end;



procedure TfrFieldFrame.lvVarsEdited(Sender: TObject; Item: TListItem;
  var S: String);
var
  AVar: TTaskField;
begin
  AVar := TaskFieldFromItem(Item);
  if AVar <> nil then
  begin
    if Trim(S) = '' then
      S := AVar.Caption
    else
    begin
      AVar.Caption := S;
      LoadVarInEditors(AVar);
    end;
  end;
end;

procedure TfrFieldFrame.SetControlsEnabled(AEnabled: boolean);
begin
  edCaption.Enabled := AEnabled;
  cbReadOnly.Enabled := AEnabled;
  cbRequired.Enabled := AEnabled;
  cbVariable.Enabled := AEnabled;
end;

procedure TfrFieldFrame.LoadTaskInEditors(ATask: TTaskDefinition; ADiagram: TWorkflowDiagram);
begin
  FFields.Assign(ATask.Fields);
  lvVars.Enabled := true;
  btAdd.Enabled := true;
  btDelete.Enabled := true;
  FillVariableCombo(ADiagram);
  VarsToInterface;
end;

procedure TfrFieldFrame.SaveEditorsInTask(ATask: TTaskDefinition);
begin
  ATask.Fields.Assign(FFields);
end;

procedure TfrFieldFrame.FillVariableCombo(ADiagram: TWOrkflowDiagram);
var
  c: integer;
begin
  cbVariable.Items.Clear;
  if ADiagram <> nil then
  begin
    for c := 0 to ADiagram.Variables.Count - 1 do
       cbVariable.Items.Add(ADiagram.Variables[c].Name);
  end;
end;

procedure TfrFieldFrame.ClearAll;
begin
  lvVars.Items.Clear;
  lvVars.Enabled := false;
  btAdd.Enabled := false;
  btDelete.Enabled := false;
  ClearEditors;
end;

procedure TfrFieldFrame.edCaptionChange(Sender: TObject);
begin
  PropertyChanged(Sender);
  if lvVars.Selected <> nil then
    UpdateListItem(lvVars.Selected, TaskFieldFromItem(lvVars.Selected));
end;

procedure TfrFieldFrame.Localize;
begin
  Label1.Caption := _str('frFieldFrame.Label1.Caption');
  Label2.Caption := _str('frFieldFrame.Label2.Caption');
  cbReadOnly.Caption := _str('frFieldFrame.cbReadOnly.Caption');
  cbRequired.Caption := _str('frFieldFrame.cbRequired.Caption');
  btAdd.Caption := _str('frFieldFrame.btAdd.Caption');
  btDelete.Caption := _str('frFieldFrame.btDelete.Caption');
end;

procedure TfrFieldFrame.Loaded;
begin
  inherited;
  with lvVars.Columns.Add do
  begin
    AutoSize := True;
    Caption := _str(SVariables);
  end;
  Localize;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -