Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать момент изменения состояния StringGrid 
:(
    Опции темы
Нитонисе
Дата 4.7.2011, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



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

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

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

И нужно чтобы еще и включилось редактирование. Как его включить?
Затем, когда состояние стринггрида изменилось, нужно опять переключить опции. Как словить этот момент?
PM MAIL   Вверх
artsb
Дата 4.7.2011, 22:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Нитонисе @  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 секунд
А разве две эти опции одновременно нельзя включать?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 4.7.2011, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(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.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Нитонисе
Дата 5.7.2011, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Решил все-таки отлючить 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);
}

Не хотят ячейки закрашиваться. Причем когда программно выделяю ряд - то ячейки закрашиваются. А когда мышкой выбираю ячейку - закрашивается только она, причем может остаться закрашенной и предыдущая ячейка... бред какой-то короче.
PM MAIL   Вверх
Usper
Дата 6.7.2011, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: 15
Всего: 15



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

...
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;
}



--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
xvr
Дата 6.7.2011, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.