Drawgrid

Тема в разделе "Delphi - Базы данных", создана пользователем Voaderizzz, 27 ноя 2012.

  1. Voaderizzz

    Voaderizzz New Member

    Регистрация:
    27 ноя 2012
    Сообщения:
    2
    Симпатии:
    0
    Я в DrawGrid1 и DrawGrid2 сделал так чтобы ячейки закрашивались случайным образом. Как сделать так чтобы при нажатии на ячейку в DrawGrid1 она исчезла , но при этом эта ячейка совпадала с цветом ячейки в DrawGrid2
     
  2. sinkopa

    sinkopa Well-Known Member

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

Поделиться этой страницей