2016-04-21 72 views
0

在W7 x64中使用德爾福西雅圖。當使用自定義VCL風格並且選擇大量文件(如2-3k +)時,文件名會被損壞。沒有自定義樣式,這不會發生。德爾福:TOpenDialog + VCL樣式文件大量損壞文件

program Project1; 

uses 
    Vcl.Forms, 
    Unit1 in 'Unit1.pas' {Form1}, 
    Vcl.Themes, 
    Vcl.Styles; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    TStyleManager.TrySetStyle('Onyx Blue'); 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
end. 


procedure TForm1.FormCreate(Sender: TObject); 
Var s: string; 
    ts: TStringList; 
begin 
    if OpenDialog1.Execute then begin 
    ts := TStringList.Create; 
    for s in OpenDialog1.Files do 
    ts.Add(s); 
    end else Exit; 
    ts.SaveToFile('z:\files.txt'); 
    ts.Free; 
end; 

object OpenDialog1: TOpenDialog 
    Filter = 'Pictures (jpg,png,bmp,gif)|*.jpg;*.png;*.bmp;*.gif|All Files|*.*' 
    Options = [ofReadOnly, ofAllowMultiSelect, ofEnableSizing, ofForceShowHidden] 
    Title = 'Select files to upload' 
    Left = 201 
    Top = 64 
end 

我的結束,在只有769文件驗證碼結果寫入日誌出來〜5000,以及它們的初始路徑「Z:」它和其它字符損壞「?」

有什麼辦法解決這個問題?

注:新TFileOpenDialog似乎不存在此問題,但它確實帶來其他如下所示:(除了是Vista的+)

enter image description here
enter image description here

+0

如果你不使用自定義VCL風格 - 它會不同? –

+0

工作正常,沒有自定義樣式。 – hikari

+0

我的賭注是沒有自定義風格的對話框進入標準的Windows Vista + API調用路徑,並像'TFileOpenDialog'設法做到這一點。但是對於非標準的VCL風格,它必須覆蓋默認的Windows風格,並且會降低到Vista之前的有限模式。嘗試安裝Windows 2000/XP,並嘗試沒有樣式的程序。有機會,它只能用於Vista +無論如何,所以你將沒有理由避免使用TFileOpenDialog' –

回答

3

因爲緩衝區的大小傳遞給Classic Open Dialog Box您正在試驗這種行爲爲了檢索選定文件的結果,緩衝區由作爲OPENFILENAME結構的一部分的lpstrFile元素表示。當啓用多選選項時,VCL在內部將此緩衝區的大小設置爲High(Word) - 16(65519)字節,並在啓用單個文件選擇時將緩衝區大小設置爲MAX_PATH

這是VCL代碼(Vcl.Dialogs),其顯示該

function TOpenDialog.DoExecute(Func: Pointer; ParentWnd: HWND): Bool; 
const 
    MultiSelectBufferSize = High(Word) - 16; 
... 
... 
    if ofAllowMultiSelect in FOptions then 
     nMaxFile := MultiSelectBufferSize else 
     nMaxFile := MAX_PATH; 
    SetLength(TempFilename, nMaxFile + 2); 
    lpstrFile := PChar(TempFilename); 
... 
... 

與Windows Vista和引入新的對話框(IFileOpenDialog)的,所選擇的文件是由在該IFileOpenDialog::GetResults方法返回開始的一部分IShellItemArray,所以緩衝區限制不適用。

總之,此行爲不是由VCL樣式引起的。

最後,如果您想使用現代化的自定義樣式對話框,請嘗試VCL Styles Utils項目。

enter image description here

+0

你似乎喜歡風格。你可以成爲虛擬樹視圖的維護者嗎? –

+0

謝謝,您的修補程序適用於新的對話框,否則它們都會混亂。舊問題不是由VCL直接引起的,但它確實發生在問題中的詳細情況,不知何故緩衝區在這種情況下由於某種原因而被耗盡。 – hikari

1

不關於德爾福似乎。 在谷歌只是五秒鐘,我們有這樣的:

「打開文件對話框不能返回超過1000個文件」

http://answers.microsoft.com/en-us/windows/forum/windows_7-files/shameful-limitation-file-open-dialog-cannot-return/bfff43fc-0da5-48d6-8703-dc0eac3c7581?auth=1

+0

雖然沒有自定義VCL樣式,但是我可以選擇甚至超過5K。也許它從那個〜6歲的報告開始就已經修復了。 – hikari

+0

你沒有說過你的操作系統。我仍然認爲你應該嘗試在win2000和XP中。否則,你應該切換到vista +對話框 –

+0

雖然Vista +帶有VCL樣式的對話框會被搞亂,請檢查屏幕截圖。 – hikari