Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.02.17;
Скачать: [xml.tar.bz2];

Вниз

Как отметить строку в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.039 c
2-1201457736
mahab
2008-01-27 21:15
2008.02.17
Запись дисков


15-1200181039
KilkennyCat
2008-01-13 02:37
2008.02.17
Доколе?


15-1200473403
barakuda
2008-01-16 11:50
2008.02.17
Орешник


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


15-1200407003
OSokin
2008-01-15 17:23
2008.02.17
Доки vs форумы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский