2016-04-07 2 views
1

Мой обработчик событий выглядит следующим образом:Почему я не могу использовать обработчик события onClick для рисования фигур в форме в lazarus?

procedure TfrmCanvasMethods.btnShapesClick(Sender: TObject); 
begin 
    Canvas.Rectangle(40, 40, 400, 200); 
    Canvas.Rectangle(80, 80, 360, 160); 
    Canvas.Ellipse(150, 50, 290, 190); 
    Canvas.Ellipse(100, 100, 340, 140); 
end;      

Я использую Mac OS X

+3

Рисование поверхности не сохраняется. Нарисуйте в ответ на события рисования –

ответ

4

Вы должны прочитать основы о графических оконных систем. Будь то Windows, MacOS или UNIX X Window.

Практически универсально это не приложение, которое решает, когда, что и где рисовать. Это операционная система, которая решает это и запрашивает приложение, когда это делать. Все приложение может делать - это недействительно некоторая часть его окна - то есть сообщит о том, что какая-то часть окна больше не действительна, а затем подождите, пока ОС захочет, чтобы эта деталь была перекрашена (может быть, это никогда не будет, если окно недействительным было сведено к минимуму или закрыто другим окном), а затем - и только тогда - сделайте чертеж.

Итак, как вы можете это сделать?

Способ 1: ресурсы подкованных и близких к реальным рабочим процессам ОС.

Вы положили TPaintbox по всему вашему form.

Вы держите ваши прямоугольники и круги, как не-видимых записей или классов внутри переменных вашей формы. Когда эти цифры меняются (например, вы добавили еще один прямоугольник, или вы увеличили диаметр круга), вы вызываете MyForm.MyPaintBox.Invalidate, чтобы сообщить операционной системе, что образ этого painboxt более недействителен. Когда ОС посчитает, что своевременно обновить изображение, оно вызовет событие MyForm.MyPaintBox.OnPaint, и в этом случае вы сделаете свои звонки, как MyPaintBox.Canvas.Rectangle(40, 40, 400, 200);. Обратите внимание: вы перекрасили полотно paintbox, а не форму!

procedure TfrmCanvasMethods.btnShapesClick(Sender: TObject); 
begin 
    MyPaintBox.Invalidate(); 
end; 

procedure TfrmCanvasMethods.MyPaintBoxPaint(Sender: TObject); 
var Canvas: TCanvas; 
begin 
    Canvas := MyPaintbox.Canvas; 

    Canvas.Rectangle(40, 40, 400, 200); 
    Canvas.Rectangle(80, 80, 360, 160); 
    Canvas.Ellipse(150, 50, 290, 190); 
    Canvas.Ellipse(100, 100, 340, 140); 
end; 

Метод 2: ленивые и ресурсы-вздутие

Вы кладете TImage над всей вашей form.

Это изображение будет иметь неявный точечный рисунок, имеющий любое изображение, которое вы хотели бы. Более того, он будет отслеживать ваш рисунок этого изображения и автоматически вызывать Invalidate и автоматически обрабатывать запросы перепрограммирования ОС.

procedure TfrmCanvasMethods.btnShapesClick(Sender: TObject); 
var Canvas: TCanvas; 
begin 
    MyImage.Picture.Bitmap.SetSize(MyImage.ClientWidth, MyImage.ClientHeight); 

    Canvas := MyImage.Picture.Bitmap.Canvas; 

    Canvas.Rectangle(40, 40, 400, 200); 
    Canvas.Rectangle(80, 80, 360, 160); 
    Canvas.Ellipse(150, 50, 290, 190); 
    Canvas.Ellipse(100, 100, 340, 140); 
end; 

цена, однако было бы, что бы вы выделить, может быть столько, сколько несколько мегабайт памяти не более чем держать вашу картину для тех сравнительно редких случаях, когда ОС нужно будет обновить изображение вашей формы.

Смежные вопросы