Drawgrid

Voaderizzz

New Member
27.11.2012
2
0
#1
Я в DrawGrid1 и DrawGrid2 сделал так чтобы ячейки закрашивались случайным образом. Как сделать так чтобы при нажатии на ячейку в DrawGrid1 она исчезла , но при этом эта ячейка совпадала с цветом ячейки в DrawGrid2
 

sinkopa

Well-Known Member
17.06.2009
344
9
#2
Я в DrawGrid1 и DrawGrid2 сделал так чтобы ячейки закрашивались случайным образом. Как сделать так чтобы при нажатии на ячейку в DrawGrid1 она исчезла , но при этом эта ячейка совпадала с цветом ячейки в DrawGrid2
Ну... блин... Копперфильд отдыхает... :D
В следующий раз когда Си-шники начнут мне говорить про крутизну visual studio, обязательно им рассажу что в Delphi зато ячейки в гридах умеют исчезать... :D
Ну ладно... Чем мы собственно тупее Копперфильда...
Настраиваемся на экстрасенсорную волну... приступаем к парсингу вопроса:
(1) DrawGrid1 и DrawGrid2...
Так. Значит на форме два DrawGrid-а. Причем количество ячеек скорее всего одинаковое.
(2) сделал так чтобы ячейки закрашивались случайным образом...
Хм... Тут возможно два варианта... либо Все (каждая случайным цветом), либо Случайные ячейки одним цветом...
Возможен еще вариант что случайные ячейки - случайным цветом... но это уже (как интуиция подсказывает) перебор...
Поэтому примем за истину второй вариант (Случайные ячейки - синие, остальные белые) и продолжим "интуичить"... :)
(3) ячейки закрашивались...
Тут стоит подумать... Обычно в TDrawGrid ячейки "красятся" на событии OnDrawCell... Значит где-то (мезжду строк) прячются два двухмерных массива размером с количеством ячеек в гридах, откуда брались цвета... вроде пока логично... :)
(4) чтобы при нажатии на ячейку...
Ну тут вроде бы все просто... Клик отлавливаем на событии OnMouseUp, потому как там легко можно узнать координаты мыши...
(5) Теперь собственно Копперфильдовский трюк : чтобы при нажатии на ячейку в DrawGrid1 она исчезла...
Хм... Нет, все таки тягаться с великим фокусником не будем... перефразируем так: чтобы при нажатии на ячейку в DrawGrid1 она поменяла цвет на белый (основной цвет грида)...
Ну и теперь самое сложное (для моего разумения):
(6) она исчезла , но при этом эта ячейка совпадала с цветом ячейки в DrawGrid2...
В экстрасенсорном астрале сегодня сильные помехи... по этому рождаем следующее условие:
ячейка DrawGrid1 должна "исчезнуть" ЕСЛИ: ячейки DrawGrid1 и DrawGrid2 (С ТЕМИ ЖЕ КООРДИНАТАМИ) имеют одинаковый цвет ...
Уфф... вроде все... разобрались...
Отключаемся от астрала, приступаем к написанию кода программы...
Код:
unit uMainForm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;

type
TMainForm = class(TForm)
DrawGrid1: TDrawGrid;
DrawGrid2: TDrawGrid;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure DrawGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure Button1Click(Sender: TObject);
procedure DrawGridMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
procedure RepaintCells;
end;

var
MainForm: TMainForm;
Colors1,Colors2: array of array of TColor;

implementation

{$R *.dfm}

procedure TMainForm.RepaintCells;
var
cols,rows: Integer;
i,j: Integer;
begin
Randomize;

cols := DrawGrid1.ColCount;
rows := DrawGrid1.RowCount;
SetLength(Colors1,cols,rows);

for i := 0 to cols-1 do
begin
for j := 0 to rows-1 do
begin
if ((Random(100) mod 2) = 0) then
Colors1[i,j] := clNavy
else
Colors1[i,j] := clWindow;
end;
end;

cols := DrawGrid2.ColCount;
rows := DrawGrid2.RowCount;
SetLength(Colors2,cols,rows);

for i := 0 to cols-1 do
begin
for j := 0 to rows-1 do
begin
if ((Random(100) mod 2) = 0) then
Colors2[i,j] := clNavy
else
Colors2[i,j] := clWindow;
end;
end;
end;


procedure TMainForm.FormCreate(Sender: TObject);
begin
RepaintCells;
end;

procedure TMainForm.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
TDrawGrid(Sender).Canvas.Brush.Color := Colors1[ACol, ARow];
TDrawGrid(Sender).Canvas.FillRect(Rect);
end;

procedure TMainForm.DrawGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
TDrawGrid(Sender).Canvas.Brush.Color := Colors2[ACol, ARow];
TDrawGrid(Sender).Canvas.FillRect(Rect);
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
RepaintCells;
DrawGrid1.Repaint;
DrawGrid2.Repaint;
end;

procedure TMainForm.DrawGridMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
col,row: Integer;
begin
TDrawGrid(Sender).MouseToCell(X,Y,col,row);
if (col < 0) or (row < 0) then
Exit;
if (clWindow <> Colors1[col,row]) and (Colors1[col,row] = Colors2[col,row]) then
begin
Colors1[col,row] := clWindow;
DrawGrid1.Repaint;
end;
end;

end.
Вот проект:
Посмотреть вложение DrawGridsTest.rar
Привет Копперфильду... :)