Recent

Author Topic: Три вопроса новичка: OnPaint, ImageList и логика программы  (Read 454 times)

majolika

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

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

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

Code: Pascal  [Select][+][-]
  1. ImageList1.Resolution[24].Draw(Bevel1.Canvas,  x, y, 0, True);
Code: Pascal  [Select][+][-]
  1. 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  [Select][+][-]
  1. unit test_unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;
  9.  
  10. type
  11.  
  12.   { TForm1 }
  13.  
  14.   TForm1 = class(TForm)
  15.     Bevel1: TBevel;
  16.     Button1: TButton;
  17.     ImageList1: TImageList;
  18.     procedure Bevel1MouseUp(Sender: TObject; Button: TMouseButton;
  19.       Shift: TShiftState; X, Y: Integer);
  20.     procedure Bevel1Paint(Sender: TObject);
  21.     procedure Button1Click(Sender: TObject);
  22.   private
  23.  
  24.   public
  25.  
  26.   end;
  27.  
  28. var
  29.   Form1: TForm1;
  30.   BoxSize: Integer = 24;
  31.   FieldRow: integer = 10;
  32.   FieldCol: integer = 10;
  33.   Button1Clicked: Boolean = False;
  34.   DrawABomb: Boolean = False;
  35.   CoordX, CoordY: Integer;
  36.  
  37. implementation
  38.  
  39. {$R *.lfm}
  40.  
  41. { TForm1 }
  42.  
  43. procedure TForm1.Button1Click(Sender: TObject);
  44. begin
  45.   Button1Clicked := True;
  46.   Bevel1.Width := FieldCol * BoxSize;
  47.   Bevel1.Height := FieldRow * BoxSize;
  48.   Bevel1.Show;
  49. end;
  50.  
  51. procedure TForm1.Bevel1Paint(Sender: TObject);
  52. var
  53.   x, y: Integer;
  54. begin
  55.   if Button1Clicked then begin
  56.      for x := 0 to FieldCol - 1 do begin
  57.          for y := 0 to FieldRow - 1 do begin
  58.              ImageList1.Resolution[24].Draw(Bevel1.Canvas,
  59.              (x * BoxSize), (y * BoxSize), 0, True);
  60.          end;
  61.      end;
  62.      Button1Clicked := False;
  63.   end;
  64.   if DrawABomb then begin
  65.      ImageList1.Resolution[24].Draw(Bevel1.Canvas, CoordX, CoordY, 1, True);
  66.      DrawABomb := False;
  67.   end;
  68. end;
  69.  
  70. procedure TForm1.Bevel1MouseUp(Sender: TObject; Button: TMouseButton;
  71.           Shift: TShiftState; X, Y: Integer);
  72. begin
  73.   if Button = mbLeft then begin
  74.      DrawABomb := True;
  75.      CoordX := X; CoordY := Y;
  76.      Bevel1.Repaint;
  77.   end;
  78. end;
  79.  
  80. end.
  81.  
Lazarus 3.8 (rev lazarus_3_8) FPC 3.2.2 x86_64-win64-win32/win64

 

TinyPortal © 2005-2018