C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
DBGridEh2DrawColumnCell, неясности
laifik
  Отправлено: 21.01.2005, 09:32


Дежурный стрелочник

Группа: Участник
Сообщений: 70



У меня по этому событию несколько вопросов.
На Form1 есть таблица DBGridEh2. В таблице нужно произвести выделение строк в режиме MultiSelect = true.
1. Событие начинает работать в момент загрузки Form1 (На таблице первая строка выделена). Можно ли добиться, чтобы выделение происходило только в момент события OnCellClick для DBGridEh2, а при открытии формы никакого выделения в таблице не было?
2. При нажатой клавиши “Ctrl” и левой кнопки мыши я могу выделить несколько строк. Если для одной из строк я хочу убрать выделение, я на ней щелкаю. При этом на этой строке остается выделение, а со всех других снимается. Как сделать наоборот?
3. Если выделяю строку на первый клик, а на второй клик (по ней же) хочу снять выделение. Выделение не снимается. Как этого добиться?
Код события такой:
CODE
void __fastcall TForm1::DBGridEh2DrawColumnCell(TObject *Sender,
     const TRect &Rect, int DataCol, TColumnEh *Column,
     TGridDrawState State)
{
 TDBGridEh *  Eh_Oper = (TDBGridEh *)Sender;

     if(State.Contains(gdSelected)) {
     Eh_Oper->Canvas->Font->Color = clRed;
     Eh_Oper->Canvas->Brush->Color = TColor(0x00C6FFFF);
     Eh_Oper->Canvas->FillRect(Rect);
     Eh_Oper->Canvas->TextOut(Rect.Left+2,Rect.Top+2,Column->Field->Text);
Eh_Oper->DefaultDrawColumnCell(Rect,DataCol,Column,State);
        }
AVC
Отправлено: 21.01.2005, 09:51


Ветеран

Группа: Модератор
Сообщений: 1583



1.
Если DrawColumnCell считает, что при открытии формы строка выделена, то проще отменить выделение при создании формы (конструктор или OnCreate формы). Вообще выбор места зависит от моента открытия DataSet. Надо разобраться откуда берется выделеная строка.
laifik
Отправлено: 21.01.2005, 10:03


Дежурный стрелочник

Группа: Участник
Сообщений: 70



QUOTE (AVC @ 21/01/2005, 10:53)
Вообще выбор места зависит от моента открытия DataSet. Надо разобраться откуда берется выделеная строка.

Вообще, в данном случае, это не принципиально. Этот момент я отрабатываю на вспомогательной форме, где кинут Грид. И DataSet находится в режиме Open()=true уже в момент открытия формы (не OnCreate). Если убрать событие DrawColumnCell и открыть форму, на таблице никаких выделений нет.
Как отменить выделение, не знаю. Поэтому и обратилась за помощью.
AVC
Отправлено: 21.01.2005, 10:49


Ветеран

Группа: Модератор
Сообщений: 1583



То есть у вас срабатывает if(State.Contains(gdSelected)) ?
Скорее всего вы видете просто активную строку.
Может добавить проверку SelectedRows->Count?

PS. В свое время меня этот MultiSelect с BookMark так достал, что сделал им альтернативу и использую только её.
laifik
Отправлено: 21.01.2005, 11:28


Дежурный стрелочник

Группа: Участник
Сообщений: 70



Спасибо! smile.gif Первый вопрос снимается. Добавила проверку на выделение — при загрузке выделение исчезло.
Осталось 2 вопроса.
Guest
Отправлено: 21.01.2005, 19:55


Не зарегистрирован







QUOTE (laifik @ 21/01/2005, 10:34)
if(State.Contains(gdSelected))

Это условие выделения ячейки. Далее идет перерисовка ячейки. А как задать условие отмены выделения и перерисовку с другими параметрами? sad.gif

Вернуться в Вопросы программирования в C++Builder