線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1737
推到 Plurk!
推到 Facebook!

有誰用過TreeComp這個元件?

尚未結案
dinoca
一般會員


發表:26
回覆:14
積分:8
註冊:2004-11-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-24 02:12:30 IP:220.229.xxx.xxx 未訂閱
有誰用過TreeComp這個元件? 如果我要用Delphi呼叫這個TreeComp.exe執行完之後, 要怎摸知道是否已經做完結束,可以關閉視窗,返回原有程式? 我現在使用Winexec(mySTR);呼叫他 MySTR := 'd:\treecomp\treecomp.exe .....'; 但是不知道怎摸偵測他是否已經執行完畢. 請各位大大幫忙看看 謝謝
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-24 02:31:38 IP:61.222.xxx.xxx 未訂閱
uses Shellapi;    function FileExecuteWait(const FileName, Params, StartDir: string;
                         Const Visibility:integer=SW_Normal): Integer;
var
  Info: TShellExecuteInfo;
  ExitCode: DWORD;
begin
  FillChar(Info, SizeOf(Info), 0);
  Info.cbSize := SizeOf(TShellExecuteInfo);
  with Info do begin
    fMask := SEE_MASK_NOCLOSEPROCESS;
    Wnd := Application.Handle;
    lpFile := PChar(FileName);
    lpParameters := PChar(Params);
    lpDirectory := PChar(StartDir);
    nShow :=Visibility;
  end;
  if ShellExecuteEx(@Info) then begin
    repeat
      Application.ProcessMessages;
      GetExitCodeProcess(Info.hProcess, ExitCode);
    until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
    Result := ExitCode;
  end
  else Result := -1;
end;
Winexec(mySTR) 改為 FileExecuteWait(mySTR,'','d:\treecomp');
dinoca
一般會員


發表:26
回覆:14
積分:8
註冊:2004-11-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-24 02:49:20 IP:220.229.xxx.xxx 未訂閱
mystr := 'd:\program files\treecomp\treecomp ' Edit1.Text '' ' ' Edit2.Text '' ' /timestamp /SIZE /SYNCHRONIZE_LEFT_TO_RIGHT /QUIT_WHEN_CLEAN'; //showmessage(mystr); winexec(pchar(MYSTR),SW_SHOW); 大大: 我使用的mystr像上面這樣,edit1.text是 startdir, edit2.text是 目的dir 不知道您的function我應該要怎摸改? 謝謝
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-24 02:57:28 IP:61.222.xxx.xxx 未訂閱
treecomp.exe 應該是執行檔吧! FileExecuteWait(執行檔位置,參數,起始目錄); 故 FileExecuteWait('d:\program files\treecomp\treecomp.exe' ,Edit1.Text '' ' ' Edit2.Text '' ' /timestamp /SIZE /SYNCHRONIZE_LEFT_TO_RIGHT /QUIT_WHEN_CLEAN','')
dinoca
一般會員


發表:26
回覆:14
積分:8
註冊:2004-11-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-24 03:06:10 IP:220.229.xxx.xxx 未訂閱
大大: 我試了一下,可以Run 不過這邊有個小小問題想再請教 因為呼叫這個程式出來使用 那我要顯示訊息Form告訴使用者,正在執行此項程式,請他稍後片刻。 等到關閉視窗後,這個訊息Form也會不見。 這樣的話,我應該怎摸作? 不好意思,Delphi的新手。很多都不太了解。 拜託大大撥空解答 謝謝 再次謝謝
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-24 03:25:54 IP:61.222.xxx.xxx 未訂閱
引言: 大大: 我試了一下,可以Run 不過這邊有個小小問題想再請教 因為呼叫這個程式出來使用 那我要顯示訊息Form告訴使用者,正在執行此項程式,請他稍後片刻。 等到關閉視窗後,這個訊息Form也會不見。 這樣的話,我應該怎摸作? 不好意思,Delphi的新手。很多都不太了解。 拜託大大撥空解答 謝謝 再次謝謝
那麼,您可能要定義
var
  WaitForm :TForm;    Procedure WaitMsg(MSG:String);
var
  Prompt: TPanel;
begin
  if Not Assigned(WaitForm) then
  begin
    WaitForm := TForm.Create(Application);
    with WaitForm do
    begin
      Canvas.Font := Font;
      BorderStyle := bsNone;
      FormStyle   := fsStayOnTop;
      Position := poScreenCenter;
      Prompt := TPanel.Create(WaitForm);
      with Prompt do
      begin
        Parent := WaitForm;
        BevelInner := bvLowered;
        Align  := alClient;
        Caption := MSG;
      end;
      Width := Canvas.Textwidth(MSG) 60;
      Height := Canvas.TextHeight('F') 20;
      Show;
      Repaint;
    end;
  end;
end;    Procedure WaitMsgClose;
var
  Prompt: TPanel;
begin
  if Assigned(WaitForm) then
  begin
    WaitForm.Close;
    FreeandNil(WaitForm);
  end;
end;
在 FileExecuteWait 前顯示 WaitMSG 
之後 WaitMSGClose 關閉訊息。
發表人 - wameng 於 2004/11/24 03:26:51
dinoca
一般會員


發表:26
回覆:14
積分:8
註冊:2004-11-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-24 16:59:23 IP:220.229.xxx.xxx 未訂閱
大大,很抱歉,我今天測試的時候發現,還是會有關不掉的狀況產生, 也就是使用TreeComp元件執行後,跳不開 if ShellExecuteEx(@Info) then begin repeat Application.ProcessMessages; GetExitCodeProcess(Info.hProcess, ExitCode); until (ExitCode <> STILL_ACTIVE) or Application.Terminated; Result := ExitCode; end else Result := -1; 這段code所以TreeComp視窗還會存在 可以請大大幫忙看一下嗎?
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-25 05:46:35 IP:61.222.xxx.xxx 未訂閱
引言: 大大,很抱歉,我今天測試的時候發現,還是會有關不掉的狀況產生, 也就是使用TreeComp元件執行後,跳不開 if ShellExecuteEx(@Info) then begin repeat Application.ProcessMessages; GetExitCodeProcess(Info.hProcess, ExitCode); until (ExitCode <> STILL_ACTIVE) or Application.Terminated; Result := ExitCode; end else Result := -1; 這段code所以TreeComp視窗還會存在 可以請大大幫忙看一下嗎?
Sorry !我疏忽了! Application.ProcessMessages; 改為 WaitforSingleObject(Info.hProcess,INFINITE);
dinoca
一般會員


發表:26
回覆:14
積分:8
註冊:2004-11-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-25 06:50:43 IP:220.229.xxx.xxx 未訂閱
大大 還是不行耶 這個比對軟體,很奇怪,當我source目錄下面與目的目錄下面的檔案相同時候,並不會有關不掉的問題。 但是當目的檔案有多出來的時候會有關不掉視窗的狀況發生
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-11-25 10:03:15 IP:61.222.xxx.xxx 未訂閱
> 但是當目的檔案有多出來的時候會有關不掉視窗的狀況發生    FileExecuteWait 主要用來執行並等待執行檔(Process)結束。 若該執行檔未能結束,當然就會等待在那裡。    如果您指的是 WaitMSG 未能關閉。 請檢查該執行檔是否仍然存在。    
WaitMsg('處理中);
Try
  FileExecuteWait(....
finally
  WaintMsgClose;
end;
另外
var
  WaitForm :TForm;    最好是定義全域
hdflove
一般會員


發表:4
回覆:3
積分:1
註冊:2004-10-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-12-01 15:47:09 IP:219.136.xxx.xxx 未訂閱
为什么我先开一个其它WORD文档,然后再调用 FileExecuteWait('D:\Microsoft Office\Office\WINWORD.EXE','d:\wlm.doc','D:\'); 就有问题?要是系统中没有开其它WORD文档就可以
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-12-02 10:14:39 IP:219.68.xxx.xxx 未訂閱
  if ShellExecuteEx(@Info) then begin
    repeat
      WaitforSingleObject(Info.hProcess,INFINITE);
      GetExitCodeProcess(Info.hProcess, ExitCode);
    until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
    Result := ExitCode;
  end
 
WaitforSingleObject(Info.hProcess,INFINITE); 應該就會在此行等待程式結束 所以下面的 GetExitCodeProcess(Info.hProcess, ExitCode); 會直接通過 因為此時 ExitCode 已經 <> STILL_ACTIVE 記得一般這兩種寫法則一即可
 1. WaitforSingleObject(Info.hProcess,INFINITE); 
 
 2. repeat
      Sleep(1000);//曾經遇過被等待的程式若無此行會hang住, 因此拉長檢查間隔, 一般是可以不用
      GetExitCodeProcess(Info.hProcess, ExitCode);
    until (ExitCode <> STILL_ACTIVE) or Application.Terminated; 
          
 
請多指教 發表人 - chris_shieh 於 2004/12/02 10:16:21
系統時間:2024-07-03 13:17:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!