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 条件が false と評価されるというものです。

もう 1 つの考えられる説明は、指定したファイル内のイメージが予期したものではないということです。

それ以外の場合、コードにはすべてを飲み込む例外ハンドラーがあります。そのため、 への呼び出しが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 に答える