![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ищу подходящий компонент: матрица, квадраты [D7]
whoim © (2012-01-26 19:39:00)Нужен компонент, представляющий визуально из себя матрицу некоего размера. Ячейки - квадратные. От них нужно только уметь менять цвет и реагировать на клик, также нужно уметь обращаться к ним по индексу (создавать массив данных исходя и цвета ячейки). Например, белый=0, зеленый=1. Меняем цвет по клику мыши, например, обработав его программно. Как проще? Генерировать TImage?
whoim (2012-01-26 21:23:00) [1]так работает)
procedure TForm1.DrawGrid1Click(Sender: TObject);
begin
data[DrawGrid1.Row, DrawGrid1.Col] := NOT data[DrawGrid1.Row, DrawGrid1.Col];
DrawGrid1.Repaint;
Memo1.Lines.Add(IntToStr(DrawGrid1.Col)+'/'+IntToStr(DrawGrid1.Row)+'='+BoolToStr(data[DrawGrid1.Row, DrawGrid1.Col]));
end;
procedure TForm1.FormResize(Sender: TObject);
begin
DrawGrid1.DefaultColWidth := round((DrawGrid1.Width - 70) / DrawGrid1.ColCount);
DrawGrid1.DefaultRowHeight := round((DrawGrid1.Height - 30) / DrawGrid1.RowCount);
end;
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
//Íàðèñóåì çàãîëîâîêè ñòðîê è ñòîëáöîâ
with Sender as TDrawGrid, Canvas do
begin
if (ARow = 0) and (ACol 0) then
TextRect(Rect, Rect.Left+1, Rect.Top, 'C'+IntToStr(ACol));
if (ACol = 0) and (ARow 0) then
TextRect(Rect, Rect.Left+1, Rect.Top, 'A'+IntToStr(ARow));
end;
//îòîáðàçèì ìàññèâ íóæíûì öâåòîì
if (ACol 0) and (ARow 0) then
begin
if data[ARow, ACol]
then
DrawGrid1.Canvas.Brush.Color:=clGreen
else
DrawGrid1.Canvas.Brush.Color:=clYellow;
DrawGrid1.Canvas.FillRect(DrawGrid1.CellRect(ACol, ARow));
end;
end;
Dimka Maslov (2012-01-26 21:20:00) [2]
>
> Жирно как-то.
Если кнопки без handle, то не жирно.
whoim (2012-01-26 21:17:00) [3]Нашел ошибку )
whoim (2012-01-26 21:16:00) [4]Огромное спасибо! Задавал вопрос пока ставился дельфи, лет пять уже его не трогал ))
Заюзал TDrawGrid, начал писать. Возникли вопросы ))
Я храню нужное мне состояние в массиве
var
Form1: TForm1;
data: Array[1..16,1..48] of Boolean;
По клику мыши изменяю его
procedure TForm1.DrawGrid1Click(Sender: TObject);
begin
data[DrawGrid1.Row, DrawGrid1.Col] := NOT data[DrawGrid1.Row, DrawGrid1.Col];
Memo1.Lines.Add(IntToStr(DrawGrid1.Col)+'/'+IntToStr(DrawGrid1.Row)+'='+BoolToStr(data[DrawGrid1.Row, DrawGrid1.Col]));
end;
И хочу отрисовывать все ячейки
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
//Нарисем заголовоки строк и столбцов
with Sender as TDrawGrid, Canvas do
begin
if (ARow = 0) and (ACol <> 0) then
TextRect(Rect, Rect.Left+1, Rect.Top, 'C'+IntToStr(ACol));
if (ACol = 0) and (ARow <> 0) then
TextRect(Rect, Rect.Left+1, Rect.Top, 'A'+IntToStr(ARow));
end;
//отобразим массив нужным цветом
if data[DrawGrid1.Row, DrawGrid1.Col]
then
DrawGrid1.Canvas.Brush.Color:=clGreen
else
DrawGrid1.Canvas.Brush.Color:=clYellow;
DrawGrid1.Canvas.FillRect(DrawGrid1 .CellRect(DrawGrid1.Col,DrawGrid1.Row));
end;
Однако пристарте формы отрисовывается только ячейка [1,1] и при кликанье - только фокусная, остальные становятся белыми. Как мне правильно отрисовывать все ячейки?
Inovet (2012-01-26 19:52:00) [5]> [3] Dimka Maslov © (26.01.12 19:46)
> Кнопок на форму накидать?
Жирно как-то.
Dimka Maslov (2012-01-26 19:46:00) [6]Кнопок на форму накидать?
Inovet (2012-01-26 19:43:00) [7]Так нарисуй сетку по массиву в OnPaint хоть прямо на канве формы, лови клики, сохраняй изменения в массив.
Ega23 (2012-01-26 19:42:00) [8]1. TDrawGrid
2. TStringGrid
3. TPaintBox
Я бы (возможно!) выбрал третье, с полностью своей отрисовкой.