Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как узнать момент изменения состояния StringGrid


Автор: Нитонисе 4.7.2011, 16:39
Нужно одновременно использовать две опции - goRowSelect и goEditing.
По умолчанию первая опция включена, вторая - выключена.
По двойному клику в ячейке пишем такой код:
Код

void __fastcall TForm1::StringGrid1DblClickCell(TObject *Sender, int ARow, int ACol)

{
    StringGrid1->Options >> goRowSelect;
    StringGrid1->Options << goEditing;
}

И нужно чтобы еще и включилось редактирование. Как его включить?
Затем, когда состояние стринггрида изменилось, нужно опять переключить опции. Как словить этот момент?

Автор: artsb 4.7.2011, 22:32
Цитата(Нитонисе @  4.7.2011,  16:39 Найти цитируемый пост)
    StringGrid1->Options >> goRowSelect;
    StringGrid1->Options << goEditing;

Разве это работает? ИМХО, должно быть так:
Код

void __fastcall TForm1::StringGrid1DblClickCell(TObject *Sender, int ARow, int ACol)
{
    StringGrid1->Options = StringGrid1->Options >> goRowSelect;
    StringGrid1->Options = StringGrid1->Options << goEditing;
}


Добавлено через 39 секунд
А разве две эти опции одновременно нельзя включать?

Автор: artsb 4.7.2011, 22:57
Цитата(artsb @  4.7.2011,  22:32 Найти цитируемый пост)
А разве две эти опции одновременно нельзя включать? 

Да, нельзя.

Цитата(Нитонисе @  4.7.2011,  16:39 Найти цитируемый пост)
Затем, когда состояние стринггрида изменилось, нужно опять переключить опции. Как словить этот момент? 

Вроде бы вот так работает:
Код

__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
    pSelectedCell.x = pSelectedCell.y = -1;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::StringGrid1GetEditText(TObject *Sender, int ACol, int ARow,
          UnicodeString &Value)
{
    pSelectedCell.x = ACol;
    pSelectedCell.y = ARow;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow,
          bool &CanSelect)
{
    if((pSelectedCell.x != -1 && pSelectedCell.y != -1) &&
        (pSelectedCell.x != ACol || pSelectedCell.y != ARow)) {
        pSelectedCell.x = pSelectedCell.y = -1;

        StringGrid1->Options = StringGrid1->Options >> goEditing;
        StringGrid1->Options = StringGrid1->Options << goRowSelect;
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm2::StringGrid1DblClick(TObject *Sender)
{
    StringGrid1->Options = StringGrid1->Options >> goRowSelect;
    StringGrid1->Options = StringGrid1->Options << goEditing;
}
//---------------------------------------------------------------------------

pSelectedCell - это TPoint, закрытый член класса TForm2.

Автор: Нитонисе 5.7.2011, 14:44
Решил все-таки отлючить goRowSelect и закрашивать ячейки активной строки вручную. Нашел тут похожую тему:
Код

void __fastcall TfSheme::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
                    TGridDrawState State)
{
    if (ARow == 0) return;

    if (StringGrid1->Row == ARow) StringGrid1->Canvas->Brush->Color=clSkyBlue;
    else StringGrid1->Canvas->Brush->Color=clWhite;
    
    StringGrid1->Canvas->Font->Color=clBlack;
    StringGrid1->Canvas->FillRect(Rect);

    DrawText(StringGrid1->Canvas->Handle,
          StringGrid1->Cells[ACol][ARow].t_str(),
          StringGrid1->Cells[ACol][ARow].Length(),
          &Rect,
          DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}

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

Автор: Usper 6.7.2011, 07:55
Чтобы избежать всяких бесконечных циклов отрисовок и в результате переполнения буфера предлагаю объявить глобальную переменную для хранения номера выделенной строки и добавить обработчик выделения ячейки для корректной раскраски ячеек:
Код

...
int Row;
...
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Row = 1;
}
...
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
    if (ARow == 0 || ACol == 0) return;

    if (Row == ARow) StringGrid1->Canvas->Brush->Color=clSkyBlue;
    else StringGrid1->Canvas->Brush->Color=clWhite;

    StringGrid1->Canvas->Font->Color=clBlack;
    StringGrid1->Canvas->FillRect(Rect);

    DrawText(StringGrid1->Canvas->Handle,
          StringGrid1->Cells[ACol][ARow].c_str(),
          StringGrid1->Cells[ACol][ARow].Length(),
          &Rect,
          DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
...
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
      int ARow, bool &CanSelect)
{
    if(Row != ARow) Row = ARow;
    else return;
    StringGrid1->Repaint();
    Form1->Caption = StringGrid1->Row;
}

Автор: xvr 6.7.2011, 12:16
Цитата(Нитонисе @  5.7.2011,  14:44 Найти цитируемый пост)
Не хотят ячейки закрашиваться. Причем когда программно выделяю ряд - то ячейки закрашиваются. А когда мышкой выбираю ячейку - закрашивается только она, причем может остаться закрашенной и предыдущая ячейка...

Позовите Repaint() - закрасится все, что надо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)