Forum > Russian

Три вопроса новичка: OnPaint, ImageList и логика программы

(1/1)

majolika:
Привет!
Имеется три новичковых вопроса о рисовании на контроле. Ради самообразования я пишу «сапёра».

Вопрос 1: OnPaint
Когда я нажимаю кнопку «старт», то показываю минное поле и заполняю его квадратами. Затем, когда я кликаю на минном поле и рисую мину. Но минное поле полностью перерисовывается, все квадраты — как ветром сдувает, и поверх рисуется мина, которая тоже исчезает при следующем клике.
Почему?

Вопрос 2: ImageList
ImageList — удобный контрол, но я обнаружил одну странную вещь: когда ярисую одну и ту же картинку при помощи ImageList и при помощи Canvas.Draw, это даёт разные результаты.
Почему?


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---ImageList1.Resolution[24].Draw(Bevel1.Canvas,  x, y, 0, True);
--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---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 код:


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---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. 

Navigation

[0] Message Index

Go to full version