C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: подстветка строки в StringGrid  (Прочитано 9447 раз)
freshAngel
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 28


« : 02 Февраль 2009, 16:10:17 »

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

Код
if(ARow == 0) 
 {
 Form2->StringGrid2->Canvas->Brush->Color = clYellow;
 Form2->StringGrid2->Canvas->Font->Color  = clBlack;
 Form2->StringGrid2->Canvas->FillRect(Rect);
 Form2->StringGrid2->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Form2->StringGrid2->Cells[ACol][ARow]);
 }
 else
{
Form2->StringGrid2->Canvas->Brush->Color = clWhite;
 Form2->StringGrid2->Canvas->Font->Color  = clBlack;
 Form2->StringGrid2->Canvas->FillRect(Rect);
 Form2->StringGrid2->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Form2->StringGrid2->Cells[ACol][ARow]);
}
 

Интересует два вопроса:
Правильный это метод окрашивания строки, или нет!?
Как этому событию передать ссылку (номер строки) на строку которую я выбрал и которую нужно окрасить!?
Записан
VerZer
Участник


Сказали спасибо: +92/-10
Offline

Сообщений: 1138


« Ответ #1 : 02 Февраль 2009, 22:57:08 »

Код:
  StringGrid1->Options << goRowSelect;
не спасёт отца русской демократии? (с)
Записан
freshAngel
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 28


« Ответ #2 : 03 Февраль 2009, 21:11:22 »

Код:
  StringGrid1->Options << goRowSelect;
не спасёт отца русской демократии? (с)

VerZer - нет.  При таком подходе нельзя "бегать" по ячейкам таблицы, выделяется сразу вся строка.
Нашел другой способ.

Код
 
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
     int ARow, bool &CanSelect)
{
   StringGrid1->Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
     TRect &Rect, TGridDrawState State)
{
   if(ARow == StringGrid1->Row)
   {
           StringGrid1->Canvas->Brush->Color = clYellow;
           StringGrid1->Canvas->FillRect(Rect);
           StringGrid1->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2,
                                         StringGrid1->Cells[ACol][ARow]);
       }
   }
 

Только вот при таком методе подсветки строки, текст в ячейках нулевого столбца все время затирается.
Это наверное связано с тем, что метод перерисовки Invalidate() для StringGrid'а вызывается в свойстве onSelectCell, поэтому когда "побегаешь" по остальным ячейкам таблицы, тест в ячейках нулевого столбца тоже видно.
Или просто C++ Builder пытается выделить синим ячейку!?
Как можно это исправить!? Что - бы строка подсвечивалась как нужно и был виден текст в ячейках.
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


« Ответ #3 : 03 Февраль 2009, 21:49:28 »

Нда, убого. Вот, чисто как пример для творческой переработки
Invalidate() нужно повесить на все события, меняющие текущюю ячейку (KeyXXX, MouseXXX и тд)

Код:
void __fastcall TForm1::StringGrid1DrawCell (TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State)
{
TStringGrid* StringGrid = (TStringGrid*) Sender;
TCanvas* C = StringGrid->Canvas;
C->Pen->Style = psSolid;
C->Brush->Style = bsSolid;

AnsiString S = StringGrid->Cells[ACol][ARow];

if (State.Contains(gdFixed))
  {
  C->Brush->Color = StringGrid->FixedColor;
  C->FillRect(Rect);

  C->Font->Color = clBlack;
  int X = (Rect.right+Rect.left) / 2 - C->TextWidth(S) / 2;
  int Y = (Rect.bottom+Rect.top) / 2 - C->TextHeight(S) / 2;
  C->TextOut(X, Y, S);

  C->Pen->Color = clWhite;
  C->MoveTo(Rect.left, Rect.bottom-1);
  C->LineTo(Rect.left, Rect.top);
  C->LineTo(Rect.right, Rect.top);

  C->Pen->Color = clGray;
  C->MoveTo(Rect.right-1, Rect.top+1);
  C->LineTo(Rect.right-1, Rect.bottom-1);
  C->LineTo(Rect.left, Rect.bottom-1);

  return;
  }

int BC = 0xFFFFFF, FC = 0x000000, HC = 0x80FF80;

bool IsSelected = ((StringGrid->Selection.Left <= ACol) && (ACol <= StringGrid->Selection.Right) &&
                   (StringGrid->Selection.Top <= ARow) && (ARow <= StringGrid->Selection.Bottom));
bool IsHeighlight = (StringGrid->Selection.Top == ARow);

if (IsSelected)
  {
  BC = 0x800000; FC = 0xFFFFFF;
  }
    else
  {
  if (IsHeighlight) { BC = HC; }
  }


C->Font->Color = (TColor) FC;
C->Brush->Color = (TColor) BC;
C->FillRect(Rect);

int X = (Rect.right+Rect.left) / 2 - C->TextWidth(S) / 2;
int Y = (Rect.bottom+Rect.top) / 2 - C->TextHeight(S) / 2;

C->Brush->Style = bsClear;
C->TextOut(X, Y, S);
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.086 секунд. Запросов: 21.