Delphi:TOpenDialog + VCL样式破坏了带有大量文件的文件名

ari

在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元素表示OPENFILENAMEHigh(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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Delphi:TOpenDialog + VCL样式破坏了带有大量文件的文件名

来自分类Dev

使用VCL样式会在TOpenDialog中给出异常/崩溃

来自分类Dev

如何完全按照选择顺序从TOpenDialog获取所选文件?

来自分类Dev

如何完全按照选择顺序从TOpenDialog获取所选文件?

来自分类Dev

在delphi中ftp上传后的随机文件名

来自分类Dev

Makefile:具有非显式输出文件名的隐式规则破坏了规则匹配

来自分类Dev

带有svg样式url(#id)的模板带有文件名填充

来自分类Dev

带有特殊字符的文件名

来自分类Dev

如果TOpenDialog包含问号,为什么会显示重复的文件过滤器掩码?

来自分类Dev

加密破坏了BMP文件,但没有破坏jpeg文件

来自分类Dev

Delphi 7,TFileStream无法打开带有特殊字符的文件

来自分类Dev

Delphi Tools VCL样式设计器

来自分类Dev

文件名中的空格“破坏”文件名脚本

来自分类Dev

在Windows 10中使用Delphi 7 opendialog时文件名中存在垃圾

来自分类Dev

Delphi Copyfile 在长文件名上失败(超过 MAX_PATH)

来自分类Dev

iOS使用带有部分文件名的文件

来自分类Dev

文件名中带有空格的grep文件

来自分类Dev

处理文件名中带有通配符的文件

来自分类Dev

批量创建带有每个文件名的txt文件

来自分类Dev

bash,删除文件名中带有字母的文件

来自分类Dev

处理文件名中带有通配符的文件

来自分类Dev

iOS使用带有部分文件名的文件

来自分类Dev

无法删除带有“?”的文件 在文件名中

来自分类Dev

文件名中带有多个`.`的mv文件

来自分类Dev

带有扩展名的文件名验证

来自分类Dev

Delphi 10 Seattle-具有VCL样式的Vista对话框错误

来自分类Dev

文件名中带有'(撇号)的文件名

来自分类Dev

什么是Delphi DCU文件?

来自分类Dev

Delphi发送JSON +文件

Related 相关文章

  1. 1

    Delphi:TOpenDialog + VCL样式破坏了带有大量文件的文件名

  2. 2

    使用VCL样式会在TOpenDialog中给出异常/崩溃

  3. 3

    如何完全按照选择顺序从TOpenDialog获取所选文件?

  4. 4

    如何完全按照选择顺序从TOpenDialog获取所选文件?

  5. 5

    在delphi中ftp上传后的随机文件名

  6. 6

    Makefile:具有非显式输出文件名的隐式规则破坏了规则匹配

  7. 7

    带有svg样式url(#id)的模板带有文件名填充

  8. 8

    带有特殊字符的文件名

  9. 9

    如果TOpenDialog包含问号,为什么会显示重复的文件过滤器掩码?

  10. 10

    加密破坏了BMP文件,但没有破坏jpeg文件

  11. 11

    Delphi 7,TFileStream无法打开带有特殊字符的文件

  12. 12

    Delphi Tools VCL样式设计器

  13. 13

    文件名中的空格“破坏”文件名脚本

  14. 14

    在Windows 10中使用Delphi 7 opendialog时文件名中存在垃圾

  15. 15

    Delphi Copyfile 在长文件名上失败(超过 MAX_PATH)

  16. 16

    iOS使用带有部分文件名的文件

  17. 17

    文件名中带有空格的grep文件

  18. 18

    处理文件名中带有通配符的文件

  19. 19

    批量创建带有每个文件名的txt文件

  20. 20

    bash,删除文件名中带有字母的文件

  21. 21

    处理文件名中带有通配符的文件

  22. 22

    iOS使用带有部分文件名的文件

  23. 23

    无法删除带有“?”的文件 在文件名中

  24. 24

    文件名中带有多个`.`的mv文件

  25. 25

    带有扩展名的文件名验证

  26. 26

    Delphi 10 Seattle-具有VCL样式的Vista对话框错误

  27. 27

    文件名中带有'(撇号)的文件名

  28. 28

    什么是Delphi DCU文件?

  29. 29

    Delphi发送JSON +文件

热门标签

归档