在W7 x64中使用Delphi Seattle。使用自定义VCL样式并选择大量文件(如2-3k +)时,文件名已损坏。没有自定义样式,这不会发生。
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 +)
答案 0 :(得分:3)
您正在尝试此行为,因为缓冲区的大小传递给Classic Open Dialog Box以检索所选文件的结果,缓冲区由lpstrFile
元素表示,该元素是OPENFILENAME
结构。启用多选选项时,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项目。
答案 1 :(得分:1)
这似乎与Delphi无关。 谷歌只需五秒钟就可以了:
“文件打开对话框不能返回超过1000个文件”