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

При рисовании по событию OnResize программа зависает. Эту проблему решает процедура Sleep. Можете ещё что-нибудь порекомендовать или использование процедуры Sleep то что надо?
Код:
unit Unit1;

// Form1.Anchors = [akLeft,akTop,akRight,akBottom]
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Unit2;
 
type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    procedure FormCreate(Sender: TObject);
    procedure FormResize(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.FormResize(Sender: TObject);
begin
  Thread1.Suspended := False; // запускаем итерацию рисования
  Sleep(10)
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.Canvas.Lock; // блокируем холст от других потоков

  repeat
    Bitmap1.SetSize(Form1.PaintBox1.Width, Form1.PaintBox1.Height); // определяем размер изображения (создаём его)
    Form1.PaintBox1Paint(Nil); // передаём изображение в PaintBox1
    Thread1.Suspended := True // приостанавливаем поток
  until Thread1.Terminated
end;

initialization

Bitmap1 := TBitmap.Create

finalization

Bitmap1.Canvas.Unlock; // разблокируем холст
Bitmap1.Free

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