Delphi 更改“单击时显示图片”事件时出错

Delphi 更改“单击时显示图片”事件时出错,delphi,delphi-2010,timage,Delphi,Delphi 2010,Timage,我有以下基本代码: procedure TForm4.shrek1Click(Sender: TObject); begin shrek1.Picture.LoadFromFile('donkey.jpeg'); end; 其中,shrek1是一个TImage,而ad驴.jpeg是我希望在单击时加载的图像shrek1 ad驴.jpeg位于几乎所有其他相关项目文件的同一目录中,但是当我尝试运行代码时,我得到一个错误: 异常类EFOpenError,消息为“无法打开文件”\(出于隐私考虑已删除

我有以下基本代码:

procedure TForm4.shrek1Click(Sender: TObject);
begin
  shrek1.Picture.LoadFromFile('donkey.jpeg');
end;
其中,
shrek1
是一个
TImage
,而
ad驴.jpeg
是我希望在单击时加载的图像
shrek1

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

异常类EFOpenError,消息为“无法打开文件”\(出于隐私考虑已删除目录)\aduck.jpeg”。系统找不到指定的文件


我做错了什么?

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

如果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));
var
AppPath:string;
程序TForm4.单击(发送方:TObject);
变量
文件名:字符串;
开始

文件名:=AppPath+'aduck.jpeg';// 始终使用绝对路径。相对路径是相对于调用进程的当前工作目录的,该目录可以(并且通常确实)在进程的生命周期内更改值,并且并不总是您所期望的

如果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));
var
AppPath:string;
程序TForm4.单击(发送方:TObject);
变量
文件名:字符串;
开始

文件名:=AppPath+'aduck.jpeg';//不要依赖相对路径。走完全程。检查你是否正确。如果系统告诉您该文件不存在,请信任它。如果您不提供绝对路径,可执行文件将在与可执行文件相同的路径中查找图像。您可能希望检查该文件是否存在于Win32\Debug(或Win32\Release,具体取决于您的构建)文件夹中,因为可执行文件将驻留在该文件夹中。要验证这一点,请尝试将驴.jpeg文件复制到调试/发布文件夹。@Rohit:“如果不提供绝对路径,可执行文件将在与可执行文件相同的路径中查找图像”-仅当调用进程的当前工作目录是可执行文件路径时。这不是保证。这是真的,@RemyLebeau-我假设TForm4只是应用程序中的另一个表单。无论如何,最好使用绝对路径。。。不要依赖相对路径。走完全程。检查你是否正确。如果系统告诉您该文件不存在,请信任它。如果您不提供绝对路径,可执行文件将在与可执行文件相同的路径中查找图像。您可能希望检查该文件是否存在于Win32\Debug(或Win32\Release,具体取决于您的构建)文件夹中,因为可执行文件将驻留在该文件夹中。要验证这一点,请尝试将驴.jpeg文件复制到调试/发布文件夹。@Rohit:“如果不提供绝对路径,可执行文件将在与可执行文件相同的路径中查找图像”-仅当调用进程的当前工作目录是可执行文件路径时。这不是保证。这是真的,@RemyLebeau-我假设TForm4只是应用程序中的另一个表单。无论如何,最好使用绝对路径。。。不幸的是,这仍然不起作用,错误消息清楚地显示程序正在查找正确的地址,并且文件确实存在,但它仍然“找不到指定的文件”,是否可能不支持JPEG文件或其他内容?@TheMagicalMuffinMan:JPGs受支持(如果在
uses
子句中有
jpeg
单元,则会出现不同的错误)。操作系统没有撒谎。如果它说文件不存在,它就真的不存在。很明显,您没有从正确的路径加载文件。您的问题中显示的错误消息中的路径以“\”开头,它真的是以“\”开头的,还是您在编辑错误消息时手动执行的?@TheMagicalMuffinMan:请不要模糊e类似这样的错误消息,会将焦点从实际问题上移开。在任何情况下,
SysUtils.FileExist()
在调用
LoadFromFile()之前是否返回false
?是的,是的,如果我很难理解,也很抱歉这仍然不起作用,错误消息清楚地显示程序正在查找正确的地址,文件确实存在,但它仍然“找不到指定的文件”,是否可能不支持JPEG文件或其他内容?@TheMagicalMuffinMan:JPGs受支持(如果您在
uses
子句中有
JPEG
单元,否则您将收到不同的错误)。操作系统没有撒谎。如果它说文件不存在,它就真的不存在。很明显,您没有从正确的路径加载文件。您的问题中显示的错误消息中的路径以“\”开头,它真的是以“\”开头的,还是您在编辑错误消息时手动执行的?@TheMagicalMuffinMan:请不要模糊e类似这样的错误消息,会使人们失去对真实问题的关注。在任何情况下,
SysUtils.FileExist()
在调用
LoadFromFile()
之前是否返回false?是的,如果我很难理解,也很抱歉