| 
| laifik | 
|  Отправлено: 20.01.2005, 10:16 |  |  
| 
 Дежурный стрелочник
 
 Группа: Участник
 Сообщений: 70
 
 
 
  
 | Что-то не получается у меня совместить нажатие на RxCheckListBox1 и выделение строк в Гриде. Но по порядку.
 1 часть. У меня работает такой код:
 
 | CODE |  | void __fastcall TForm1::DBGridEh2DrawColumnCell(TObject *Sender, const TRect &Rect, int DataCol, TColumnEh *Column,
 TGridDrawState State)
 {
 AnsiString TR;
 TR = "01";
 TDBGridEh *  Eh_Oper = (TDBGridEh *)Sender;
 
 if( !State.Contains(gdSelected) && ( Eh_Oper->DataSource->DataSet->FieldByName("GostID")->AsString.Trim() == TR)) {
 
 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);
 }
 | 
 Выделяется строка, где в поле GostID есть значение "01". Как задать переменную TR, чтобы выделялись все строки, значения rкоторых в поле начинались на "01".
 2 часть: Переменная TR должна определиться в событии OnClickCheck компонента RxCheckListBox1
 
 | CODE |  | TR = RxCheckListBox1->Items->Strings[RxCheckListBox1->ItemIndex]; | 
 Но событие DBGridEh2DrawColumnCell наступает раньше, чем событие OnClickCheck. Как сделать, чтобы выделение записей происходило только после нажатия на Item RxCheckListBox1?
 |  
|  |  
| laifik | 
| Отправлено: 20.01.2005, 13:10 |  |  
| 
 Дежурный стрелочник
 
 Группа: Участник
 Сообщений: 70
 
 
 
  
 | 1 часть решила. Нужен ответ по второй части. |  
|  |  
| trigger | 
| Отправлено: 20.01.2005, 13:35 |  |  
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | 1.поделитесь плиз ответом на ваш первый вопрос. вдруг другим тоже будет интересно ... 
 2.как я понял логику, в лист боксе выберается значение, и по событию этого выбора в гриде должны выделиться ячейки начинающиеся с этого значения?
 
 тогда зачем в обработчике DBGridEh2DrawColumnCell явно выставляется
 TR = "01";
 ?
 значение "01" присутствует в списке лист бокса? тада может выставить его программно в листбоксе, а потом по событии выбора вызовется сам DBGridEh2DrawColumnCell и все ништь ... не?
 
 и не будет ли пролемы с тем что переменная TR объявляется внутри блока DBGridEh2DrawColumnCell, а достучаться до нее вы хоите из другого места проги..?
 
 или я где туплю..?
 |  
|  |  
| laifik | 
| Отправлено: 20.01.2005, 13:48 |  |  
| 
 Дежурный стрелочник
 
 Группа: Участник
 Сообщений: 70
 
 
 
  
 | 2. Логику правильно поняли. Именно так. 
 | QUOTE |  | тогда зачем в обработчике DBGridEh2DrawColumnCell явно выставляется TR = "01";
 
 | 
 Просто я отрабатывала эту часть отдельно. Она у меня не работала, поэтому переменную задала конкретно.
 Код работающий таков:
 
 | CODE |  | void __fastcall TForm1::DBGridEh2DrawColumnCell(TObject *Sender,
 const TRect &Rect, int DataCol, TColumnEh *Column,
 TGridDrawState State)
 {
 AnsiString TR;
 TR = "01";
 // if( !lbSelected && State.Contains(gdSelected) ) {
 TDBGridEh *  Eh_Oper = (TDBGridEh *)Sender;
 
 if( !State.Contains(gdSelected) && ( Eh_Oper->DataSource->DataSet->FieldByName("GostID")->AsString.Trim().SubString(1,2) == TR)) {
 
 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);
 }
 }
 | 
 Вся проблема в том, что событие DBGridEh2DrawColumnCell начинает отрабатываться в момент открытия формы с Гридом. А мне нужно, чтобы оно отрабатывалось в момент нажатия на чекбокс, где определялась переменная TR, которая и передавалась бы в событие OnDrawColumnCell.
 Переменную я объявляю не внутри блока, а в private:
 Есть еще одно событие Грида:
 
 | QUOTE |  | Вы можете изменить цвет шрифта и фона ячейки таблицы (либо ее строки или столбца) в зависимости от значения поля, определив обработчик события OnGetCellParams; | 
 Но я не нашла примера кода, как пользоваться событием.
 |  
|  |  
| trigger | 
| Отправлено: 20.01.2005, 14:45 |  |  
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | | QUOTE |  | 1 часть. У меня работает такой код: CODE:
 void __fastcall TForm1::DBGridEh2DrawColumnCell(TObject *Sender,
 const TRect &Rect, int DataCol, TColumnEh *Column,
 TGridDrawState State)
 {
 AnsiString TR;
 TR = "01";
 | 
 
 | QUOTE |  | Переменную я объявляю не внутри блока, а в private: | 
 
 я не поянл, первый кусок кода — он всеже уже ваш рабочий, или это всеже пример...
 там ведь явно задается AnsiString TR; и TR = "01";
 на да ладно с ним...
 
 а если такой алгоритм:
 
 1.при создании формы: переменная TR = "01";
 2. прорисовывается грид, где используется переменная ТР
 3. в итоге выделены нужные значения...
 
 после создания формы:
 1. кликаем по листбоксу и выбераем значение.
 2.в обраотчике листбокса он_клик:
 - ТР = выбранное значение листокса
 - вызываем метод DBGridEh2->Refresh(); а он в свою очередь вызовет DBGridEh2DrawColumnCell и выделяться новые ячейки...
 а если не вызовет, то переоткрыть датасет... он то точно вызовет перерисовку грида...
 
 не прокатит так?
 
 |  
|  |  
| laifik | 
| Отправлено: 20.01.2005, 14:57 |  |  
| 
 Дежурный стрелочник
 
 Группа: Участник
 Сообщений: 70
 
 
 
  
 | Полный код таков: в файле .h
 
 | CODE |  | private: // User declarations
 String TR;
 
 | 
 
 | CODE |  | void __fastcall TForm1::RxCheckListBox1ClickCheck(TObject *Sender)
 {
 TR = RxCheckListBox1->Items->Strings[RxCheckListBox1->ItemIndex];
 DBGridEh2->OnDrawColumnCell =  DBGridEh2DrawColumnCell;
 }
 | 
 Далее
 
 | 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->DataSource->DataSet->FieldByName("GostID")->AsString.Trim().SubString(1,2) == TR)) {
 
 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);
 }  }
 | 
 
 
 | QUOTE |  | вызываем метод DBGridEh2->Refresh(); а он в свою очередь вызовет DBGridEh2DrawColumnCell и выделяться новые ячейки... а если не вызовет, то переоткрыть датасет... он то точно вызовет перерисовку грида...
 
 | 
 Вот этого я добиваюсь. Но не знаю, как из события RxCheckListBox1ClickCheck вызвать DBGridEh2DrawColumnCell . Не подскажите?
 |  
|  |  
| TRIGGER | 
| Отправлено: 20.01.2005, 15:22 |  |  
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | | QUOTE |  | Вот этого я добиваюсь. Но не знаю, как из события RxCheckListBox1ClickCheck вызвать DBGridEh2DrawColumnCell . Не подскажите? | 
 )) АХ "ВОТ ГДЕ СОБАКА ПОРЫЛАСЬ..."
 
 я щас у себя проверил. у меня
 функция DBGridEh2->Refresh();
 вызывает метод DBGridEh2DrawColumnCell
 вроде как для всех ячеек...
 
 
 |  
|  |  
| laifik | 
| Отправлено: 20.01.2005, 16:33 |  |  
| 
 Дежурный стрелочник
 
 Группа: Участник
 Сообщений: 70
 
 
 
  
 | Я все-таки сделала по-другому: 
 и второе событие| CODE |  | void __fastcall TForm1::RxCheckListBox1ClickCheck(TObject *Sender) {
 if( RxCheckListBox1->ItemIndex != -1 ){    //"selected, checked"
 if( RxCheckListBox1->Checked[ RxCheckListBox1->ItemIndex ] ){
 
 TR = RxCheckListBox1->Items->Strings[RxCheckListBox1->ItemIndex];
 DBGridEh2->OnGetCellParams =  DBGridEh2GetCellParams;
 DBGridEh2->Refresh();
 }
 }
 
 | 
 
 | CODE |  | void __fastcall TForm1::DBGridEh2GetCellParams(TObject *Sender, TColumnEh *Column, TFont *AFont, TColor &Background,
 TGridDrawState State)
 {
 TDBGridEh *  Eh_Oper = (TDBGridEh *)Sender;
 if(Eh_Oper->DataSource->DataSet->FieldByName("GostID")->AsString.Trim().SubString(1,2) == TR)
 {
 if( RxCheckListBox1->ItemIndex != -1 ){    //"selected, checked"
 if( RxCheckListBox1->Checked[ RxCheckListBox1->ItemIndex ] ){
 AFont->Color = clRed;
 Background = TColor(0x00C6FFFF);
 }else{   //"selected, not checked"
 AFont->Color = clBlack;
 Background = clWhite;
 }
 }
 }
 
 | 
 Все работает, кроме того, что при смене Item-а сбрасывается предыдущее выделение. Мне нужно, чтобы выделение оставалось, а новое добавлялось.
 |  
|  |  
| Guest | 
| Отправлено: 20.01.2005, 16:34 |  |  
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | DBGridEh2->Invalidate() или подобный метод |  
|  |  
| laifik | 
| Отправлено: 20.01.2005, 16:47 |  |  
| 
 Дежурный стрелочник
 
 Группа: Участник
 Сообщений: 70
 
 
 
  
 | | CODE |  | void __fastcall TForm1::DBGridEh2GetCellParams(TObject *Sender, TColumnEh *Column, TFont *AFont, TColor &Background,
 TGridDrawState State)
 {
 if(Column->FieldName  != "GostID") return;
 for(int i = 0;i < RxCheckListBox1->Items->Count;i++)
 {
 if(RxCheckListBox1->Checked[i])
 if(Column->Field->AsString.Trim().SubString(1,2)  == RxCheckListBox1->Items->Strings[i])
 {
 AFont->Color = clRed;
 Background = TColor(0x00C6FFFF);
 break;
 }
 }
 }
 | 
 Только теперь почему-то выделяет ячейки столбца. А хотелось бы целую строку.
 
 Отредактировано laifik — 20/01/2005, 17:51
 |  
|  |  
| Guest | 
| Отправлено: 20.01.2005, 17:31 |  |  
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | Анализируйте значение колонки GostID текущей строки вместо
 if(Column->FieldName != "GostID") return;
 ... for(int i = 0;i < RxCheckListBox1->Items->Count;i++)
 if(Column->Field->AsString.Trim().SubString(1,2) == RxCheckListBox1->Items-
 
 использовать
 if (DataSet->FieldByName("GostID")->AsString.Trim().SubString(1,2) == RxCheckListBox1->Items->Strings[i])
 |  
|  |  
| ** laifik | 
| Отправлено: 20.01.2005, 19:54 |  |  
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | Я уже догадалась. Вот работающий код: 
 | CODE |  | void __fastcall TForm1::DBGridEh2GetCellParams(TObject *Sender, TColumnEh *Column, TFont *AFont, TColor &Background,
 TGridDrawState State)
 {
 TDBGridEh *  Eh_Oper = (TDBGridEh *)Sender;
 for(int i = 0;i < RxCheckListBox1->Items->Count;i++)
 {
 if(RxCheckListBox1->Checked[i])
 if(Eh_Oper->DataSource->DataSet->FieldByName("GostID")->AsString.Trim().SubString(1,2) == RxCheckListBox1->Items->Strings[i])
 {
 AFont->Color = clRed;
 Background = TColor(0x00C6FFFF);
 break;
 }
 }
 }
 
 | 
 Огромное спасибо за помощь!
   |  
|  |  |