как раскрасить текущую ячейку в DBGridEh?
пытался так:
TRect re_cell = grd->DataRect();
int datacoll = 0;
TColumn * Column;
for (int i=0; i<=grd->Columns->Count; i++)
{
if (grd->Columns->operator [](i)->Title == ColumnTitle)
{
datacoll = i;
break;
}
}
grd->DefaultDrawColumnCell(re_cell,datacoll, grd->Columns->operator [](datacoll), (TGridDrawState)("gdSelected"));
но так не получается. перерисовать весь грид с помощью repaint или refresh тоже не помогает
вся проблема в том что я раскрашиваю ячейку не из события OnDrawColumnCell а из своей функции, куда я передаю только название столбца.
пытался так:
TRect re_cell = grd->DataRect();
int datacoll = 0;
TColumn * Column;
for (int i=0; i<=grd->Columns->Count; i++)
{
if (grd->Columns->operator [](i)->Title == ColumnTitle)
{
datacoll = i;
break;
}
}
grd->DefaultDrawColumnCell(re_cell,datacoll, grd->Columns->operator [](datacoll), (TGridDrawState)("gdSelected"));
но так не получается. перерисовать весь грид с помощью repaint или refresh тоже не помогает
Мне лично не очень понятно, какую связь имеет приведенный код к вопросу, и почему не использовать событие GetCellParams?
Мне лично не очень понятно, какую связь имеет приведенный код к вопросу, и почему не использовать событие GetCellParams?
смысл в том что сетка уже загрузилась данными и хочется перерисовать не всю таблицу, а только одну ячейку. а известны только координаты мышки. надо вычислить какая ячейка находится под курсором мыши и её перерисовать
grd->DefaultDrawColumnCell(re_cell,datacoll, grd->Columns->operator [](datacoll), (TGridDrawState)("gdSelected"));
Я так полагаю, раз вызывается DefaultDrawColumnCell, то и отрисовка будет обычная, т.е. даже если это и работает, то разницы между этим кодом и отсутствиет этого кода ты не увидишь.
А причем здесь PHP ?
И в чем глубокий метафизический смысл писать
grd->Columns->operator [](datacoll) вместо grd->Columns[datacoll] (а может grd->Columns->Items[datacoll] не помню точно) ?
И что означает (TGridDrawState)("gdSelected") ?
Певедение указаталя на строку к типу TGridDrawState даст результат, которого не содержится в TGridDrawState.
Я так полагаю, раз вызывается DefaultDrawColumnCell, то и отрисовка будет обычная, т.е. даже если это и работает, то разницы между этим кодом и отсутствиет этого кода ты не увидишь.
А причем здесь PHP ?
И в чем глубокий метафизический смысл писать
grd->Columns->operator [](datacoll) вместо grd->Columns[datacoll] (а может grd->Columns->Items[datacoll] не помню точно) ?
И что означает (TGridDrawState)("gdSelected") ?
Певедение указаталя на строку к типу TGridDrawState даст результат, которого не содержится в TGridDrawState.
блин!!! вопрос в том как мне вызвать defaultDrawColumnCell?? код который я пример неправильный. как его написать правильно??
блин!!! вопрос в том как мне вызвать defaultDrawColumnCell?? код который я пример неправильный. как его написать правильно??
Так ты сам ячейку раскрасить хочешь или использовать дефолтовую раскраску defaultDrawColumnCell? Если дефолтовую, то зачем вообще чего-то вызыват, оно и так по дефолту красится.
А вообще, функции рисования в компонентах обычно находятся в private или protected секции, и вызываются оттуда из функции Paint, непосредственной реакции на WM_PAINT или еще как-то автоматически. Не знаю как в EhLib, но в компонентах, которые я разбирал было так. Публичного принудительно вызова перерисовки некоторой части компонента обычно не предусматривается за ненадобностью.
ЗЫ
gdSelected точно без кавычек писать надо :)
Так ты сам ячейку раскрасить хочешь или использовать дефолтовую раскраску defaultDrawColumnCell? Если дефолтовую, то зачем вообще чего-то вызыват, оно и так по дефолту красится.
А вообще, функции рисования в компонентах обычно находятся в private или protected секции, и вызываются оттуда из функции Paint, непосредственной реакции на WM_PAINT или еще как-то автоматически. Не знаю как в EhLib, но в компонентах, которые я разбирал было так. Публичного принудительно вызова перерисовки некоторой части компонента обычно не предусматривается за ненадобностью.
ЗЫ
gdSelected точно без кавычек писать надо :)
спасибо за ответ.
на самом деле когда я делаю так:
void __fastcall Tfrm_mainstud::DBGridEh3DrawColumnCell(TObject *Sender,const TRect &Rect, int DataCol, TColumnEh *Column,GridDrawState State)
{
TDBGridEh * grd = (TDBGridEh*) (Sender);
grd->Canvas->Font->Color = TColor(0x00000000);
grd->Canvas->Brush->Color = TColor(0x000000FF);
grd->DefaultDrawColumnCell(Rect,DataCol,Column, State);
то ячейка перекрашивается в заданный цвет фона и шрифта. но параметры переданные в DefaultDrawColumnCell меня несколько смущают. особенно когда я вызываю перерисовку из другого места и мне их просто неоткуда взять.
ячейка перекрашивается в заданный цвет фона и шрифта. но параметры переданные в DefaultDrawColumnCell меня несколько смущают. особенно когда я вызываю перерисовку из другого места и мне их просто неоткуда взять.
Взять негде это точно. Хотя с колонкой еще можно разобраться, но с прямоугольником сразу непонятно что делать. Пэтому, когда надо перерисовать, оычно вызывают просто Repaint или Refresh и обрабатывают события.
А чем тебя смущают параметры переданные в DefaultDrawColumnCell. Тут видимо происходит следующее: ты устанавиливаешь цвета и заставляешь грид перерисовать ячейку. DefaultDrawColumnCell, похоже, не меняет цвета, а пользуется текущими настройками канвы.
Взять негде это точно. Хотя с колонкой еще можно разобраться, но с прямоугольником сразу непонятно что делать. Пэтому, когда надо перерисовать, оычно вызывают просто Repaint или Refresh и обрабатывают события.
мне казалось что с помощью DataRect() я смогу получить нужный прямоугольник. или както через координаты курсора мыши?
А чем тебя смущают параметры переданные в DefaultDrawColumnCell. Тут видимо происходит следующее: ты устанавиливаешь цвета и заставляешь грид перерисовать ячейку. DefaultDrawColumnCell, похоже, не меняет цвета, а пользуется текущими настройками канвы.
это точно!
мне казалось что с помощью DataRect() я смогу получить нужный прямоугольник. или както через координаты курсора мыши?
Что такое DataRect я так сразу и не соображу. А через курсор мыши может и можно. Тут надо смотреть у грида аналог функции ItemAt компонента ListView. Я так понял, ты хочешь подсвечивать ячейки под курсором?
Правда здесь могут быть другие грабли (а могут и не быть, не знаю), может оказаться что канва в гриде не актуальна, пока он не находится в состоянии перерисовки, которое возникает при вызове Repaint. Просто некоторые компоненты рисуются по следующей схеме
c = new TControlCanvas
c.Control = this
рисуем
рисуем
рисуем
delete c
Что такое DataRect я так сразу и не соображу. А через курсор мыши может и можно. Тут надо смотреть у грида аналог функции ItemAt компонента ListView. Я так понял, ты хочешь подсвечивать ячейки под курсором?
если быть точным то чтобы пользователь мог сам закрашивать ячейки. он щелкает мышкой- вызывается popupmenu там он выбирает пункт закрасить и после выбирает цвет через ColorDialog. а потом мне нужно перекрасить ячейку... :(
если быть точным то чтобы пользователь мог сам закрашивать ячейки. он щелкает мышкой- вызывается popupmenu там он выбирает пункт закрасить и после выбирает цвет через ColorDialog. а потом мне нужно перекрасить ячейку... :(
Тогда тут точно ничего кроме обработчика событий придумывать не надо. Нужно где-то хранить список закрашенных ячеек и в обработчике сравнивать не есть ли это ячейка та, которая закрашена, ну а дальше обработчик у тебя написан.
А даже если ты определишь прямоугольник под курсором и закрасишь его по клику, то это будет держаться только до первой перерисовки окна, напрмер сверни-разверни окно и ячейка снова не закрашена.