Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2011, 17:26   #1
Demien
Форумчанин
 
Аватар для Demien
 
Регистрация: 01.08.2007
Сообщений: 222
Печаль Цветные ячейки в StringGrid

Не могу понять как закрасить определенную ячейку в StringGrid-e...
Подскажите пожалуйста!

Точней не так... Как закрасить понятно! Но в процессе работы программы необходимо красить ячейки...
Вот мне и не понятно, как имитировать событие "DrawCell"?
Жить тоже вредно, от этого умирают!!!

Последний раз редактировалось Demien; 29.06.2011 в 18:39.
Demien вне форума Ответить с цитированием
Старый 29.06.2011, 19:08   #2
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Приблизительно так (принцип покраски) :

Код:
procedure TFm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var r : trect;
begin
  if (Button = mbLeft) and (Shift = [ssCtrl, ssLeft]) then
  begin
    StringGrid1.MouseToCell(X, Y, SourceCol, SourceRow);
  end;
end

procedure TFm_TFm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (ARow <> 0) then
  begin
    if (StringGrid1.Cells[ACol,ARow] = '') then
      StringGrid1.Canvas.Brush.color := clYellow
    else
      if (SourceCol > 0) and (SourceRow > 0) and (ACol = SourceCol) and (ARow = SourceRow) then
      begin
        StringGrid1.Canvas.Brush.color := clRed;
      end;
  end;
  with StringGrid1.Canvas do
  begin
    FillRect(Rect);
    TextRect(Rect, Rect.Left, Rect.Top, StringGrid1.Cells[aCol, aRow]);
  end;
end;

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 29.06.2011, 19:18   #3
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Вот готовое решение с одного из форумов :

Цитата:
Сообщение от igor2222
Объявляем глобальные массивы.
Код:
FG: array of array of TColor;
    BG: array of array of TColor;
    ZG: array of array of boolean;
И некую процедурку
Код:
procedure TFm1.RefreshArray;
var Col, Row : integer;
begin
  SetLength(FG, StringGrid1.ColCount, StringGrid1.RowCount);
  SetLength(BG, StringGrid1.ColCount, StringGrid1.RowCount);
  SetLength(ZG, StringGrid1.ColCount, StringGrid1.RowCount);
  // Initialize with default colors
  for Col := 0 to StringGrid1.ColCount - 1 do begin
    for Row := 0 to StringGrid1.RowCount - 1 do begin
      if (StringGrid1.Cells[Col,Row] = '') then
        BG[Col, Row] := clYellow
      else BG[Col, Row] := clWhite;
      FG[Col, Row] := clBlack;
      ZG[Col, Row] := False;
    end;
  end;
  StringGrid1.Refresh;
end;
Выполняем ее после каждого изменения грида (ко-ва строк, столбцов и прочего глобального) ну и при создании формы тоже.
А дальше по клику мыши как то так:
Код:
procedure TFm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var r : trect;
    Col, Row : integer;
begin
  if (Button = mbLeft) and (Shift = [ssCtrl, ssLeft]) then
  begin
    StringGrid1.MouseToCell(X, Y, SourceCol, SourceRow);
    if (SourceRow > 0) then
    begin
      if BG[SourceCol, SourceRow] <> clBlue then
      begin
        BG[SourceCol, SourceRow] := clBlue;
        FG[SourceCol, SourceRow] := clWhite;
        ZG[SourceCol, SourceRow] := True;
      end
      else begin
        if (StringGrid1.Cells[SourceCol,SourceRow] = '') then
          BG[SourceCol, SourceRow] := clYellow
        else BG[SourceCol, SourceRow] := clWhite;
        FG[SourceCol, SourceRow] := clBlack;
        ZG[SourceCol, SourceRow] := False;
      end;
    end;
  end
  else if Button = mbLeft then
  begin
    StringGrid1.MouseToCell(X, Y, SourceCol, SourceRow);
    if BG[SourceCol, SourceRow] <> clBlue then
    begin
      RefreshArray;
    end;
  end;
end;
Строка номер 0 - у меня заголовки, поэтому ее не трогаю.
Ну и естесственно Главная дравная процедура с канвой:

Код:
procedure TFm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  S: string;
begin
  S := StringGrid1.Cells[ACol, ARow];
  StringGrid1.Canvas.Brush.Color := BG[ACol, ARow];
  StringGrid1.Canvas.FillRect(Rect);
  StringGrid1.Canvas.Font.Color := FG[ACol, ARow];
  StringGrid1.Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, S);
end;
В результате все ячейки в любой момент времени имеют три дополнительных свойства - цвет, цвет шрифта и некий признак, которым я определяю выбрана она или нет. Можно еще кучу свойств засунуть.

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 29.06.2011, 19:36   #4
dacorp
Пользователь
 
Регистрация: 12.06.2010
Сообщений: 48
По умолчанию

Заливка ячейки цветом с текстом в поле "Тест заливки"
Код:
procedure TForm1.GridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
  State: TGridDrawState);
begin
  if (Grid.Cells[ACol,ARow]='Тест заливки') then 
   with Grid.Canvas do
    begin
      Brush.Color := $00CACAFF; //цвет которым заливаем
      FillRect(Rect); //Заливаем ячейку цветом
      Font.Color := clBlack; //Цвет текста в данной ячейке
      TextOut(Rect.Left, Rect.Top, Grid.Cells[ACol,ARow]); //Прорисовка текста
    end;
end;
dacorp вне форума Ответить с цитированием
Старый 30.06.2011, 12:05   #5
Demien
Форумчанин
 
Аватар для Demien
 
Регистрация: 01.08.2007
Сообщений: 222
По умолчанию

volod3000, dacorp спасибо!
Сейчас по работе отвлекли...
Разгребусь - с кодом разбираться буду!
Тему в избранное добавил.
Жить тоже вредно, от этого умирают!!!
Demien вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Stringgrid и пустые ячейки karapuz Общие вопросы Delphi 4 27.05.2011 14:39
Фиксированные ячейки в StringGrid Arkuz Общие вопросы Delphi 1 05.03.2011 23:32
ячейки в StringGrid Desha Компоненты Delphi 3 06.09.2010 20:32
Ячейки в StringGrid ImmortalAlexSan Общие вопросы Delphi 2 17.05.2010 17:41