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

Я создал производную TSkinPanel из TcustomControl

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

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

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

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;

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

Другие вопросы по тегам