Привет!
Имеется три новичковых вопроса о рисовании на контроле. Ради самообразования я пишу «сапёра».
Вопрос 1: OnPaint
Когда я нажимаю кнопку «старт», то показываю минное поле и заполняю его квадратами. Затем, когда я кликаю на минном поле и рисую мину. Но минное поле полностью перерисовывается, все квадраты — как ветром сдувает, и поверх рисуется мина, которая тоже исчезает при следующем клике.
Почему?
Вопрос 2: ImageList
ImageList — удобный контрол, но я обнаружил одну странную вещь: когда ярисую одну и ту же картинку при помощи ImageList и при помощи Canvas.Draw, это даёт разные результаты.
Почему?
ImageList1.Resolution[24].Draw(Bevel1.Canvas, x, y, 0, True);
Field.Canvas.Draw(x, y, Picture_Loaded_From_TImage_Placed_On_The_Form);
На приаттаченной картинке показана разница минного поля:
фрагмент слева, более яркое минное поле — ImageList
фрагмент справа, более тёмное минное поле — Canvas.Draw
(просто на форму кидаю невидимый Timage, в Form.OnCreate подгружаю как TBitmap и рисую)
Пятой точкой чую, что собака зарыта в том, что TImage и TImageList как-то по-разному работают с загруженными изображениями, но, блин, где логика?!
«Изображение» и «список изображений» — исходя из названия, одно и то же, только в первом случае — в единственном экземпляре, во втором — в ассортименте, так сказать.
Вопрос 3: логика программы
Первый клик на кнопке «старт» работает отлично, а последующие — никак не работают.
Почему?
Ниже минимальный proof-of-concept код:
unit test_unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Bevel1: TBevel;
Button1: TButton;
ImageList1: TImageList;
procedure Bevel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Bevel1Paint(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
BoxSize: Integer = 24;
FieldRow: integer = 10;
FieldCol: integer = 10;
Button1Clicked: Boolean = False;
DrawABomb: Boolean = False;
CoordX, CoordY: Integer;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1Clicked := True;
Bevel1.Width := FieldCol * BoxSize;
Bevel1.Height := FieldRow * BoxSize;
Bevel1.Show;
end;
procedure TForm1.Bevel1Paint(Sender: TObject);
var
x, y: Integer;
begin
if Button1Clicked then begin
for x := 0 to FieldCol - 1 do begin
for y := 0 to FieldRow - 1 do begin
ImageList1.Resolution[24].Draw(Bevel1.Canvas,
(x * BoxSize), (y * BoxSize), 0, True);
end;
end;
Button1Clicked := False;
end;
if DrawABomb then begin
ImageList1.Resolution[24].Draw(Bevel1.Canvas, CoordX, CoordY, 1, True);
DrawABomb := False;
end;
end;
procedure TForm1.Bevel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then begin
DrawABomb := True;
CoordX := X; CoordY := Y;
Bevel1.Repaint;
end;
end;
end.