Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

           Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
           И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - https://clck.ru/fCqwP

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2016, 22:07   #1
Mapkus
 
Регистрация: 30.10.2015
Сообщений: 3
По умолчанию StringGrid Цвет фона пустых ячеек и ячеек с текстом

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

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

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

Код:
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

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

После заполнения ячейки начинаются чудеса.
Снимает комментарии

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

И получаем
Scr2.jpg

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

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

Спасибо..

Последний раз редактировалось Аватар; 06.07.2016 в 22:47.
Mapkus вне форума Ответить с цитированием
Старый 06.07.2016, 22:45   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,664
По умолчанию

дружище, это ж классика!
Как звучит оригинал задания?
маленький извращенец!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 07.07.2016, 10:37   #3
Mapkus
 
Регистрация: 30.10.2015
Сообщений: 3
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
дружище, это ж классика!
возможно..

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Как звучит оригинал задания?
Да так и звучит...

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

Цитата:
Сообщение от Mapkus
Чтобы не прогонять второй раз блок анализа уже для отчета..
..а также не городить флаговый массив параллельно ячейкам, IMHO, проще пробежать по ячейкам и скинуть в отчет все с фоном, отличным от базового..

Но, в принципе, соглашусь, - мы не ищем легких путей..

Цитата:
Сообщение от min@y™ Посмотреть сообщение
маленький извращенец!
Как бы далеко за 40..
Но за комплемент все равно спасибо..
Mapkus вне форума Ответить с цитированием
Старый 07.07.2016, 10:45   #4
TaLadno
Форумчанин
 
Регистрация: 03.06.2015
Сообщений: 395
По умолчанию

Не надо рвать гланды через жопу вешать на визуальный компонент логику. Никому. Никогда. Вообще.
Визуальная хрень должна отображать визуальщину и всё.
Вы там держитесь.
TaLadno вне форума Ответить с цитированием
Старый 07.07.2016, 10:46   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,664
По умолчанию

Цитата:
Как бы далеко за 40..
Ну, тогда БОЛЬШОЙ!
Совет № раз: выбрось StringGrid, вместо него используй TDrawGrid (самое простое). Данные храни и обрабатывай отдельно, визуально - только отображай.

И ещё, я не понимаю, что значит
Цитата:
заполняются по блоку из Timer
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 07.07.2016, 10:48   #6
TaLadno
Форумчанин
 
Регистрация: 03.06.2015
Сообщений: 395
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
И ещё, я не понимаю, что значит
Так сорокалетние дяди называют обработчик события OnTimer

Дядям это простительно

Вы там держитесь.
TaLadno вне форума Ответить с цитированием
Старый 07.07.2016, 11:34   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию

Цитата:
Данные храни и обрабатывай отдельно, визуально - только отображай.
категорически согласен и ППКС!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ

           Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
           Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
StringGrid не меняет цвет фона. ZBEP Компоненты Delphi 17 21.01.2015 08:57
MS Excel: Отмена объединения ячеек и заполнение "новых" ячеек текстом (числом), бывшим ранее в объединенной ячейке D.Sergienko Microsoft Office Excel 3 24.06.2013 15:18
Как с помощью JavaScript изменить цвет фона ячеек в таблице,так что бы можно было выбрать цвет из списка Gotessa JavaScript, Ajax 1 09.05.2009 16:05
Стили ячеек. Цвет фона, шрифт: размер, начертание .. Virtson Microsoft Office Excel 3 10.03.2007 16:19