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 — то выделяется ведь вся строка
буду копать в исходниках — наверно по другому никак не разобраться |
|
AVC |
Отправлено: 16.06.2004, 09:52 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
буду копать в исходниках
|
Это ни когда не повредит. |
|