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

 
Номер прорисовываемой строки, TRxDBGrid
alekseich
Отправлено: 11.06.2004, 17:43


Ученик-кочегар

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



Всем доброго времени суток

Вопрос в следущем:
Как в компоненте TRxDBGrid в обработчике события DrawColumnCell определить момент(/ты) когда прорисовываются ячейки текущей строки?

RxDBGrid1->DataSource->DataSet->RecNo показывает номер текущей строки в наборе, и она не меняется в этом обработчике.

Может есть какое-то средство (или какое-то свойство) показывающее номер прорисовываемой строки(причем не относительно грида как RxDBGrid1->Row, а относительно самого набора данных)?
Gedeon
Отправлено: 11.06.2004, 18:19


Ветеран

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



CODE

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
     const TRect &Rect, int DataCol, TColumn *Column,
     TGridDrawState State)
{
   if(State.Contains(gdSelected)){
       // тута че надо
   }
}
//---------------------------------------------------------------------------

QUOTE

TGridDrawState represents information that is useful when rendering the cell of a grid.

Unit

Grids

enum Grids__3 { gdSelected, gdFocused, gdFixed };

typedef Set TGridDrawState;

Description

TGridDrawState represents state information about the cell of a grid that is being rendered. It is a set that includes 0 or more of the following:

Value Meaning

gdSelected The cell is currently selected.
gdFocused The cell has input focus.
gdFixed The cell is in the fixed region of the grid.
alekseich
Отправлено: 12.06.2004, 19:39


Ученик-кочегар

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



Да, все это хорошо, но только для текущей ячейки, а меня интересуют все ячейки текущей строки.

DrawColumnCell срабатывает дважды для каждой ячейки при переходе на новую строку — один раз снимается выделение второй рисуется выделение на новой строке.

Интересно определить момент прорисовки ячеек новой строки.


alekseich
Отправлено: 15.06.2004, 09:34


Ученик-кочегар

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



Нашел подобный вопрос
https://rxlib.ru/forums/index.php?ac...23c2ca4b7736b77

на вопрос:
Вопрос в том как написать проверку "если строка текущая, то ..."

olegenty ответил:
Например через ActiveRecord твоего наследника TDataSet

Попрошу ответить и на этот:
Я хочу код раскраски текущей строки поместить в потомке класса TRxDBGrid, разработанный мной, а ActiveRecord в TDataSet находится в защищенном разделе класса и напрямую обратится к нему я есно не могу.
Как быть в таком случае?
AVC
Отправлено: 15.06.2004, 10:14


Ветеран

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



Вот приемчик, позволяющий обойти ограничение видимости protected:
CODE

class TDataSetTmp : public TDataSet
{
public:
int __fastcall GetProtectedField (void) {return TDataSet ::ProtectedField;};
};

void __fastcall TForm1::...
{
int value = ((TDataSetTmp*)(DBGrid1->DataSet))->GetProtectedField();
}

*Тип функции Get... должен соответствовать типу ProtectedField.
alekseich
Отправлено: 15.06.2004, 12:00


Ученик-кочегар

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



Спасибо, примерчик очень забавный

CODE

class TDataSetTmp : public TDataSet
{
public:
   int __fastcall GetActiveRecord (void) {return TDataSet::ActiveRecord;}
};

void __fastcall TForm1::RxDBGrid1DrawColumnCell(TObject *Sender,
     const TRect &Rect, int DataCol, TColumn *Column,
     TGridDrawState State)
{
   int value = ((TDataSetTmp*)RxDBGrid1->DataSource->DataSet)->GetActiveRecord();
  //в обоих случаях глючит
   int recno = RxDBGrid1->Row;//RxDBGrid1->DataSource->DataSet->RecNo;
 
   if (recno == value)
   {
       RxDBGrid1->Canvas->Brush->Color = clHighlight;
       RxDBGrid1->Canvas->Font->Color = clHighlightText;
   }
   else
   {
       RxDBGrid1->Canvas->Brush->Color = clWindow;
       RxDBGrid1->Canvas->Font->Color = clWindowText;
   }
   RxDBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
}


Но все равно не работает, выходит надо использовать не ActiveRecord, но что???
olegenty
Отправлено: 15.06.2004, 13:31


Ветеран

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



да загнул я тогда, проще всё в миллион раз.
1. в событии AfterScroll сохранить ключ. (при перерисовке AfterScroll не происходит)
2. в OnDrawColumlCell сравнить ключ перерисовываемого поля с сохранённым. при совпадении — вот вам текущая строка...
alekseich
Отправлено: 15.06.2004, 17:07


Ученик-кочегар

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



Да, до этого я и сам дошел и это использую.

Но весь прикол в том чтобы взвалить прорисовку строки на сам грид.

А по вашему придется задействовать еще и компоненты Dataset'ы, чтобы запоминать ключ.

Может еще какая идея возникнет?
olegenty
Отправлено: 16.06.2004, 06:49


Ветеран

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



чтобы всё взвалить на грид, надо порождать от него наследника. вот заведи у наследника поле-ключ, и заполняй его в AfterScroll, а дальше всё как всегда.
alekseich
Отправлено: 16.06.2004, 09:46


Ученик-кочегар

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



Примерно так и делаю

но именно этого и хотелось бы избежать...

ведь как-то он(грид) все-таки определяет что строка текущая:
если проставить rowselect — то выделяется ведь вся строка sad.gif

буду копать в исходниках — наверно по другому никак не разобраться sad.gif
AVC
Отправлено: 16.06.2004, 09:52


Ветеран

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



QUOTE

буду копать в исходниках

Это ни когда не повредит.

Вернуться в Работа с базами данных в C++Builder