shellexecute 执行顺序?(100)

  • 主题发起人 主题发起人 terry_zhou82
  • 开始时间 开始时间
T

terry_zhou82

Unregistered / Unconfirmed
GUEST, unregistred user!
我的代码如下:begin table1.first; got_it:=false;while (not table1.eof) and (not got_it) do begin if (((FormatDateTime('yy:mm:dd',now)=FormatDateTime('yy:mm:dd',Table1.FieldByName('日期').AsDateTime)) and (formatdatetime('HH:mm',now)=formatdatetime('HH:mm',Table1.FieldByName ('时间').AsDateTime))) or (formatdatetime('HH:mm',now)=formatdatetime ('HH:mm',Table1.FieldByName('时间').AsDateTime))) then got_it:=true else begin table1.Next ; end; end;if not table1.Eof then begin l:=Table1.FieldByName('内容').AsString;if l= '文件' then begin shellexecute..//执行指定文件 end;if table1.fieldbyname('*').asstring='*' then begin abstable1.delete; end; end;end;问题就是每次执行到这里shellexecute时,总是直接table1.DELETE掉了。而没有执行shellexecute里面的代码。高手知道怎么修改吗?
 
你的代码很难看懂,第7行有个except,一般来说try .. except ...end是个组合。另外,不可以table1.fieldbyname('*').asstring吧?还有table1.delete;前根本就不需要table1.edit;把代码对齐,让别人看你代码理解思路也方便一些。
 
代码太乱了,你贴完整的~~看不懂
 
帮你整理吧,方便别人看。begin table1.first; got_it := false; while (not table1.eof) and (not got_it) do begin if (((FormatDateTime('yy:mm:dd', now) = FormatDateTime('yy:mm:dd', Table1.FieldByName('日期').AsDateTime)) and (formatdatetime('HH:mm', now) = formatdatetime('HH:mm', Table1.FieldByName('时间').AsDateTime))) or (formatdatetime('HH:mm', now) = formatdatetime('HH:mm', Table1.FieldByName('时间').AsDateTime))) then got_it := true else begin table1.Next; end; end; if not table1.Eof then begin l := Table1.FieldByName('内容').AsString; if l = '文件' then begin shellexecute..//执行指定文件 end; if table1.fieldbyname('*').asstring = '*' then begin abstable1.delete; end; end;end;-----------------------------看代码好像没错,可能是没能正确执行shellexecute,但table1.fieldbyname('*').asstring = '*'条件成立,所以执行了删除。
 
写的太乱了。
 
的确乱,用一些变量最好var t1;begin table1.first; got_it:=false; while (not table1.eof) and (not got_it) do begin t1 := FormatDateTime('yy:mm:dd',now); t2 := FormatDateTime('yy:mm:dd',Table1.FieldByName('日期').AsDateTime); t3 := formatdatetime('HH:mm',now); t4 := formatdatetime('HH:mm',Table1.FieldByName('时间').AsDateTime)); t5 := formatdatetime('HH:mm',now); t6 := formatdatetime('HH:mm',Table1.FieldByName('时间').AsDateTime)); if (((t1=t2) and (t3=t4) or (t5=t6) then begin got_it:=true end else begin table1.Next ; end; end; if not table1.Eof then begin l:=Table1.FieldByName('内容').AsString; if l= '文件' then begin shellexecute..//执行指定文件 end; if table1.fieldbyname('*').asstring='*' then begin abstable1.delete; end; end;end;看到没有,可以再怎么简化呢? 请遵循 70原则
 
各位大哥,代码简化我以后会改,但是现在的问题是,怎么样才可以让他执行起来?
 
用断点测试,看是什么问题,程序看不出问题,关键是条件为什么不会执行 shellexecute..
 
你的问题用简单的方法就是在shellexecute()后面加入Sleep(),时间可以长一点,比如3秒,复杂的方法要检索你的shellexecute()里面的进程,如有则继续,我试过这种方法,控制比较难,建议你还是直接延时。虽然不够灵活。
 
我用过SLEEP函数,不过好像没用。我把它加在在shellexecute后面,也放在了if table1.fieldbyname('*').asstring='*' then begin abstable1.delete; end;前面,不过测试好像都不行。
 
将l:=Table1.FieldByName('内容').AsString;改为 l:=trim(Table1.FieldByName('内容').AsString); 试下。有点怀疑字段不是varchar的,后面也许有自填空格。
 
没用的,我试过了。不是空格的问题
 
这种问题,嗨,小小问题!ShellExecute 将会创建一个新的线程!并不会执行完才往下走。你可以采用 CreateProcess(取代ShellExecute) 配合 WaitForSingleObject 来进行控制。
 
我参看了以前的资料。重新写了下面的代码,不过好像依旧不能运行procedure TForm1.defaultExe; var errnum : integer; ShellExInfo: TShellExecuteInfo;beginif errnum<=32 then ShowMessage(SysErrorMessage(errnum)); FillChar(ShellExInfo, SizeOf(ShellExInfo), 0); with ShellExInfo do begin cbSize := SizeOf(ShellExInfo); fMask := see_Mask_NoCloseProcess; Wnd := Application.Handle; lpFile := PChar(ABSTable1.FieldByName('执行文件').AsString); lpParameters := nil; // PChar(Params); nShow := sw_ShowNormal; end; if ShellExecuteEx(@ShellExInfo) then begin while WaitForSingleObject(ShellExInfo.HProcess, 100) = WAIT_TIMEOUT do begin Application.ProcessMessages; if Application.Terminated then Break; end; if abstable1.fieldbyname('*').asstring='*' then begin abstable1.delete; end; end;end;
 
大大可否帮帮我,或者cpj7406,帮我写个代码?
 
后退
顶部