как использовать Picture.LoadFromFile() в TcustomContol

Я создал TSkinPanel, производный от TcustomControl.

у него есть FGraphic: TPicture.

FGraphic рисуется на холсте TSkinPanel и отлично работает, если вы загружаете изображение из инспектора TObject.

но я не буду работать с загрузкой изображения во время выполнения "Form1.SkinPanel1.Picture.LoadFromFile('skin.bmp');


person XBasic3000    schedule 23.09.2010    source источник
comment
Как это не работает? Это дает вам сообщение об ошибке или просто игнорирует недавно загруженное изображение, работая со старым (тот, который загружен во время разработки). Вы назначили обработчик событий для Picture.OnChange?   -  person Cosmin Prund    schedule 23.09.2010
comment
нет ошибки, мне нужно поместить Picture.OnChange на мою TSkinPanel, а затем перекрасить ее?   -  person XBasic3000    schedule 23.09.2010
comment
Возможно, вам следует отредактировать свой вопрос, чтобы он был более конкретным насчет того, что я не буду (это не работает). Что значит не работает?   -  person Ken White    schedule 23.09.2010


Ответы (2)


Вы должны использовать событие TPicture.OnChange, например:

type
  TSkinPanel = class(TCustomControl)
  private
    FPicture: TPicture;
    procedure PictureChanged(Sender: TObject);
    procedure SetPicture(Value: TPicture);
  protected
    procedure Paint; override;
  public
    constructor Create(Owner: TComponent); override;
    destructor Destroy; override;
  published
    property Picture: TPicture read FPicture write SetPicture;
  end;

  constructor TSkinPanel.Create(Owner: TComponent);
  begin
    inherited;
    FPicture := TPicture.Create;
    FPicture.OnChange := PictureChanged;
  end;

  destructor TSkinPanel.Destroy;
  begin
    FPicture.Free;
    inherited;
  end;

  procedure TSkinPanel.PictureChanged(Sender: TObject);
  begin
    Invalidate;
  end;

  procedure TSkinPanel.SetPicture(Value: TPicture);
  begin
    FPicture.Assign(Value);
  end;

  procedure TSkinPanel.Paint;
  begin
    if (FPicture.Graphic <> nil) and (not FPicture.Graphic.Empty) then
    begin
      // use FPicture as needed...
    end;
  end;
person Remy Lebeau    schedule 24.09.2010

Если вы не получаете ошибки при вызове Picture.LoadFromFile, то, скорее всего, он сработал, но ваш элемент управления просто не реагирует на изменение. Первое, что нужно сделать, это обработать обработчик события Picture.OnChange и сделать что-нибудь: если вы рисуете сами, просто вызовите Invalidate(), если вы используете Picture для настройки какого-то другого элемента управления, который, в свою очередь, выполняет рисование, сделайте соответствующий Assign() fom По изменению.

person Cosmin Prund    schedule 23.09.2010
comment
Я смог поймать Событие, как ты и сказал. но когда я делаю FGraphic.Assign(Picture); я получил ошибку переполнения стека - person XBasic3000; 23.09.2010
comment
то, что я сделал, похоже на SkinPanel1.Picture.LoadFromFile('skin.bmp'); SkinPanel1.Применить; это так УЖАСНО - person XBasic3000; 23.09.2010
comment
Если вы столкнулись с ошибкой переполнения стека, вы попали по адресу :-) - person Svein Bringsli; 23.09.2010
comment
Что такое FGraphic? Ваше переполнение стека вызвано функцией, прямо или косвенно вызывающей саму себя: я не знаю, что такое FGraphic, потому что вы не опубликовали никакого кода, но я предполагаю, что это вызывает повторный вызов вашего обработчика OnChange, и это происходит в петле. Мое другое предположение заключается в том, что вы должны вызвать свой метод `Apply` (что бы это ни было) из обработчика OnChange или вызвать `Invalidate; `. Если это все еще не работает, отредактируйте вопрос и добавьте код! Я хотел бы увидеть определение класса и обработчик Paint. - person Cosmin Prund; 23.09.2010