Показать сообщение отдельно
  #1  
Старый 15.03.2015, 19:22
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
Вопрос Вызов события OnPaint из другого потока

Скажите пожалуйста, как правильно вызвать событие TForm1.PaintBox1Paint из TThread.Execute?
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Unit2, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    procedure FormCreate(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Thread1 := TThread1.Create;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  BitBlt(Form1.PaintBox1.Canvas.Handle, 0, 0, Bitmap1.Width, Bitmap1.Height, Bitmap1.Canvas.Handle, 0, 0, SrcCopy); // копируем изображение из Bitmap1 в PaintBox1
end;

end.
Код:
unit Unit2;

interface

uses
  System.Classes, Vcl.Graphics;

type
  TThread1 = class(TThread)
  protected
    procedure Execute; override;
  end;

var
  Thread1: TThread1;
  Bitmap1: TBitmap;

implementation

uses
  Unit1;

procedure TThread1.Execute;
begin
  Bitmap1 := TBitmap.Create;
  Bitmap1.SetSize(Form1.PaintBox1.Width, Form1.PaintBox1.Height); // определяем размер изображения (создаём его)
  Synchronize(procedure
  begin
    Form1.PaintBox1Paint(Nil);
  end);
end;

end.
Ответить с цитированием