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

📄 ftasklist.pas

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

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, wsMain,
  Db, Grids, DBGrids, ComCtrls, wsControls, ExtCtrls, fTaskInstanceView,
  atDiagram, LiveDiagram, wsClasses, wsDB, StdCtrls, ActnList, Menus;

type
  TfmTaskList = class(TForm)
    Panel1: TPanel;
    lvTasks: TTaskListView;
    Panel2: TPanel;
    Panel3: TPanel;
    Splitter1: TSplitter;
    Splitter2: TSplitter;
    Splitter3: TSplitter;
    btSaveChanges: TButton;
    TabControl1: TTabControl;
    frTaskView: TfrTaskInstanceView;
    ActionList1: TActionList;
    acShowAllTasks: TAction;
    PopupMenu1: TPopupMenu;
    acShowOnlyOpen: TAction;
    miView: TMenuItem;
    Showonlyopentasks2: TMenuItem;
    Showalltasks2: TMenuItem;
    WorkflowDiagram1: TWorkflowDiagram;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btSaveChangesClick(Sender: TObject);
    procedure WorkflowDiagram1Click(Sender: TObject);
    procedure TabControl1Change(Sender: TObject);
    procedure lvTasksSelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
    procedure acShowOnlyOpenExecute(Sender: TObject);
    procedure acShowOnlyOpenUpdate(Sender: TObject);
    procedure acShowAllTasksExecute(Sender: TObject);
    procedure acShowAllTasksUpdate(Sender: TObject);
    procedure lvTasksCustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FWorkIns: TWorkflowInstance;
    FLastActivePageName: string;
    FUpdatingTabs: integer;
    FFieldPanel: TTaskFieldPanel;
    FLogView: TTaskLogListView;
    FFreeOnClose: boolean;
    function GetWorkIns: TWorkflowInstance;
    procedure AddAttachmentTab(AAttach: TWorkflowAttachment; APermissions: TAttachmentPermissions);
    procedure UpdateFieldsTab;
    procedure UpdateActivePage;
    procedure UpdateFixedTabs;
    function FindTabByType(AType: integer): integer;
    procedure SaveChanges;
    procedure UpdateWorkflowDiagram;
    procedure UpdateAttachmentTabs;
    procedure BeginUpdateTabs;
    procedure EndUpdateTabs;
    procedure Localize;
    procedure UpdateLogTab;
    { Private declarations }
  protected
    procedure Loaded; override;
  public
    { Public declarations }
    procedure SetFilter(FilterType: TTaskFilterType; AFilter: string);
    procedure LoadData;
    property FreeOnClose: boolean read FFreeOnClose write FFreeOnClose;
  end;

implementation
uses fAttachmentFrame, wsRes;

{$R *.DFM}

const
  _TaskTabIndex = 1;
  _WorkflowTabIndex = 2;
  _FieldTabIndex = 3;
  _TaskLogIndex = 4;

  _MaxFixedTab = 4;

{ TfmTaskList }

procedure TfmTaskList.LoadData;
begin
  lvTasks.LoadFromDatabase;
  if lvTasks.SelectedTask = nil then
  begin
    if lvTasks.Items.Count > 0 then
      lvTasks.Items.Item[0].Selected := true
    else
      lvTasksSelectItem(nil, nil, false);
  end;
end;

procedure TfmTaskList.UpdateActivePage;
var
  AFrame: TfrAttachmentFrame;
begin
  if FUpdatingTabs = 0 then
  begin
    if (TabControl1.TabIndex = -1) and (TabControl1.Tabs.Count > 0) then
    begin
      TabControl1.TabIndex := 0;
    end;

    if TabControl1.TabIndex > -1 then
      {$WARNINGS OFF}
      Case integer(TabControl1.Tabs.Objects[TabControl1.TabIndex]) of
      {$WARNINGS ON}
        _TaskTabIndex:
          begin
            //frTaskView.Visible := true;
            frTaskView.BringToFront;
          end;
        _WorkflowTabIndex:
          begin
            //WorkflowDiagram1.Visible := true;
            TControl(WorkflowDiagram1).BringToFront;
            WorkflowDiagram1.MakeActiveNodeVisible;
            //WorkflowDiagram1.SetFocus;
          end;
        _FieldTabIndex:
          begin
            FFieldPanel.BringToFront;
          end;
        _TaskLogIndex:
          begin
            if lvTasks.SelectedTask <> nil then
              FLogView.TaskInsKey := lvTasks.SelectedTask.Key
            else
              FLogView.TaskInsKey := '';
            FLogView.LoadFromDatabase; 
            FLogView.BringToFront;
          end;
      else
        AFrame := TfrAttachmentFrame(TabControl1.Tabs.Objects[TabControl1.TabIndex]);
        //AFrame.Visible := true;
        AFrame.BringToFront;
      end;
  end;
end;

(*function TfmTaskList.WorkflowTabVisible: boolean;
begin
  result := (TabControl1.TabIndex > -1) and (integer(TabControl1.Tabs.Objects[TabControl1.TabIndex]) = _WorkflowTabIndex);
end;*)

procedure TfmTaskList.UpdateWorkflowDiagram;
var
  AWorkIns: TWorkflowInstance;
begin
//  if WorkflowTabVisible then
    if (lvTasks.SelectedTask <> nil) or (lvTasks.FilterType = tfWorkIns) then
    begin
      WorkflowDiagram1.BeginUpdate;
      try
        AWorkIns := GetWorkIns;
        AWorkIns.AssignToDiagram(WorkflowDiagram1, true);

        Case AWorkIns.Status of
          wsNotStarted:
            WorkflowDiagram1.ViewStateMode := vmStart;
          wsFinished, wsFinishedWithError:
            WorkflowDiagram1.ViewStateMode := vmEnd;
        else
            WorkflowDiagram1.ViewStateMode := vmRun;
        end;

        WorkflowDiagram1.TopRuler.Visible := false;
        WorkflowDiagram1.LeftRuler.Visible := false;
        WorkflowDiagram1.AutoPage := false;
        WorkflowDiagram1.AutoScroll := true;
        WorkflowDiagram1.PageLines.Visible := false;
        WorkflowDiagram1.State := dsView;
        WorkflowDiagram1.MakeActiveNodeVisible;
      finally
        WorkflowDiagram1.EndUpdate;
      end;
    end else
      WorkflowDiagram1.Clear;
end;

procedure TfmTaskList.FormCreate(Sender: TObject);
begin
  //frTaskView.OnTaskChanged := TaskEdited;
  FFieldPanel := TTaskFieldPanel.Create(Self);
  FFieldPanel.Parent := TabControl1;
  FFieldPanel.Align := alClient;

  FLogView := TTaskLogListView.Create(Self);
  FLogView.Parent := TabControl1;
  FLogView.Align := alClient;

  FUpdatingTabs := 0;
  frTaskView.Task := nil;

  {Create list view columns}
  lvTasks.Columns.Clear;
  With lvTasks.Columns.Add do
  begin
    Caption := _str(SColumnKey);
    Width := 40;
  end;
  With lvTasks.Columns.Add do
  begin
    Caption := _str(SColumnName);
    Width := 100;
  end;
  With lvTasks.Columns.Add do
  begin
    Caption := _str(SColumnWorkflow);
    Width := 100;
  end;
  With lvTasks.Columns.Add do
  begin
    Caption := _str(SColumnSubject);
    Width := 220;
  end;
  With lvTasks.Columns.Add do
  begin
    Caption := _str(SColumnStatus);
    Width := 100;
  end;
  With lvTasks.Columns.Add do
  begin
    Caption := _str(SColumnUser);
    Width := 100;
  end;
end;

procedure TfmTaskList.SaveChanges;

  (*function FindListView(ATab: TComponent): TAttachmentListView;
  var
    c: integer;
  begin
    result := nil;
    for c := 0 to ATab.ComponentCount - 1 do
    begin
      if ATab.Components[c] is TAttachmentListView then
      begin
        result := TAttachmentListView(ATab.Components[c]);
        exit;
      end else
      begin
        result := FindListView(ATab.Components[c]);
        if result <> nil then
          exit;
      end;
    end;
  end;*)

var
  AAttach: TWorkflowAttachment;
  AWorkIns: TWorkflowInstance;
  lvItems: TAttachmentListView;
  c: integer;
begin
  if lvTasks.SelectedTask <> nil then
  begin
    {Get the workflowinstance related to the task}
    AWorkIns := GetWorkIns;

    {Save the attachments}
    {$WARNINGS OFF}
    for c := 0 to TabControl1.Tabs.Count - 1 do if integer(TabControl1.Tabs.Objects[c]) > _MaxFixedTab then
    {$WARNINGS ON}
    begin
      AAttach := AWorkIns.Diagram.Attachments.FindByName(TabControl1.Tabs[c]);
      if AAttach <> nil then
      begin
        lvItems := TfrAttachmentFrame(TabControl1.Tabs.Objects[c]).lvItems;
        if lvItems <> nil then
        begin
          AAttach.Items.Assign(lvItems.Attachments);
        end;
      end;
    end;

    {Save the fields}
    if FindTabByType(_FieldTabIndex) > -1 then
    begin
      if not FFieldPanel.ValidateValues then
      begin
        TabControl1.TabIndex := FindTabByType(_FieldTabIndex);
        TabControl1Change(TabControl1);
        if FFieldPanel.CanFocus then
          FFieldPanel.SetFocus;
        FFieldPanel.FocusLastError;
        ShowMessage(FFieldPanel.ErrorInfo.Msg);
        Abort;
        //raise EWorkflowException.Create(FFieldPanel.ErrorInfo.Msg);
      end;
      FFieldPanel.SaveDiagramVariables(AWorkIns.Diagram);
    end;

    {Save the workflow instance}
    WorkflowStudio.WorkflowManager.SaveWorkflowInstance(AWorkIns);

    {Save the task instance. WARNING - this should be done after any saving code, because
     it loads the workflowinstance and signal it (run it again). So, it must be executed
     after all processing so it gets the most up to date workflow instance object}
    WorkflowStudio.TaskManager.SaveTaskInstance(lvTasks.SelectedTask);

    {From below, it's only visual stuff}                      

    {Reload the task list from database, in case it's not more in the list (for example,
     it might be completed}
    LoadData;
    //lvTasks.LoadFromDatabase;
  end;
end;

⌨️ 快捷键说明

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