Как использовать 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.