【问题标题】:Error when changing TImage picture on click event在点击事件上更改 TImage 图片时出错
【发布时间】:2017-03-10 00:42:54
【问题描述】:

我有以下基本代码:

procedure TForm4.shrek1Click(Sender: TObject);
begin
  shrek1.Picture.LoadFromFile('donkey.jpeg');
end;

其中shrek1TImagedonkey.jpeg 是我希望shrek1 在单击时加载的图像。

donkey.jpeg 位于几乎所有其他相关项目文件的同一目录中,但是当我尝试运行代码时出现错误:

异常类 EFOpenError 带有消息“无法打开文件“\(为隐私而删除目录)\donkey.jpeg”。系统找不到指定的文件

我做错了什么?

【问题讨论】:

  • 不要依赖相对路径。通过完整路径。并检查你是否做对了。如果系统告诉您该文件不存在,请相信它。
  • 如果您不提供绝对路径,可执行文件将在与可执行文件相同的路径中查找图像。您可能需要检查该文件是否存在于 Win32\Debug(或 Win32\Release,具体取决于您的构建)文件夹中,因为这是您的可执行文件所在的位置。要验证这一点,请尝试将 donkey.jpeg 文件复制到您的 Debug/Release 文件夹。
  • @Rohit: "如果您不提供绝对路径,可执行文件将在与可执行文件相同的路径中查找图像" - 仅当 调用进程的当前工作目录是可执行路径。这不能保证。
  • 没错,@RemyLebeau - 我假设 TForm4 只是应用程序中的另一种形式。无论如何,最好使用绝对路径... ????

标签: delphi delphi-2010 timage


【解决方案1】:

始终使用绝对路径。相对路径是相对于调用进程的当前工作目录的,它可以(并且通常会)在进程的生命周期内改变值,并且并不总是你所期望的。

如果 JPG 文件与您的 EXE 位于同一文件夹中,您可以改为:

var
  AppPath: string;

procedure TForm4.shrek1Click(Sender: TObject);
var
  FileName: string;
begin
  FileName := AppPath+'donkey.jpeg'; // <-- make sure this path is accurate!
  shrek1.Picture.LoadFromFile(FileName);
end;

initialization
  AppPath := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));

【讨论】:

  • 不幸的是这仍然不起作用,错误消息清楚地表明程序正在寻找正确的地址并且文件确实存在但它仍然“找不到指定的文件”,是否有可能不支持JPEG文件还是什么?
  • @TheMagicalMuffinMan:支持 JPG(前提是您的 uses 子句中有 jpeg 单位,否则您会收到不同的错误)。操作系统不会说谎。如果它说该文件不存在,则它确实不存在。您显然没有从正确的路径加载文件。您的问题中显示的错误消息中的路径以 `\` 开头,是真的以该开头还是您在编辑错误消息时手动执行了该操作?
  • @TheMagicalMuffinMan:请不要隐藏这样的错误消息,它会分散对真正问题的关注。无论如何,SysUtils.FileExist() 在调用 LoadFromFile() 之前是否返回 false?
  • 是的,如果我难以理解,也很抱歉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
相关资源
最近更新 更多