0 / 0 / 0
Регистрация: 23.06.2015
Сообщений: 5
1

StringGrid Цвет фона пустых ячеек и ячеек с текстом

06.07.2016, 16:34. Показов 3336. Ответов 6

Доброго дня..

Задачка следующая:
Ячейки в StringGrid'e заполняются по блоку из Timer.
В StringGrid1DrawCell блок анализа выставляет цвет фона ячеек в зависимости от содержимого.
По кнопке формируется отчет по определенным ячейкам.

Чтобы не прогонять второй раз блок анализа уже для отчета предполагал анализировать цвет фона ячеек.
Упрощенный код такой:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
function TForm1.GetPixColor(ACol,ARow:integer):string;
// определить цвет точки в ячейке
var Pnt:TPoint;
begin
  Pnt:=StringGrid1.CellRect(ACol,ARow).TopLeft;
  result:=ColorToString(StringGrid1.Canvas.Pixels[Pnt.X+3,Pnt.Y+3]);
end;
 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  // перерисовываем не фикс-ные ячейки
  if (ARow > 0) and (ACol > 0) then
    begin
      // установка цвета фона для отрисовки пустых ячеек
      if ARow mod 2 = 1 then StringGrid1.Canvas.Brush.Color:=TColor($E1F2E3)
          else StringGrid1.Canvas.Brush.Color:=TColor($E5E5E5);
 
      // блок установки цвета фона по содержимому ячейки. Для простоты: не пустая - желтый
      if StringGrid1.Cells[ACol,ARow] <> '' then StringGrid1.Canvas.Brush.Color:=clYellow;
 
      // непосредственно отрисовка фона
      StringGrid1.Canvas.FillRect(Rect);
 
      // вывод текста ячейки если не пустая
      StringGrid1.Canvas.Font.Color:=clWindowText;
      if StringGrid1.Cells[ACol,ARow] <> '' then
        StringGrid1.Canvas.TextOut(Rect.Left+10,Rect.Top+2,StringGrid1.Cells[ACol, ARow])
    end
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var Pnt:TPoint;
begin
  // выводим начальный фоновый цвет
  PutText('Цвет фоновый - '+GetPixColor(1,1));
 
  // меняем точку в ячейке
  Pnt:=StringGrid1.CellRect(1,1).TopLeft;
  StringGrid1.Canvas.Pixels[Pnt.X+3,Pnt.Y+3]:=clBlack;
  // выводим изменения
  PutText('Цвет измененной точки - '+GetPixColor(1,1));
 
  // вводим текст в ячейку
//  StringGrid1.Cells[1,1]:='Test';
  // проверяем точку
//  PutText('Цвет после ввода текста - '+GetPixColor(1,1));
 
  // 2ой раз меняем точку в ячейке
  StringGrid1.Canvas.Pixels[Pnt.X+3,Pnt.Y+3]:=clBlue;
  // проверяем точку
  PutText('Цвет 2ого изменения - '+GetPixColor(1,1));
end;
Пока ячейки пусты все отрабатывает честно:

Название: scr1.jpg
Просмотров: 86

Размер: 14.3 Кб

Измененную точку (на черный и синий) на фоне ячейки видно.

После заполнения ячейки начинаются чудеса.
Снимает комментарии
Delphi
1
2
3
4
  // вводим текст в ячейку
  StringGrid1.Cells[1,1]:='Test';
  // проверяем точку
  PutText('Цвет после ввода текста - '+GetPixColor(1,1));
И получаем
Название: scr2.jpg
Просмотров: 87

Размер: 15.9 Кб

Изменения цвета точек фона при выводе текста (желтый) не происходит.
Точку не видно!!

Собственно хочу понять почему так происходит и как собственно получить цвет фона заполненной текстом ячейки.

Спасибо..
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.07.2016, 16:34
Ответы с готовыми решениями:

Проверка пустых ячеек в stringgrid
Доброе время суток. У меня след. проблема: по определенной кнопке или загрузкой из файла создается...

StringGrid - цвет ячеек
Добрый вечер. Суть проблемы такова: Есть программа, которая выполняет определенные действия и...

Цвет ячеек в StringGrid
Ребята, нужно отрисовать поле, в виде шахматной доски, просто закрасить ячейки, начиная со 2-ой в...

разный цвет ячеек в StringGrid
Есть код, который заполняет строку StringGrid1 элементами массива z, и мне нужно, что-бы в...

6
пофигист широкого профиля
4436 / 2926 / 828
Регистрация: 15.07.2013
Сообщений: 16,847
06.07.2016, 16:57 2
Цитата Сообщение от Mapkus Посмотреть сообщение
// вводим текст в ячейку
StringGrid1.Cells[1,1]:='Test';
// проверяем точку
PutText('Цвет после ввода текста - '+GetPixColor(1,1));
// И как же она успела поменять цвет?
0
0 / 0 / 0
Регистрация: 23.06.2015
Сообщений: 5
06.07.2016, 17:52  [ТС] 3
Цитата Сообщение от northener Посмотреть сообщение
// И как же она успела поменять цвет?

Вот тут..

Delphi
1
2
3
4
5
6
7
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
...
 
      // блок установки цвета фона по содержимому ячейки. Для простоты: не пустая - желтый
      if StringGrid1.Cells[ACol,ARow] <> '' then StringGrid1.Canvas.Brush.Color:=clYellow;
...
Только дальше

// проверяем точку
PutText('Цвет после ввода текста - '+GetPixColor(1,1));

дает цвет предыдущего фона..

Я чего то не догоняю??

Нужно

StringGrid1.Refresh

??
0
пофигист широкого профиля
4436 / 2926 / 828
Регистрация: 15.07.2013
Сообщений: 16,847
07.07.2016, 01:01 4
Цитата Сообщение от Mapkus Посмотреть сообщение
Нужно
StringGrid1.Refresh
Конечно.

Добавлено через 2 часа 40 минут
Вот только не могу понять зачем это нужно? Зачем проверять цвет фона?
1
0 / 0 / 0
Регистрация: 23.06.2015
Сообщений: 5
07.07.2016, 10:15  [ТС] 5
Цитата Сообщение от northener Посмотреть сообщение
Конечно.
Ура.. Заработало..

Delphi
1
2
3
4
5
  // вводим текст в ячейку
  StringGrid1.Cells[1,1]:='Test';
  StringGrid1.Refresh;
  // проверяем точку
  PutText('Цвет после ввода текста - '+GetPixColor(1,1));
И даже точка появилась..

Название: scr3.jpg
Просмотров: 82

Размер: 15.8 Кб

Сейчас не поленился посмотреть - оказывается у StringGrid'а нет OnChange..
А был уверен, что есть..


Цитата Сообщение от northener Посмотреть сообщение
Вот только не могу понять зачем это нужно? Зачем проверять цвет фона?
Цитата Сообщение от Mapkus
Чтобы не прогонять второй раз блок анализа уже для отчета предполагал анализировать цвет фона ячеек.
..Ну и массивы параллельные ячейкам не городить..
По сути, в отчет идут все ячейки с фоном отличным от начального..

Спасибо..
0
пофигист широкого профиля
4436 / 2926 / 828
Регистрация: 15.07.2013
Сообщений: 16,847
08.07.2016, 01:37 6
Цитата Сообщение от Mapkus Посмотреть сообщение
Ура.. Заработало..
Надеюсь ты понял почему.
Но по-прежнему остался вопрос "для чего это нужно"? О каком отчете идет речь?
0
586 / 453 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
09.07.2016, 14:51 7
Цитата Сообщение от Mapkus Посмотреть сообщение
В StringGrid1DrawCell блок анализа выставляет цвет фона ячеек в зависимости от содержимого.
Цитата Сообщение от Mapkus Посмотреть сообщение
Чтобы не прогонять второй раз блок анализа уже для отчета предполагал анализировать цвет фона ячеек.
Бред.
Во-первых "выставлять цвет" ни в коем случае не надо в OnDrawCell, а при добавлении/изменении содержимого.
Во вторых привязываться к цвету, да ещё и через "Canvas.Pixels" - капец просто. А если ячейка не видна? Перекрыта окном или вне экрана? Или вообще цветовой режим дисплея окажется 16 цветов?

Для хранения свойств ячейки следует использовать "TStringGrid.Objects[ACol,ARow]". А во всяких OnDrawCell надо отталкиваться от "Sender", а не от "StringGrid1".

Добавлено через 1 минуту
Цитата Сообщение от Mapkus Посмотреть сообщение
if StringGrid1.Cells[ACol,ARow] <> '' then
Кстати где Trim()?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2016, 14:51

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

Объединение ячеек в Excel вместе с текстом
Здравствуйте! Подскажите пожалуйста как мне объединить ячейки в Excel? Обязательно нужно, чтобы в...

Цвет ячеек в ProfGrid
Доброго времени суток. Есть программка, которая выводит табличку из Excel в форму. Некоторые ячейки...

Отрисовка ячеек StringGrid
Приветствую! Столкнулся с проблемой при динамическом создании StringGrid-ov. Ячейки почему-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.