在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 +)
您正在尝试此行为,因为传递给“经典打开”对话框以检索所选文件结果的缓冲区的大小,该缓冲区由结构中的lpstrFile
元素表示OPENFILENAME
。High(Word) - 16
启用多选选项时,VCL在内部将此缓冲区的大小设置为(65519)字节,而启用MAX_PATH
单文件选择时,VCL在内部将缓冲区的大小设置为(65519)字节。
这是显示此内容的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样式实用程序项目。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句