Delphi:TOpenDialog + VCL样式会破坏包含大量文件的文件名

时间:2016-04-21 12:25:49

标签: delphi vcl-styles

在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 +)

enter image description here
enter image description here

2 个答案:

答案 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项目。

enter image description here

答案 1 :(得分:1)

这似乎与Delphi无关。 谷歌只需五秒钟就可以了:

“文件打开对话框不能返回超过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