全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1349
推到 Plurk!
推到 Facebook!

如何做出像是windows拷貝時的form

尚未結案
sswb
一般會員


發表:9
回覆:3
積分:2
註冊:2003-12-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-30 19:56:55 IP:61.61.xxx.xxx 未訂閱
當windows在拷貝時,不是會出現一個小視窗,會出現時間..正在拷貝的動作..以及類似progressbar嗎? 小弟的問題就是如此 我的問題在於如何在progressbar中ProgressBar1.Max :=???//讓他檢查正在靠被的檔案數量。???這個部分不會寫 以及拷貝的剩餘時間這部分 lable1:=???//讓他秀出剩餘時間。???這部分不知道要如何做 以及是如何做出ProgressBar1.Position :=???//拷貝的檔案數量???這部分的寫法 lable2:=???//正在拷貝的項目???這部分的寫法 請各位大大幫忙在此先謝謝了。 新手剛學,請多包函
------
新手剛學,請多包函
00156
高階會員


發表:45
回覆:195
積分:112
註冊:2002-06-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-30 21:20:48 IP:61.56.xxx.xxx 未訂閱
我的作法是先以FindFirst、FindNext掃描所有要複製的檔案,以取得拷貝檔案資訊(建立複製清單、計算檔案數量、檔案大小總和等),然後實際進行複製時就能設定ProgressBar1.Max、ProgressBar2.Position了。剩餘時間可能要動態地利用目前已完成的複製大小來估算,但是不見得很準就是了。 希望這能夠符合你的需求。
sswb
一般會員


發表:9
回覆:3
積分:2
註冊:2003-12-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-31 01:47:37 IP:61.61.xxx.xxx 未訂閱
感謝大大的回應,但是我是新手,所以不會用大大你說的語法寫,能請大大寫一下範例嗎? 如果不會耽誤大大的時間,小地在此先行謝過^^ 新手剛學,請多包函
------
新手剛學,請多包函
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-31 08:56:10 IP:218.160.xxx.xxx 未訂閱
Hi sswb: try this http://delphi.about.com/cs/adptips2001/a/bltip0201_3.htm 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
HomeSound
中階會員


發表:44
回覆:178
積分:94
註冊:2002-08-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-31 13:41:33 IP:61.30.xxx.xxx 未訂閱
引用文章如下: 希望是您要的 //複製SOURCE.TXT到DEST.TXT,FALSE參數告訴windows如果文件DEST.TXT //已經存在則複製失敗,CopyFile的返回值是BOOL類型 if( CopyFile("C:\\SOURCE.TXT","C:\\DEST.TXT", FALSE) == FALSE) Application->MessageBox("CopyFile failed", "Error", MB_OK);    //如果移動或刪除失敗則返回FALSE MoveFile("C:\\SOURCE.TXT","C:\\WINDOWS\\TEMP\\DEST.TXT"); DeleteFile("C:\\SOURCE.TXT");    這些功能很容易使用,但是不幸但是他們不顯示飛行文件夾動畫。為了顯示動畫,你必須使用SHFileOperation 這個API函數。下面是用SHFileOperation完成上面的操作的例子,注意複製和移動操作一定要指定目標文件夾。    //確認你包含了文件SHELLAPI.H //如果你好奇的話,這個文件地位置在INCLUDE\WIN32目錄下 #include  // 復制SOURCE.TXT到DEST.TXT; char *From = "C:\\SOURCE.TXT\0"; char *To = "C:\\DEST.TXT\0"; SHFILEOPSTRUCT op; ZeroMemory(&op, sizeof(op)); op.hwnd = Handle; // 主視窗或應用程序的句柄 op.wFunc = FO_COPY; op.pFrom = From; op.pTo = To; op.fFlags= 0; SHFileOperation( &op); // 移動SOURCE.TXT到windows的臨時目錄 char *From = "C:\\SOURCE.TXT\0"; char *To = "C:\\WINDOWS\\TEMP\0"; SHFILEOPSTRUCT op; ZeroMemory(&op, sizeof(op)); op.hwnd = Handle; op.wFunc = FO_MOVE; op.pFrom = From; op.pTo = To; op.fFlags= 0; SHFileOperation( &op); //把所有的臨時文件刪除到回收筒 char *File = "C:\\windows\\temp\\*.TMP\0"; SHFILEOPSTRUCT op; ZeroMemory(&op, sizeof(op)); op.hwnd = Handle; op.wFunc = FO_DELETE; op.pFrom = File; op.fFlags= FOF_ALLOWUNDO; SHFileOperation( &op); // 複製根目錄所有的文本文件到臨時目錄。 char *From = "C:\\*.TXT\0"; char *To = "C:\\WINDOWS\\TEMP\0"; SHFILEOPSTRUCT op; ZeroMemory(&op, sizeof(op)); op.hwnd = Handle; op.wFunc = FO_COPY; op.pFrom = From; op.pTo = To; op.fFlags= 0; SHFileOperation( &op); 注意: 1:當你指定FO_DELETE操作的時候,如果fFlags包含FOF_ALLOWUNDO,文件將送到回收筒,否則它們將被刪除. 2:op結構的項目pFrom和pTo是字符指針,而不是數組.它們必須指向一個字符串,因為結構不含有任何存儲空間,不能這樣做: op.pFrom = "C:\\*.TXT"; op.pTo = "C:\\TEMP"; 3:在文件名字符串中注意到額外的終止符0(在字符串中的'\0')。MSDN文檔表明pTo和pFrom字符串一定是雙重零結束。 4:pFrom和pTo指向的內存可以包含多個字符串,字符串之間用0分隔,最後也要用雙重0結束,下面是一個例子: char *From = "C:\\*.txt\0C:\\*.log\0C:\\*.tmp\0"; op.pFrom = From; //也可以用空白分隔 char *From = "C:\\*.txt\0" "C:\\*.log\0" "C:\\*.tmp\0"; 5:當複製或者移動文件的時候,在fFlags參數中包含FOF_RENAMEONCOLLISION將阻止函數改寫現存的文件,shell將建立名字叫做“復件 原文件名”的複製品(資源管理器就是這樣做的). 6:你能也指定FO_RENAME作為wFunc參數.fFlags參數能包含很多其它高級方式,更多信息請參閱WIN32.HLP文件 --==多看.多學.多聽==--
------
--==多看.多學.多聽==--
00156
高階會員


發表:45
回覆:195
積分:112
註冊:2002-06-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-31 17:30:27 IP:61.56.xxx.xxx 未訂閱
掃描檔案夾的遞迴程序如下:(FindFirst及FindNext用法請參考HELP範例)
procedure getfiles(basedir:TFilename;var filelist:TStrings; var size:integer);
var sr:TSearchRec;
begin
  if FindFirst(basedir '*.*',faAnyFile,sr)=0 then
    begin
      repeat
        if sr.Attr and faDirectory <> 0 then
          begin
            if ((sr.Name<>'.') and (sr.Name<>'..')) then getfiles(basedir sr.Name '\',filelist,size);
          end
        else
          begin
            filelist.Add(basedir sr.Name);
            Inc(size,sr.Size);
          end;
      until FindNext(sr)<>0;
      FindClose(sr);
    end;
end;
使用試驗:
procedure TForm1.Button1Click(Sender: TObject);
var flst:TStrings;
    size:integer;
begin
  size:=0;
  flst:=TStringList.Create;
  try
    getfiles('D:\temp\',flst,size);
    Memo1.Lines.Text:=flst.Text;
    ShowMessage('總共需複製 ' size ' Bytes');
  finally
    flst.Free;
  end;
end;
至於複製部份,請你參考HELP裡BlockRead、BlockWrite的範例碼,可以在repeat...until迴圈裡每次偵測時間,根據已經複製的檔案大小與時間來推算剩餘時間。你試試看吧!
系統時間:2024-05-22 1:18:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!