Форум: "Начинающим";
Текущий архив: 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.49 MB
Время: 0.056 c