Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.17;
Скачать: CL | DM;

Вниз

Как отметить строку в DBGrid ?   Найти похожие ветки 

 
Vov   (2008-01-22 18:27) [0]

Уважаемые знатоки, такая проблема.
Есть НД TQuery, отображаемый в DBGrid. Как сделать так, чтобы при нажатии клавиши "пробел" та строка, на которой стоит указатель таблицы БД, получала / убирала другой цвет фона ?

Знаю длинный путь. После открытия запроса перегнать все данные в аналогичную по структуре TMemoryTable, в которой будет boolean-поле, по которому напишется обработчик OnGetCellParams для TDBGridEh...
К сожалению в данной проге огромный запрос с большим к-вом полей (около 50 шт) разных типов, к тому же открываемый в разных конфигурациях в зависимости от клиента...

Так есть ли путь короче?


 
Плохиш ©   (2008-01-22 18:41) [1]

http://www.citforum.ru/programming/advice/advice04.shtml


 
Vov   (2008-01-22 18:54) [2]

Плохиш ©   (22.01.08 18:41) [1]

Спасибо, но это не совсем то. В данной статье рассматривается возможность вывода строки другим цветом в зависимости от значения какого-либо поля. При этом задействуется обработчик DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
т.е. он выполняется в момент открытия таблицы.

В моем же случае НД уже открыт, редактирование запрещено, а нужно изменять цвет фона строк по нажатию клавиши, т.е. OnKeyPress / ...Down / Up ?? А там нет возможности работать со значениями const Rect: TRect; DataCol: Integer; Column: TColumn.


 
Германн ©   (2008-01-22 18:58) [3]


> При этом задействуется обработчик DBGrid1DrawColumnCell(Sender:
>  TObject; const Rect: TRect; DataCol: Integer; Column: TColumn;
>  State: TGridDrawState);
> т.е. он выполняется в момент открытия таблицы.

Он выполняется всегда, когда это нужно.


 
Семеныч   (2008-01-22 19:04) [4]

> Vov   (22.01.08 18:54) [2]
> в зависимости от значения какого-либо поля.

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


 
Германн ©   (2008-01-22 19:10) [5]


> Надо только подумать, как после нажатия клавиши заставить
> грид обновиться без переоткрытия датасета.
>

Repaint


 
Семеныч   (2008-01-22 19:15) [6]

Думаю, repaint тут не поможет. Я неточно выразился - нужно заставить обновиться не грид, а датасет (или поле). Тогда грид получит сигнал об изменении данных и сам все сделает.

Вообще, способ вряд ли хороший, потому что одной переменной тут не обойтись - ведь нужно запоминать значение поля для каждой записи.


 
MsGuns ©   (2008-01-22 23:49) [7]

>Семеныч   (22.01.08 19:15) [6]
>Тогда грид получит сигнал об изменении данных и сам все сделает.

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


 
Vov   (2008-01-23 00:26) [8]

Германн ©   (22.01.08 18:58) [3]

> Он выполняется всегда, когда это нужно.

... и перерисовывает весь грид (проверил счетчиком в обработчике DBGrid1DrawColumnCell), если вызвать по OnKeyPress метод DBGrid1.Repaint.
А нужно, чтобы только одну запись.

Семеныч   (22.01.08 19:04) [4]

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

Это как раз тот длинный путь, о котором я говорил. И оно работает, но только не с вычисляемым полем, а самым натуральным, которое при изменении заставляет изменяться лишь одну строку грида способом, указанным в OnGetCellParams.

> Надо только подумать, как после нажатия клавиши заставить грид
> обновиться без переоткрытия датасета.

Вот!
Кто подскажет?


 
Германн ©   (2008-01-23 01:11) [9]


> Vov   (23.01.08 00:26) [8]
>
> Германн ©   (22.01.08 18:58) [3]
>
> > Он выполняется всегда, когда это нужно.
>
> ... и перерисовывает весь грид (проверил счетчиком в обработчике
> DBGrid1DrawColumnCell), если вызвать по OnKeyPress метод
> DBGrid1.Repaint.
>


Поскольку ты явно не понимаешь механизма отрисовки окон Виндой намекну, что если> А
> нужно, чтобы только одну запись

то без написания компонента наследника TDBGrid никак не получится.


> > Надо только подумать, как после нажатия клавиши заставить
> грид
> > обновиться без переоткрытия датасета.
>
> Вот!
> Кто подскажет?
>

А никак. Ищи другой путь. Не связанный с изменением датасета.


 
Семеныч   (2008-01-23 02:03) [10]

> MsGuns ©   (22.01.08 23:49) [7]
> Неад только не забыть развести костер и побить в бубен

Извините, но Вам стоит немного лучше изучить VCL. В частности, рекомендовал бы изучить реализацию механизма связи DataSet"ов с DataControl"ами. Если, конечно, Вам это интереснее, чем костер и бубен.

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

> Vov   (23.01.08 00:26) [8]

Допустим, мы ввели вычисляемое поле F. По умолчанию оно False.

В OnKeyPress пишем что-то вроде этого (самоочевидное "if нажат_пробел" и т.п. пропускаю):

DataSet.Edit;
F.AsBoolean := not F.AsBoolean;
DataSet.Post;

Тогда грид обновится (причем сам - MsGuns, обратите внимание!).

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


 
Vov   (2008-01-23 10:32) [11]

Семеныч   (23.01.08 02:03) [10]

Предлагаю внимательно прочитать мой вопрос (самый первый). Там этот путь я сам рассказал:

> Допустим, мы ввели вычисляемое поле F. По умолчанию оно False.

> В OnKeyPress пишем что-то вроде этого
> (самоочевидное "if нажат_пробел" и т.п. пропускаю):

> DataSet.Edit;
> F.AsBoolean := not F.AsBoolean;
> DataSet.Post;

> Тогда грид обновится

Это актуально для таких датасетов, которые дают себя редактировать (не TQuery), и там действительно все так и происходит, очень похоже. Но у меня проблема именно для TQuery, где проверено - calculated поле не подходит для данной задачи.

2 all

Возможно у кого-то есть TDBGrid, наследник стандартного грида, в котором реализована возможность перерисовки одной строки без изменения набора данных, привязанного к такому гриду ?

Поскольку, как заметил Германн ©   (23.01.08 01:11) [9], мы здесь начинающие (по определению) и нам немножко тяжело делать собственные компоненты доступа к БД, наследующие стандартные, да еще без понимания механизма отрисовки окон виндой :)


 
Skyle ©   (2008-01-23 10:59) [12]


> Vov   (23.01.08 10:32) [11]

Ну сохраняй тогда где-нибудь у себя отмеченные записи, а в OnDrawColumnCell отрисовывай. Индикация записи зависит от твоей реальной ситуации (RecNo, Id, ...)


 
Плохиш ©   (2008-01-23 11:14) [13]


> Skyle ©   (23.01.08 10:59) [12]

Судя по всей ветке, то надо было про сохранение сказать, не "записи" а уникальный индекс.. блин, тоже может не понять, "уникальный идентификатор" записи :-)


 
Германн ©   (2008-01-23 14:27) [14]


> 2 all
>
> Возможно у кого-то есть TDBGrid, наследник стандартного
> грида, в котором реализована возможность перерисовки одной
> строки без изменения набора данных, привязанного к такому
> гриду ?
>

Это есть и в TDBGrid и в любом его наследнике и реализуется в OnDrawColumnCell. Других вариантов нет.


 
MsGuns ©   (2008-01-23 14:58) [15]

>Семеныч   (23.01.08 02:03) [10]
>Извините, но Вам стоит немного лучше изучить VCL

Всенепременно.

>В частности, рекомендовал бы изучить реализацию механизма связи DataSet"ов с DataControl"ами.

У Вас очевидно свой VCL. В моем контролы связаны не с датасетом, а с источником данных. А это немножно другое

По сабжу:
Для того, чтобы "насильно" заставить грид перерисоваться, достаточно "прыгуть" из текущей ячейки (точнее, столбца) в любую другую, а затем обратно.


 
Семеныч   (2008-01-24 13:09) [16]

> MsGuns ©   (23.01.08 14:58) [15]

> контролы связаны не с датасетом, а с источником данных.

Это только надводная часть. В действительности, связь контролов с данными существенно более сложная, чем показывает Инспектор Объектов. И если Вы хотите понять, почему и как контролы реагируют на изменение данных (причем без всяких костров и бубнов), то Вам действительно стоит изучить VCL поглубже.



Страницы: 1 вся ветка

Текущий архив: 2008.02.17;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
15-1200473403
barakuda
2008-01-16 11:50
2008.02.17
Орешник


2-1201253052
Bujhm
2008-01-25 12:24
2008.02.17
Свойство компонента


15-1200375005
vajo
2008-01-15 08:30
2008.02.17
Нужна флэшка с функцией защищенной области


15-1200296233
Stilet
2008-01-14 10:37
2008.02.17
Как в VirtualBox настроить виртуальную сеть


15-1200497580
ProgRAMmer Dimonych
2008-01-16 18:33
2008.02.17
Я чего-то недопёр