Меню

Как изменить цвет ячейки stringgrid builder



Изменение цвета ячеек Delphi Stringgrid

В основном компонент Stringgrid, используется для вывода строковой информации в свои ячейки. Но при написании программ очень часто возникает желание сделать их более удобными, выделяя отдельные столбцы, строки или области ячеек разными цветами илидобавлением рисунков в ячейки StringGrid. Средствами инспектора объектов эту задачу не выполнить. Отдельной формы настроек для этого, в компоненте тоже не предусмотрено.

Однако, эта задача легко разрешается программно. Для этого используется событие компонента OnDrawCell, срабатывающее при отрисовке каждой отдельной ячейки таблицы. Таким образом, если использовать свои условия назначения того или иного цвета, можно «раскрасить» таблицу, нужным образом.

Для этого в установленном компонент Stringgridназначаем событие OnDrawCell. В созданную процедуру добавляем следующий код, назначающий цвет ячейки и цвет шрифта текста, а так же отрисовывающий их:

Данный код закрасит все ячейки одним цветом.

Для выделения отдельных строк, столбцов или ячеек, следует пользоваться условиями:

В результате получим таблицу, ячейки которой будут иметь разные цвета. Следует отметить, что последовательность условий в данном случае перекрывает назначение цвета колонок последней строкой, поэтому она получается одного цвета.

Рисунок: «Раскрашенный» StringGrid

Если есть необходимость изменить цвет фиксированных ячеек, иногда может быть не удобно использовать условия проверки номеров строк и столбцов. Это может быть в случае, если фиксированными будут несколько строк или столбцов. Здесь стоит воспользоваться иным условием, проверяющим именно параметр фиксированности ячейки:

Аналогично можно выделить сразу всю строку:

Источник

Разукрашивание ячеек у StringGrid

До чего же оказывается скучен в Delphi компонент StringGrid. В этой статье я расскажу как это хотя бы немного исправить. А именно, как разукрашивать у него ячейки. Но не ячейки которые попадают под конкретное условие, а именно любые. Например: ячейка которая содержит нуль должна быть синей. Для этого мы могли бы воспользоваться кодом:

if StringGrid.Cells[ACol, ARow] = ‘0’ then
with StringGrid.Canvas do
begin
Brush.Color := clBlue;
FillRect(Rect);
end;

Но, а если нам необходимо любой ячейке присваивать нужный нам цвет. Мне встречались на эту тему две или три статьи, но там (не хочу обидеть их авторов) скажем так не полный ход реализации. Но, одна статься меня все-таки вдохновила, воспользоваться примером из книги Дмитрия Осипова «Delphi профессиональные программирование». Там разбирался пример, как можно в ячейки StringGrid вставлять изображения. Собственно это и послужило вдохновением для написания этой статьи, но только по разукрашиванию ячеек, так как данная необходимость встречается чаще. Я решил написать на мой взгляд несколько универсальных функций, чтобы в дальнейшем не приходилось тратить время на написание кода (хотя его и немного) под различные ситуации. Дело в том, что StringGrid может хранить ссылки на объекты. Эти ссылки размещаются в массиве свойств:

Property Objects [ACol, ARow: Integer]: TObject;

Теперь приступим к практике. Создайте форму, поместите на нее StringGrid и одну кнопку. Все как на рисунке 1.


Рисунок 1 – Пример

Я обнулил у StringGrid свойства FixedCols и FixedRows. Ну а далее для начала нам необходимо создать новый тип:
type
TCellsColor = class(TObject)
public
BrushColor: TColor; // Наш цвет
end;
Далее создадим процедуру по созданию объектов, в которых и будем хранить значение цвета:
// Создание объектов
procedure TPrimary.CreateObj(Obj: TStringGrid);
var
i, j: Integer;
CellsColor: TCellsColor;
begin
with Obj do
for i := 0 to ColCount — 1 do
for j := 0 to RowCount — 1 do
begin
CellsColor := TCellsColor.Create; // Создаем объект
Objects[i, j] := CellsColor; // Связываем объект с ячейкой

if Obj.Objects[i, j] is TCellsColor then
// Присваиваем ячейкам цвет по умолчанию
with Obj.Objects[i, j] as TCellsColor do BrushColor := clWhite;
end;
end;

Эту процедуру мы вызовем при показе формы:
// Обработчик события формы OnShow
procedure TPrimary.FormShow(Sender: TObject);
begin
// Вызываем процедуру по созданию
// объектов для дальнейшей приязки к ячейкам
CreateObj(StringGrid);
end;

И не будем откладывать на потом создание процедуры по уничтожению объектов, а сразу напишем и ее:
// Уничтожение созданных объектов
procedure TPrimary.FreeObjects(Obj: TStringGrid);
var
i, j: Integer;
begin
for i := 0 to Obj.ColCount — 1 do
for j := 0 to Obj.RowCount — 1 do
if Obj.Objects[i, j] is TCellsColor then
// Уничтожаем объект
with Obj.Objects[i, j] as TCellsColor do free;
end;
Эту процедуру мы вызовем при закрытии формы:
// Закрытие формы
procedure TPrimary.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// Вызов процедуры для уничтожения
// созданных объектов
FreeObjects(StringGrid);
end;

Читайте также:  Антибиотик внутривенно желтого цвета

Еще нам осталось создать процедуру по разукрашиванию ячеек и написать немного кода в обработчике события отвечающего за прорисовку ячеек StringGrid. Напишем для начала процедуру для разукрашивания ячеек:
// Раскраска
procedure TPrimary.Painting(Obj: TStringGrid);
var
i, j: Integer;
begin
Randomize;
for i := 0 to Obj.ColCount — 1 do
for j := 0 to Obj.RowCount — 1 do
if Obj.Objects[i, j] is TCellsColor then
with Obj.Objects[i, j] as TCellsColor do BrushColor := Random(10000000);

Obj.Repaint; // Перерисовка Grid
end;

Цвет ячеек для демонстрации выбирается случайно. Теперь делаем последние штрихи, а именно напишем код в обработчике события отвечающего за прорисовку ячеек:
// Прорисовка ячеек
procedure TPrimary.StringGridDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
if StringGrid.Objects[ACol, ARow] is TCellsColor then
with StringGrid.Canvas do
begin
// Преобразовываем к типу TCellsColor и извлекаем цвет ячейки
Brush.Color := TCellsColor(StringGrid.Objects[ACol, ARow]).BrushColor;
// Заполняем ячейку
FillRect(Rect);
end;
end;

Теперь мы можем посмотреть, что у нас получилось. Для этого вызовем следующую процедуру и передадим ей ссылку на объект StringGrid:
Painting(StringGrid);

Ну, вот и все можно наслаждаться результатом. Пример работы показан на рисунке 2.

Рисунок 2 – Результат работы
Самое обидное то, что вот такие мелочи, бывает, иногда стопорят работу. Надеюсь, что кому ни будь это поможет.

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

Источник

Не могу изменить цвет ячейки StringGrid (Builder 6)

Здравствуйте!
Перечитал множество тем по изменению цвета ячеек. Проблему не решил.
Необходимо, в зависимости от условия (Cvet=0 или Cvet=1), изменять цвет ячеек или цвет шрифта.

У меня цвет меняется только в последней ячейке.

Т.е. если X должен быть красным, а Y и Z, то так и происходит.
Если X и Y должны быть красные, то X белый, а Y красный…

Цвет ячейки StringGrid
Есть СтрингГрид (матрица, заполнен целыми числами). По нажатию на кнопку в нем ищутся, допустим.

Цвет ячейки StringGrid
Нужно сделать так чтобы в stringride выделялось красным цветом фон ячейки с максимальным элементом.

StringGrid И цвет ячейки
Уважаемые форумчане подскажите как изменить цвет ячейки в StringGirid (допустим я отредактировал.

Цвет ячейки StringGrid
здравствуйте. помогите закрасить 1 ячейку в StringGrid так чтобы информация в из ячейки осталась.

параметры State это где?

Добавлено через 3 минуты
volvo, попытался StringGrid1->Objects — При запуске вся таблица красная и вся таблица заполняется ОДНОЙ строчкой.

Все равно красится только последняя строка, которая должна закрашиваться.

TextRect или DrawText – результат одинаковый.

это выражение всегда будет закрашивать сгенерированый номер строки — а тебе надо закрасить только определенную колонку в определенной строке!
это было правильно подмечено от volvo «Ну ты издеваешься, или что?»

вот рабочий код и постарайся его не кастрировать

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Цвет краёв ячейки в StringGrid
Можно ли в StringGrid изменить цвет краёв(границ) какой либо ячейки, не закрашивая саму ячейку? Ну.

StringGrid: цвет бордюра ячейки
Добрый день, уважаемые. Подскажите пожалуйста можно ли изменять цвет бордюра заданных ячеек.

Окрасить некоторые ячейки StringGrid-а в другой цвет
Как в stringgrid-е окрасить НЕКОТОРЫЕ (не все) ячейки в какой-нибудь цвет(например серый)?

Читайте также:  Как собрать торт букет цветов мастер класс

Как поменять цвет ячейки StringGrid и обратно?
у меня такая проблема,мне надо сделать так,чтобы при нажатии в начале на 1 ячейку stringgrid она.

Источник

StringGrid, изменить цвет конкретной ячейки

Выходит такой фейл..

Возможно исправить ошибку?
Или есть ли другой способ изменить цвет конкретной ячейки?

Не могу изменить цвет ячейки StringGrid (Builder 6)
Здравствуйте! Перечитал множество тем по изменению цвета ячеек. Проблему не решил. Необходимо, в.

Цвет ячейки StringGrid
Есть СтрингГрид (матрица, заполнен целыми числами). По нажатию на кнопку в нем ищутся, допустим.

Цвет ячейки StringGrid
Нужно сделать так чтобы в stringride выделялось красным цветом фон ячейки с максимальным элементом.

StringGrid И цвет ячейки
Уважаемые форумчане подскажите как изменить цвет ячейки в StringGirid (допустим я отредактировал.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Цвет краёв ячейки в StringGrid
Можно ли в StringGrid изменить цвет краёв(границ) какой либо ячейки, не закрашивая саму ячейку? Ну.

Изменить цвет ячейки мышкой
Как изменить цвет ячейки щелчком мыши? Использую gridEh. никак не получается. Нужно по щелчку.

Что за системный цвет используется для подсветки выбранной, но неактивной ячейки в StringGrid в Win10?
Что за системный цвет используется для подсветки выбранной, но неактивной ячейки в StringGrid, если.

Как изменить фокус с одной ячейки StringGrid на другую ячейку?
Здраствуйте подскажите пожалуйста как изменить фокус с одной ячейки StringGrid на другую ячейку?

Источник

Как изменить цвет ячейки stringgrid builder

Вывожу решения своей задачи в StringGrid. Необходимо закрасить каким-нибудь цветом ячейки с оптимальным решением. То есть в одной строке только одна ячейка должна быть закрашена.

Как это реализовать?


И. Павел © ( 2011-04-05 13:21 ) [1]

Используйте событие OnDrawColumnCell:
http://delphi-faq.zoxt.net/192.htm


Basilisk ( 2011-04-05 13:24 ) [2]

а как событие с нажатием клавиши связать?


И. Павел © ( 2011-04-05 13:30 ) [3]

> а как событие с нажатием клавиши связать?

Событие (OnDrawCell для StringGrid) нужно задать в инспекторе объектов (перейти на вкладку «Events» и там дважды щелкнуть левой кнопкой мыши на соответствующем событии, чтобы создался обработчик к нему).

А что должно происходить при нажатии клавиши? Если только после нажатии клавиши должен разукрашиваться StringGrid, то просто создайте переменную colored = false, а в обработчике клавиши присвойте ей true. А в OnDrawCell проверяйте: если colored = true, то разукрашивайте.


Basilisk ( 2011-04-05 13:43 ) [4]

а при этом надо использовать StringGrid.Repaint.

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if ACol=0 then // закрашиваем первую ячейку в строке
begin
stringGrid1.Canvas.Brush.Color:= clGray;
stringGrid1.Canvas.FillRect(rect);
end;


novichek ( 2011-04-05 13:45 ) [6]

StringGrid.Repaint ни в коем случаи!


И. Павел © ( 2011-04-05 13:47 ) [7]

> а при этом надо использовать StringGrid.Repaint.

Если у вас раньше таблица не разукрашивалась и теперь (например, после нажатия на кнопку) вы решили, что она должна начать разукрашиваться (colored = true), то наверное, не помешает вызвать Refresh, иначе таблица может перерисоваться только когда это потребуется. Но после этого ни Repaint ни Refresh вызывать будет не надо (особенно в OnDrawCell) — таблица будет сама себя рисовать по мере необходимости.


Basilisk ( 2011-04-05 14:04 ) [8]

Почему-то закрашивается вся таблица и текста не видно:

procedure Tmain.stDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if coloured=true then
begin
st.Canvas.Brush.Color:= clGreen;
st.Canvas.FillRect(rect);
end;
end;

procedure Tmain.Button9Click(Sender: TObject);
var i,j:integer;
begin
coloured:=false;
for i:=0 to st.RowCount-1 do
for j:=0 to st.ColCount-1 do
begin
coloured:=false;
if(j=opt[i]) then coloured:=true;
st.Cells[j,i]:=floattostr(reshc[i,j])+»\»+floattostr(resht[i,j]);
st.Refresh;
end;
end;


Медвежонок Пятачок © ( 2011-04-05 14:09 ) [9]

ненарисованного текста и не должно быть видно

Медвежонок Пятачок
а поподробней?


И. Павел © ( 2011-04-05 14:14 ) [11]

Условие, когда нужно закрашивать ячейку а когда нет нужно помещать в OnDrawCell. Вот пример:

Читайте также:  Паразит человека белого цвета

procedure TForm1.Button1Click(Sender: TObject);
begin
colored := True;
st.Refresh;
end;

procedure TForm1.stDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (colored) and (ACol mod 2 = ARow mod 2)
then st.Canvas.Brush.Color := clWhite
else st.Canvas.Brush.Color := clBlack;


Медвежонок ХМЛ © ( 2011-04-05 14:15 ) [12]

куда еще-то подробнее?
текст не нарисован.
что должно быть при этом видно?


Basilisk ( 2011-04-05 14:19 ) [13]

И. Павел
Вроде у меня так всё и есть кроме этого условия (ACol mod 2 = ARow mod 2)

тогда он по шахматному закрашивает


Basilisk ( 2011-04-05 14:19 ) [14]

Медвежонок ХМЛ
но по нажатию клавиши у меня ведь таблица заполняется

и чего?
ты ее (таблицу) не видишь?


Basilisk ( 2011-04-05 14:26 ) [16]

Медвежонок ХМЛ
вижу но ячейки пустые(зеленые) хотя я в них текст добавляю


Плохиш © ( 2011-04-05 14:26 ) [17]


> Basilisk (05.04.11 14:12) [10]
>
> Медвежонок Пятачок
> а поподробней?

Подробности в справке и у преподавателя.

> Basilisk (05.04.11 14:19) [14]
>
> Медвежонок ХМЛ
> но по нажатию клавиши у меня ведь таблица заполняется

Заполнение таблицы и рисование её же операции разные и независимые.


И. Павел © ( 2011-04-05 14:26 ) [18]

> Вроде у меня так всё и есть кроме этого условия (ACol mod
> 2 = ARow mod 2)
>
> тогда он по шахматному закрашивает

Вместо этого условия вставьте свое: «if(j=opt[i])». сейчас оно у вас в Button9Click, но должно быть в stDrawCell. Сперва выполняется Button9Click и устанавливает colored в true. Потом, при необходимости перерисовки, выполняется stDrawCell, в котором вы должны проверить: нужно ли ячейку разукрасить и разукрасить ее.


Медвежонок ХМЛ © ( 2011-04-05 14:28 ) [19]

вижу но ячейки пустые(зеленые) хотя я в них текст добавляю

Все что ты нарисовал — ты видишь.
Все чего ты не рисовал — ты не видишь.
По крайней мере не должен видеть в нормальном состоянии сознания.


И. Павел © ( 2011-04-05 14:29 ) [20]

> ячейки пустые(зеленые) хотя я в них текст добавляю

Вот с выводом текста:

procedure TForm1.Button1Click(Sender: TObject);
begin
st.Cells[1, 1] := «aaa»;
colored := True;
st.Refresh;
end;

procedure TForm1.stDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (colored) and (ACol mod 2 = ARow mod 2)
then st.Canvas.Brush.Color := clWhite
else st.Canvas.Brush.Color := clBlack;

st.Canvas.FillRect(Rect);
st.Canvas.TextRect(Rect, Rect.Left, Rect.Top, st.Cells[ACol, ARow]);
end;


И. Павел © ( 2011-04-05 14:29 ) [21]

Даже можно без «st.Canvas.FillRect(Rect);», т.к. TextRect сам фон рисует.


Basilisk ( 2011-04-05 14:42 ) [22]

procedure Tmain.stDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var i,j:integer;
begin
for i:=0 to st.RowCount-1 do
for j:=0 to st.ColCount-1 do
begin
if (coloured=true) and (j=opt[i])then st.Canvas.Brush.Color:= clGreen
else st.Canvas.Brush.Color:= clWhite;
st.Canvas.FillRect(Rect);
st.Canvas.TextRect(Rect, Rect.Left, Rect.Top, st.Cells[ACol, ARow]);
end;
end;

procedure Tmain.Button9Click(Sender: TObject);
var i,j:integer;
begin
for i:=0 to st.RowCount-1 do
for j:=0 to st.ColCount-1 do
begin
st.Cells[j,i]:=floattostr(reshc[i,j])+»\»+floattostr(resht[i,j]);
coloured:=true;
st.Refresh;
end;

Текст виден, но ячейки всё равно все закрашивает


И. Павел © ( 2011-04-05 14:44 ) [23]

> for i:=0 to st.RowCount-1 do
> for j:=0 to st.ColCount-1 do

Этот цикл в stDrawCell не нужен. stDrawCell для каждой ячейки вызывается свой, при этом координаты ячейки, для которой был вызван stDrawCell можно узнать, прочитав параметры ACol и ARow. Т.е. внутри stDrawCell нужно разукрашивать только одну ячейку — с координатами [ACol; ARow]:

if (coloured=true) and (ACol=opt[i])then st.Canvas.Brush.Color:= clGreen
else st.Canvas.Brush.Color:= clWhite;
st.Canvas.FillRect(Rect);
st.Canvas.TextRect(Rect, Rect.Left, Rect.Top, st.Cells[ACol, ARow]);


Медвежонок ХМЛ © ( 2011-04-05 14:45 ) [24]

зачем этот дебильный двойной цикл внутри события отрисовки?


Медвежонок ХМЛ © ( 2011-04-05 14:47 ) [25]

if (coloured=true) and (ACol=opt[i])then st.Canvas.Brush.Color:= clGreen


Basilisk ( 2011-04-05 14:51 ) [26]

Источник