Как изменить изображение delphi 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;

person Abl    schedule 26.01.2014    source источник
comment
Пожалуйста, добавьте больше деталей к вашему вопросу (реальный источник, реальные сообщения об ошибках, ...)   -  person Sir Rufo    schedule 26.01.2014
comment
Пожалуйста, сделайте лучше, чем это не работает. В каком смысле? Никогда не говорите, что это не работает.   -  person David Heffernan    schedule 26.01.2014
comment
Дэвид, извините, я не хотел менять фоновое изображение во время выполнения.   -  person Abl    schedule 26.01.2014


Ответы (1)


Известно, что 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.
person David Heffernan    schedule 26.01.2014
comment
Спасибо, Дэвид, проблема не в размере файла или попытке/за исключением, я запускаю программу шаг за шагом, и все строки выполняются без проблем, но изображение не меняется. - person Abl; 26.01.2014
comment
В этом случае изображение в указанном вами файле является неправильным. Нам нужно начать с того, что LoadFromFile работает. - person David Heffernan; 26.01.2014
comment
Вы все еще застряли на этом. Наверняка нет других возможностей, кроме трех, которые я здесь перечисляю. - person David Heffernan; 26.01.2014
comment
Дэвид, к сожалению, я застрял! :(, я удалил Img_Bk.Picture := nil; и это не сработало. - person Abl; 26.01.2014
comment
Вы снова говорите, что это не сработало. Вздох. Вы уже удалили try/except, верно? - person David Heffernan; 26.01.2014
comment
Дэвид, извини. удаляю все и только Img_Bk.Picture.LoadFromFile( SaveFileName ); левый . Во время выполнения, когда я выбираю новую картинку, фоновое изображение не меняется! Дэвид хотел бы выразить вам глубокую благодарность. - person Abl; 26.01.2014
comment
Здесь работает нормально. Что мы можем сделать, если мы не можем размножаться? Теперь, если вы сделали SSCCE, было бы легко быть более конкретным. - person David Heffernan; 26.01.2014
comment
Привет Дэвид, ты прав. Я понял причину использования Mdiform, изображение не может изменить изображение во время выполнения. если я использую нормальную форму, она работает правильно. - person Abl; 27.01.2014
comment
Дэвид, это не работает для формы Мди, поверь в это. Я изменил стиль формы на fsnormal, и изображение Timage изменилось. Затем я перешел на fsMdiform (единственное изменение формы без каких-либо других изменений!) Это не изменилось! :( - person Abl; 27.01.2014
comment
Вы хотите рисовать на форме MDI? См. мой второй ответ здесь: stackoverflow .com/questions/15132326/ - person David Heffernan; 27.01.2014
comment
Нет, я хотел бы изменить фоновое изображение приложения во время выполнения в моей компании пользователями, основная форма которых является формой mdi. - person Abl; 27.01.2014
comment
Что вы подразумеваете под фоном приложения? Можете ли вы разместить изображение на сайте обмена изображениями? - person David Heffernan; 27.01.2014
comment
Кроме того, я уверен, что успешно ответил на вопрос, который вы задали. - person David Heffernan; 27.01.2014
comment
Спасибо, Дэвид, за внимание. К сожалению мою проблему не решил. Я знаю, ты пытаешься мне помочь. большое спасибо - person Abl; 27.01.2014
comment
Я не утверждаю, что решил вашу проблему. Я утверждаю, что ответил на ваш вопрос. Они два совсем разные. Не в последнюю очередь потому, что ваша реальная проблема, по-видимому, связана с MDI, которого нет в заданном вами вопросе. Посмотрите еще раз на вопрос, который вы задали. - person David Heffernan; 27.01.2014
comment
Да, я знаю, потому что сначала я не знал, что проблема связана со стилем формы - person Abl; 27.01.2014
comment
Это на вас. Я ответил на вопрос, который вы задали. Во всяком случае, вы не ответили на мои вопросы. Что вы подразумеваете под фоном приложения? Можете ли вы разместить изображение на сайте обмена изображениями? - person David Heffernan; 27.01.2014
comment
Я хотел бы помочь вам, но вы делаете это очень трудно. Ваше последнее редактирование раздражает. - person David Heffernan; 27.01.2014
comment
Это ужасно похоже на то, что вы хотите, чтобы контейнер дочерних элементов MDI имел это фоновое изображение. В этом случае ссылка, которую я дал вам час назад, - это то, что вам нужно. Вы не можете сделать это правильно с элементом управления TImage. - person David Heffernan; 27.01.2014