0

我以加载背景图像的形式使用 timage。问题是当我在运行时选择另一张图片并通过 Img_Bk.Picture.LoadFromFile(SaveFileName); 它不起作用(图片没有改变)。我的意思是它显示以前的图片并且在运行时不显示新图片。我想在我公司的运行时由用户更改应用程序背景图像,主要形式是 mdi 形式。我使用德尔福 7 。

    try
        Img_Bk.Picture := nil ;
        if FileSize > 100 then
        begin
            Img_Bk.Picture.LoadFromFile( SaveFileName );
        end;
        Img_Bk.Stretch := True ;
    except
    end;
4

2 回答 2

2

LoadFromFile已知工作。所以必须有一个更平淡的解释。

第一个可能的解释是FileSize不大于 100 并且 if 条件评估为假。

另一种可能的解释是您指定的文件中的图像不是您期望的图像。

否则,您的代码将包含一个所有异常处理程序。因此,当调用LoadFromFile失败并引发异常时,您的代码会忽略它并继续执行,就好像没有发生任何不愉快的事情一样。去掉try/except,处理会暴露的错误。

你要学习的真正教训是永远不要再编写这样的异常处理程序。


这个程序应该向你证明这LoadFromFile很好:

program ImageDemo;

uses
  Types, Math, IOUtils, SHFolder, Forms, Controls, StdCtrls, ExtCtrls, jpeg;

var
  Form: TForm;
  Image: TImage;
  Timer: TTimer;
  ImageIndex: Integer = -1;
  MyPictures: string;
  Images: TStringDynArray;

type
  THelper = class
    class procedure Timer(Sender: TObject);
  end;

class procedure THelper.Timer(Sender: TObject);
begin
  inc(ImageIndex);
  if ImageIndex>high(Images) then
    ImageIndex := 0;
  if ImageIndex>high(Images) then
    exit;
  Image.Picture.LoadFromFile(Images[ImageIndex]);
end;

function GetMyPictures: string;
var
  Str: array[0..260] of Char;
begin
  if SHGetFolderPath(0, CSIDL_MYPICTURES, 0, 0, Str) = S_OK then
    Result := Str;
end;

procedure BuildForm;
begin
  Form.ClientWidth := 700;
  Form.ClientHeight := 500;
  Image := TImage.Create(Form);
  Image.Parent := Form;
  Image.Align := alClient;
  Image.Stretch := True;
  Timer := TTimer.Create(Form);
  Timer.OnTimer := THelper.Timer;
  Timer.Interval := 100;
end;

begin
  MyPictures := GetMyPictures;
  Images := TDirectory.GetFiles(MyPictures, '*.jpg', TSearchOption.soAllDirectories);
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm, Form);
  BuildForm;
  Application.Run;
end.
于 2014-01-26T09:45:51.670 回答
0

我今天遇到了同样的问题。在调用 LoadFromFile() 之后,图像不会改变。我尝试过刷新、重绘、无效和更新 -> 没有任何帮助。然后我发现调整 from 的大小会立即更新图像。最后我发现将属性 Visible 设置为 false 并返回 true 也会更新图像。

FormMain.Image1.Visible := false;
FormMain.Image1.Picture.LoadFromFile(newImageFileName);
FormMain.Image1.Visible := true;

也许不是最好的,但它对我有用。

于 2021-11-11T11:45:52.933 回答