Выделение цветом строки компонента StringGrid

Тема в разделе "LANGS.C", создана пользователем Keva, 6 фев 2008.

  1. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Подскажите пожалуйста, как сделать сабж?
     
  2. SUMASBROD

    SUMASBROD Member

    Публикаций:
    0
    Регистрация:
    8 май 2007
    Сообщения:
    64
    Вот так:
    Код (Text):
    1. void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
    2.       int ARow, TRect &Rect, TGridDrawState State)
    3. {
    4.    if (ARow==1) {
    5.         StringGrid1->Canvas->Brush->Color = clRed;
    6.         StringGrid1->Canvas->FillRect(Rect);
    7.    }
    8. }
     
  3. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Выделена будет только выбранная ячейка, а требуется выделить все ячейки выбранной строки.
     
  4. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Keva
    OwnerDraw ?
     
  5. SUMASBROD

    SUMASBROD Member

    Публикаций:
    0
    Регистрация:
    8 май 2007
    Сообщения:
    64
    Keva
    Там вообще то указано что строка 2, а событие возникает при покраске всех ячеек этой строки.
     
  6. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    SUMASBROD
    А как сделать так чтоб при клике на ячейке подсвечивалась вся строка?
     
  7. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    В коде Сумасброда сделай так:
    Код (Text):
    1. void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) {
    2.    if (ARow == selectRow ) {
    3.         StringGrid1->Canvas->Brush->Color = clRed;
    4.         StringGrid1->Canvas->FillRect(Rect);
    5.    }
    6. }
    а selectRow задавай уже при щелчке по ячейке таблицы.
     
  8. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Xerx
    StringGrid1DrawCell событие настает когда я запусаю программу и рисуется сама таблица. Но мне надо чтобы при клике на какой либо ячейке подсвечивалась вся строка, подсвечиваю ячейку следующим образом:
    Код (Text):
    1. void __fastcall TForm1::StringGrid2DrawCell(TObject *Sender, int ACol,
    2.       int ARow, TRect &Rect, TGridDrawState State)
    3. {
    4.         if (State.Contains(gdFocused))
    5.         {
    6.                 StringGrid2->Canvas->Brush->Color = clActiveCaption;
    7.                 StringGrid2->Canvas->FillRect(Rect);
    8.                 StringGrid2->Canvas->TextOut(Rect.Left+1,Rect.Top+1,StringGrid2->Cells[ACol][ARow]);
    9.  
    10.         }
    11. }
     
  9. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Keva
    StringGrid1DrawCell вызывается при каждой перерисовке ячейки.
    если нужно отрисовывать всю строку, то сделай так:
    Код (Text):
    1. StringGrid2->Canvas->Rectangle( 0, Rect.Top, StringGrid2->Canvas->ClipRect.Right-1, Rect.Bottom - Rect.Top+1 );
    2. StringGrid2->Canvas->TextOut(Rect.Left+1, Rect.Top+1, StringGrid2->Cells[ACol][ARow]);
    К сожалению нет под рукой ни BCB, ни Delphi, а работал с VCL давно. Но вроде правильно написал. Да и во всяком случае суть ясна. Если не получится - пиши, посмотрю дома.
     
  10. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Xerx
    Не получилось, буду признателен за помощь
     
  11. SUMASBROD

    SUMASBROD Member

    Публикаций:
    0
    Регистрация:
    8 май 2007
    Сообщения:
    64
    Вот полностью рабочий код, только ячейка которую выделяешь остается нераскрашеной.
    И когда снова выделяешь ту же строку получается с 3-го клика что не есть гуд. Дальше думать не охота.

    Код (Text):
    1. void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
    2.       int ARow, bool &CanSelect)
    3. {
    4. TRect Rect;
    5. for (int i=1; i<StringGrid1->ColCount; i++) {
    6.         for (int j=1; j<StringGrid1->RowCount; j++) {
    7.         Rect = StringGrid1->CellRect(i,j);
    8.         StringGrid1->Canvas->Brush->Color = clWhite;
    9.         StringGrid1->Canvas->FillRect(Rect);
    10.         }
    11. }
    12. for (int i=1; i<StringGrid1->ColCount; i++) {
    13.         Rect = StringGrid1->CellRect(i,ARow);
    14.         StringGrid1->Canvas->Brush->Color = clRed;
    15.         StringGrid1->Canvas->FillRect(Rect);
    16. }
    17. }
     
  12. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    SUMASBROD
    Во первых, почему в первом случае вложенный цикл оба раза по ColCount?
    Во вторых, почему в этих же циклах итерации от 1 до кол-ва элементов-1? Уж или от 0, или терминальное условие не <, а <=.
    В третьих, ужасный код. Уж если и делать настолько через ж**у (извиняюсь конечно), то хотя бы в первом цикле
    Код (Text):
    1. Rect1 = StringGrid1->CellRect(i,0);
    2. Rect2 = StringGrid1->CellRect(i,StringGrid1->ColCount-1);
    3. Rect1.Bottom = Rect2.Bottom;
    4. Rect1.Right = Rect2.Right;
    5. StringGrid1->Canvas->Brush->Color = clWhite;
    6. StringGrid1->Canvas->FillRect(Rect1);
    Ну а второй цикл вообще не нужен.

    Я дома набросаю нормальный код. Сегодня или завтра с утра запостю.
     
  13. SUMASBROD

    SUMASBROD Member

    Публикаций:
    0
    Регистрация:
    8 май 2007
    Сообщения:
    64
    Да, в первом случае, упустил, сознаюсь.
    По поводу второго замечания начинаю с 1 т.к. по умолчанию первая строка и столбец фиксированные.
    То что через ж**у, да но другой, более быстрой идеи не нашел.
     
  14. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Код (Text):
    1. int selIndex = -1;
    2. ...
    3.  
    4. void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect) {
    5.     selIndex = ARow;
    6.     InvalidateRect( StringGrid1->Handle, NULL, false );
    7. }
    8.  
    9. void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) {
    10.     StringGrid1->Canvas->Brush->Color = ( ARow == selIndex ) ? clRed : clWhite;
    11.     StringGrid1->Canvas->Rectangle( Rect );
    12. }
    Ну и не забудь где-нибудь ранее вызвать
    Код (Text):
    1. StringGrid1->Canvas->Brush->Style = bsSolid;
    SUMASBROD
    Первая-то строка фиксированная, если пользователь не поменял свойства компонента ColFixed & RowFixed (вроде так называются). Так что или их учитывать или рисовать вручную все.
     
  15. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Xerx
    А второй обработчик это обработчик какого события?
     
  16. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Keva
    StringGrid1->Canvas->Brush->Style = bsSolid; ?
    ну например OnCreate или onShow...
     
  17. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Xerx
    Благодарю за помощь. Можно сделать все намного проще в Options->goRowSelect=true, и будет то что надо.
     
  18. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Keva
    А цвет задать? В моем случае он может быть произвольным, как и фон остальной части.
     
  19. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Xerx
    Почему обработчик один и тот же а параметры разные?
     
  20. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Keva
    Извини, не понял вопроса.