как использовать Picture.LoadFromFile () в TcustomContol - PullRequest
0 голосов
/ 23 сентября 2010

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

имеет FGraphic: TPicture.

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

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

Ответы [ 2 ]

2 голосов
/ 24 сентября 2010

Вы должны использовать событие 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;
2 голосов
/ 23 сентября 2010

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

...