Консультация № 182469
11.03.2011, 18:58
49.01 руб.
0 5 1
Здравствуйте уважаемые эксперты! Наведите пожалуйста пример работы с компонентом DrawGrid. Интересует вопрос как заполнять сетку данными, а также работа с свойствами подсвечивания(изменения цвета) отдельных клеток, строк и столбцов. Спасибо большое

Обсуждение

Неизвестный
12.03.2011, 00:19
общий
Среда Delphi7, извиняюсь, забыл указать
давно
Профессионал
153662
1070
12.03.2011, 14:47
общий
Для любого компонента TDrawGridl обязательно создается обработчик OnDrawCel, т. к. без него компонент не сможет заполнить пустые клетки каким-либо изображением или текстом. Например такой:
Код:
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
//Если ячейка получает фокус, то нам надо закрасить её другими цветами
if (gdFocused in State) then
begin
DrawGrid1.Canvas.Brush.Color:= clOlive;
DrawGrid1.Canvas.Font.Color:= clWhite;
end
else //Если же ячейка теряет фокус, то закрашиваем её красным или зелёным или голубым
if ACol = 1 then //третья колонка будет зелёной, другие - ячейки красными и голубыми
DrawGrid1.Canvas.Brush.color := clGreen
else
if ACol = 2 then
DrawGrid1.canvas.brush.Color := clRed
else
if ACol = 3 then
DrawGrid1.canvas.brush.Color := clblue;
//Теперь закрасим ячейки, но только, если ячейка не Title- Row/Column
//Естественно это завит от того, есть у Вас title-Row/Columns или нет.
if (ACol > 0) and (ARow > 0) then
begin
//Закрашиваем бэкграунд
DrawGrid1.Canvas.FillRect(Rect);
DrawGrid1.Font.Color:= clAqua;
//Выводим текст (Text). Также здесь можно добавить выравнивание и т.д..
if (ACol = lCol) and (ARow = lRow) then
begin
DrawGrid1.Canvas.TextOut(Rect.Left, Rect.Top, s);
s:= '';
end;
end;
end;
Здесь колонки раскрашиваются тремя разными цветами и выводится текст в ячейку в которой только что производилось редактирование. Весь тест программы:
Код:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
DrawGrid1: TDrawGrid;
procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure DrawGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: String);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
s: string;
lCol, lRow: integer;

implementation

{$R *.dfm}

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
//Если ячейка получает фокус, то нам надо закрасить её другими цветами
if (gdFocused in State) then
begin
DrawGrid1.Canvas.Brush.Color:= clOlive;
DrawGrid1.Canvas.Font.Color:= clWhite;
end
else //Если же ячейка теряет фокус, то закрашиваем её красным или зелёным или голубым
if ACol = 1 then //третья колонка будет зелёной , другие - ячейки красными и голубыми
DrawGrid1.Canvas.Brush.color := clGreen
else
if ACol = 2 then
DrawGrid1.canvas.brush.Color := clRed
else
if ACol = 3 then
DrawGrid1.canvas.brush.Color := clblue;
//Теперь закрасим ячейки, но только, если ячейка не Title- Row/Column
//Естественно это завит от того, есть у Вас title-Row/Columns или нет.
if (ACol > 0) and (ARow > 0) then
begin
//Закрашиваем бэкграунд
DrawGrid1.Canvas.FillRect(Rect);
DrawGrid1.Font.Color:= clAqua;
//Выводим текст (Text). Также здесь можно добавить выравнивание и т.д..
if (ACol = lCol) and (ARow = lRow) then
begin
DrawGrid1.Canvas.TextOut(Rect.Left, Rect.Top, s);
s:= '';
end;
end;
end;

procedure TForm1.DrawGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: String);
begin
s:= Value;
lCol:= ACol;
lRow:= ARow;
end;

end.
Здесь процедура DrawGrid1SetEditText передаёт переменным текст ячейки и её номер. Свойство DrawGrid1.Options.goEditing нужно выставить в true. Компонент постоянно перерисовывается, поэтому данные нужно хранить например в StringList.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
15.03.2011, 23:18
общий
Вам пример из мини-форума помог?
Неизвестный
16.03.2011, 15:28
общий
Да, пусть оформляют ответом...
давно
Профессионал
153662
1070
16.03.2011, 15:56
общий
это ответ
Здравствуйте, Мироненко Николай Николаевич!
Для любого компонента TDrawGridl обязательно создается обработчик OnDrawCel, т. к. без него компонент не сможет заполнить пустые клетки каким-либо изображением или текстом. Например такой:
Код:
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
//Если ячейка получает фокус, то нам надо закрасить её другими цветами
if (gdFocused in State) then
begin
DrawGrid1.Canvas.Brush.Color:= clOlive;
DrawGrid1.Canvas.Font.Color:= clWhite;
end
else //Если же ячейка теряет фокус, то закрашиваем её красным или зелёным или голубым
if ACol = 1 then //третья колонка будет зелёной, другие - ячейки красными и голубыми
DrawGrid1.Canvas.Brush.color := clGreen
else
if ACol = 2 then
DrawGrid1.canvas.brush.Color := clRed
else
if ACol = 3 then
DrawGrid1.canvas.brush.Color := clblue;
//Теперь закрасим ячейки, но только, если ячейка не Title- Row/Column
//Естественно это завит от того, есть у Вас title-Row/Columns или нет.
if (ACol > 0) and (ARow > 0) then
begin
//Закрашиваем бэкграунд
DrawGrid1.Canvas.FillRect(Rect);
DrawGrid1.Font.Color:= clAqua;
//Выводим текст (Text). Также здесь можно добавить выравнивание и т.д..
if (ACol = lCol) and (ARow = lRow) then
begin
DrawGrid1.Canvas.TextOut(Rect.Left, Rect.Top, s);
s:= '';
end;
end;
end;
Здесь колонки раскрашиваются тремя разными цветами и выводится текст в ячейку в которой только что производилось редактирование. Весь тест программы:
Код:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
DrawGrid1: TDrawGrid;
procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure DrawGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: String);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
s: string;
lCol, lRow: integer;

implementation

{$R *.dfm}

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
//Если ячейка получает фокус, то нам надо закрасить её другими цветами
if (gdFocused in State) then
begin
DrawGrid1.Canvas.Brush.Color:= clOlive;
DrawGrid1.Canvas.Font.Color:= clWhite;
end
else //Если же ячейка теряет фокус, то закрашиваем её красным или зелёным или голубым
if ACol = 1 then //третья колонка будет зелёной , другие - ячейки красными и голубыми
DrawGrid1.Canvas.Brush.color := clGreen
else
if ACol = 2 then
DrawGrid1.canvas.brush.Color := clRed
else
if ACol = 3 then
DrawGrid1.canvas.brush.Color := clblue;
//Теперь закрасим ячейки, но только, если ячейка не Title- Row/Column
//Естественно это завит от того, есть у Вас title-Row/Columns или нет.
if (ACol > 0) and (ARow > 0) then
begin
//Закрашиваем бэкграунд
DrawGrid1.Canvas.FillRect(Rect);
DrawGrid1.Font.Color:= clAqua;
//Выводим текст (Text). Также здесь можно добавить выравнивание и т.д..
if (ACol = lCol) and (ARow = lRow) then
begin
DrawGrid1.Canvas.TextOut(Rect.Left, Rect.Top, s);
s:= '';
end;
end;
end;

procedure TForm1.DrawGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: String);
begin
s:= Value;
lCol:= ACol;
lRow:= ARow;
end;

end.
Здесь процедура DrawGrid1SetEditText передаёт переменным текст ячейки и её номер. Свойство DrawGrid1.Options.goEditing нужно выставить в true. Компонент постоянно перерисовывается, поэтому данные нужно хранить например в StringList.

Весь проект в прикреплённом файле.
Прикрепленные файлы:
5
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Форма ответа