Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 23.06.2015
Сообщений: 5

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

06.07.2016, 16:34. Показов 4845. Ответов 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
Просмотров: 157

Размер: 14.3 Кб

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

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

Размер: 15.9 Кб

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

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

Спасибо..
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.07.2016, 16:34
Ответы с готовыми решениями:

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

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

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

6
пофигист широкого профиля
4764 / 3200 / 861
Регистрация: 15.07.2013
Сообщений: 18,578
06.07.2016, 16:57
Цитата Сообщение от Mapkus Посмотреть сообщение
// вводим текст в ячейку
StringGrid1.Cells[1,1]:='Test';
// проверяем точку
PutText('Цвет после ввода текста - '+GetPixColor(1,1));
// И как же она успела поменять цвет?
0
0 / 0 / 0
Регистрация: 23.06.2015
Сообщений: 5
06.07.2016, 17:52  [ТС]
Цитата Сообщение от 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
пофигист широкого профиля
4764 / 3200 / 861
Регистрация: 15.07.2013
Сообщений: 18,578
07.07.2016, 01:01
Цитата Сообщение от Mapkus Посмотреть сообщение
Нужно
StringGrid1.Refresh
Конечно.

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

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

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

Размер: 15.8 Кб

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


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

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

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

Добавлено через 1 минуту
Цитата Сообщение от Mapkus Посмотреть сообщение
if StringGrid1.Cells[ACol,ARow] <> '' then
Кстати где Trim()?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.07.2016, 14:51
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Основы OpenGL 3.3 и Qt 6.9. Трансформированный треугольник
8Observer8 27.06.2025
На русском https:/ / rutube. ru/ video/ e424497dd6b7ae7e11494027c4b31a54/ https:/ / vkvideo. ru/ video-231040171_456239019 https:/ / www. youtube. com/ watch?v=mfD-ZL7wa_4 Bastyon
Федерация аутентификации на основе JWT-токенов с Keycloak и .NET в гетерогенных инфраструктурах
ArchitectMsa 27.06.2025
Тот самый момент, когда впервые столкнулся с проблемой интеграции десятка разрозненных систем аутентификации в одной корпоративной экосистеме. Кажый сервис жил своей жизнью - тут Basic Auth, там. . .
Гайд по современным СУБД (небесспорный)
Codd 26.06.2025
Когда я только начинал свой путь в IT как рядовой программист, база данных казалась мне чем-то простым и понятным. Ну, серьезно — это же просто место, где лежат данные, верно? Напиши SELECT * FROM. . .
Использование C# с AWS S3: Примеры с AWS SDK для .NET
stackOverflow 26.06.2025
Amazon S3 (Simple Storage Service) уже давно стал стандартом де-факто в мире облачного хранения данных. Особенно приятно, что для разработчиков . NET предусмотрен отличный SDK, который значительно. . .
Веб-автоматизация с Python и Selenium
AI_Generated 25.06.2025
Selenium с Python — это комбинация, которая выдержала проверку временем. Несмотря на появление новых инструментов вроде Playwright или Puppeteer, связка Python-Selenium остаётся золотым стандартом. . .
CQRS и Event Sourcing на C#
ArchitectMsa 25.06.2025
За последние несколько лет сложность корпоративных приложений выросла в геометрической прогрессии. Простые монолитные системы уступили место распределенным микросервисам, а нагрузка на корпоративные. . .
Хак домофона или как открыть дверь по номеру
yariko 25.06.2025
Забыли дома ключ. Не проблема. Можно открыть дверь домофона, просто позвонив на свой номер квартиры. Идея состоит в следующем. Внутрь трубки абонента встраивается контроллер, который по звонку сам. . .
Как украсить новогоднюю елку с Q# и Qiskit
EggHead 24.06.2025
Что может быть необычнее, чем применить законы квантовой механики для украшения новогодней елки? Пока другие развешивают обычные гирлянды, я решил объединить свою страсть к квантовым вычислениям с. . .
Системы нулевого доверия на C#
UnmanagedCoder 24.06.2025
Традиционная архитектура безопасности работает по принципу средневекового замка: создаём высокие стены вокруг корпоративной сети, укрепляем ворота межсетевыми экранами и системами обнаружения. . .
Снова не мой путь. Циклическое среднее, я обеими руками за проверку условия, в ракурсе данной задачи - циклическое среднее в топку.
Hrethgir 24.06.2025
Привет. Такой вопрос - нужно выводить среднее математическое между двумя направлениями, интервал значений которых может лежать в диапазоне одного оборота по кругу. Проблема заключается в том, что. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »