|
我的代码中有两个事件,一个是时钟timer事件,如下:
procedure TMAINFORM.Timer1Timer(Sender: TObject);
begin
FWdatasetBroker.DataSet.Refresh;
Timer1.Interval:=1000*30;
Timer1.Enabled:=true;
end;
该timer就是刷新数据集,
还有一个popupmenu,它有一个“处理”子menu,这个处理按钮的事件是:
procedure TMAINFORM.N1Click(Sender: TObject);
var
lDataSet : TDataSet;
lTaskParam: TLoadTaskParam;
lFlowParam: TLoadFlowParam;
lTasks: TTasks;
lFunc: TFunc;
lFlowControl: TFlowControl;
lContext: TContext;
lContextCurrent: TContextCurrent;
lOrgUnit: TOrgUnit;
APerson:String;
ldept,lgw,lid:string;
begin
ldept := getCurDeptID;
lgw := getCurGW;
lid := getCurID;
CommonLib.TCommonLib.UserStartFlow(Context, 'Biz:\FWT\PROC\FWLC.PROC', 'FWQQ', FWDataSetBroker.DataSet.FieldByName('FWQQB_BH').Asstring,'', 'desc', ldept, lgw, lid);
lDataSet := FWDataSetBroker.DataSet;
if not lDataSet.Active or lDataSet.Eof then
Exit;
lFlowParam := TLoadFlowParam.Create;
lTaskParam := TLoadTaskParam.Create;
lTasks := TTasks.Create;
try
// dialogs.ShowMessage(lDataSet.FieldByName('FWQQB_BH').AsString);
//根据ProductID,找到对应的流程Guid值
DoGetFlowGUIDs(lDataSet.FieldByName('FWQQB_BH').AsString, lFlowParam.GUIDs);
lTaskParam.States := [TTaskState.tsStarted, TTaskState.tsProcessing, TTaskState.tsWaiting];
lFlowParam.ProcURLs.Add('Biz:\FWT\PROC\FWLC.PROC');
//以给定的条件查询任务(这里给定的条件由lFlowParam给出,根据流程Guid值查询,lTaskParam条件是按照任务状态,只查询出需要处理的任务)
Flow.FlowEngine.GetTasks(lFlowParam, lTaskParam, lTasks);
lContextCurrent := TContextCurrent.Create(Context);
lOrgUnit := lContextCurrent.PersonMember;
APerson := lOrgUnit.ID;
if APerson = lTasks[0].TaskMessages[0].ReceiverID then
begin
lContext := GetTaskContext(lTasks[0]);
lFunc := SystemCore.TSystemCore.FuncManager.RunTask(lContext, lTasks[0]);
end else
Business.Forms.Dialogs.ShowMessage('该任务未交由您处理');
//SystemCore.TSystemCore.FuncManager.RunTask(SystemCore.TSystemCore.Operator.Positions[0], lTasks[0]);
//如果需要自动流转,则需要下面的代码vvvvvvvvvvvvvv
//lFlowControl := lFunc.Context.GetParentContext(BizSys.IL_FLOW).Owner as TFlowControl;
//lFlowControl.FlowOut(nil);
//如果需要自动流转,则需要下面的代码^^^^^^^^^^^^^^
finally
lFlowParam.Free;
lTaskParam.Free;
lTasks.Free;
end;
end;
发现在偶然的情况下,也就是timer事件执行时,刷新数据集时,如果正好这时按下了“处理”按钮,那么N1Click事件就被执行了两次。
不知道是为什么?
有没有什么办法避免呢?
比如:timer事件中限制,此时不接受N1click事件,或者其他别的方法? |
|