Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

как раскрасить текущую ячейку в DBGridEh?

2.1K
01 октября 2005 года
greyich
117 / / 02.02.2005
вся проблема в том что я раскрашиваю ячейку не из события OnDrawColumnCell а из своей функции, куда я передаю только название столбца.

пытался так:

Код:
TDBGridEh * grd = (TDBGridEh*) (Sender);
 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 тоже не помогает
1
02 октября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by greyich
вся проблема в том что я раскрашиваю ячейку не из события OnDrawColumnCell а из своей функции, куда я передаю только название столбца.

пытался так:

Код:
TDBGridEh * grd = (TDBGridEh*) (Sender);
 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?

2.1K
03 октября 2005 года
greyich
117 / / 02.02.2005
Цитата:
Originally posted by kot_
Мне лично не очень понятно, какую связь имеет приведенный код к вопросу, и почему не использовать событие GetCellParams?


смысл в том что сетка уже загрузилась данными и хочется перерисовать не всю таблицу, а только одну ячейку. а известны только координаты мышки. надо вычислить какая ячейка находится под курсором мыши и её перерисовать

362
04 октября 2005 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by greyich

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.

2.1K
04 октября 2005 года
greyich
117 / / 02.02.2005
Цитата:
Originally posted by _kolyan
Я так полагаю, раз вызывается DefaultDrawColumnCell, то и отрисовка будет обычная, т.е. даже если это и работает, то разницы между этим кодом и отсутствиет этого кода ты не увидишь.

А причем здесь PHP ?

И в чем глубокий метафизический смысл писать
grd->Columns->operator [](datacoll) вместо grd->Columns[datacoll] (а может grd->Columns->Items[datacoll] не помню точно) ?

И что означает (TGridDrawState)("gdSelected") ?
Певедение указаталя на строку к типу TGridDrawState даст результат, которого не содержится в TGridDrawState.



блин!!! вопрос в том как мне вызвать defaultDrawColumnCell?? код который я пример неправильный. как его написать правильно??

362
04 октября 2005 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by greyich
блин!!! вопрос в том как мне вызвать defaultDrawColumnCell?? код который я пример неправильный. как его написать правильно??



Так ты сам ячейку раскрасить хочешь или использовать дефолтовую раскраску defaultDrawColumnCell? Если дефолтовую, то зачем вообще чего-то вызыват, оно и так по дефолту красится.

А вообще, функции рисования в компонентах обычно находятся в private или protected секции, и вызываются оттуда из функции Paint, непосредственной реакции на WM_PAINT или еще как-то автоматически. Не знаю как в EhLib, но в компонентах, которые я разбирал было так. Публичного принудительно вызова перерисовки некоторой части компонента обычно не предусматривается за ненадобностью.

ЗЫ
gdSelected точно без кавычек писать надо :)

2.1K
04 октября 2005 года
greyich
117 / / 02.02.2005
Цитата:
Originally posted by _kolyan
Так ты сам ячейку раскрасить хочешь или использовать дефолтовую раскраску 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 меня несколько смущают. особенно когда я вызываю перерисовку из другого места и мне их просто неоткуда взять.

362
04 октября 2005 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by greyich
ячейка перекрашивается в заданный цвет фона и шрифта. но параметры переданные в DefaultDrawColumnCell меня несколько смущают. особенно когда я вызываю перерисовку из другого места и мне их просто неоткуда взять.



Взять негде это точно. Хотя с колонкой еще можно разобраться, но с прямоугольником сразу непонятно что делать. Пэтому, когда надо перерисовать, оычно вызывают просто Repaint или Refresh и обрабатывают события.

А чем тебя смущают параметры переданные в DefaultDrawColumnCell. Тут видимо происходит следующее: ты устанавиливаешь цвета и заставляешь грид перерисовать ячейку. DefaultDrawColumnCell, похоже, не меняет цвета, а пользуется текущими настройками канвы.

2.1K
04 октября 2005 года
greyich
117 / / 02.02.2005
Цитата:
Originally posted by _kolyan
Взять негде это точно. Хотя с колонкой еще можно разобраться, но с прямоугольником сразу непонятно что делать. Пэтому, когда надо перерисовать, оычно вызывают просто Repaint или Refresh и обрабатывают события.



мне казалось что с помощью DataRect() я смогу получить нужный прямоугольник. или както через координаты курсора мыши?

Цитата:
Originally posted by _kolyan

А чем тебя смущают параметры переданные в DefaultDrawColumnCell. Тут видимо происходит следующее: ты устанавиливаешь цвета и заставляешь грид перерисовать ячейку. DefaultDrawColumnCell, похоже, не меняет цвета, а пользуется текущими настройками канвы.



это точно!

362
04 октября 2005 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by greyich
мне казалось что с помощью DataRect() я смогу получить нужный прямоугольник. или както через координаты курсора мыши?



Что такое DataRect я так сразу и не соображу. А через курсор мыши может и можно. Тут надо смотреть у грида аналог функции ItemAt компонента ListView. Я так понял, ты хочешь подсвечивать ячейки под курсором?

Правда здесь могут быть другие грабли (а могут и не быть, не знаю), может оказаться что канва в гриде не актуальна, пока он не находится в состоянии перерисовки, которое возникает при вызове Repaint. Просто некоторые компоненты рисуются по следующей схеме
c = new TControlCanvas
c.Control = this
рисуем
рисуем
рисуем
delete c

2.1K
04 октября 2005 года
greyich
117 / / 02.02.2005
Цитата:
Originally posted by _kolyan
Что такое DataRect я так сразу и не соображу. А через курсор мыши может и можно. Тут надо смотреть у грида аналог функции ItemAt компонента ListView. Я так понял, ты хочешь подсвечивать ячейки под курсором?



если быть точным то чтобы пользователь мог сам закрашивать ячейки. он щелкает мышкой- вызывается popupmenu там он выбирает пункт закрасить и после выбирает цвет через ColorDialog. а потом мне нужно перекрасить ячейку... :(

362
04 октября 2005 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by greyich
если быть точным то чтобы пользователь мог сам закрашивать ячейки. он щелкает мышкой- вызывается popupmenu там он выбирает пункт закрасить и после выбирает цвет через ColorDialog. а потом мне нужно перекрасить ячейку... :(



Тогда тут точно ничего кроме обработчика событий придумывать не надо. Нужно где-то хранить список закрашенных ячеек и в обработчике сравнивать не есть ли это ячейка та, которая закрашена, ну а дальше обработчик у тебя написан.

А даже если ты определишь прямоугольник под курсором и закрасишь его по клику, то это будет держаться только до первой перерисовки окна, напрмер сверни-разверни окно и ячейка снова не закрашена.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог