![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Визуальная группировка данных [D6]
smu © (2004-01-13 13:33:00)
Уважаемые мастера, столкнулся со следующей задачей: нужно чтобы пользователь отмечал нужные записи в DBGridе, например как в
ВинКоммандере правой кнопкой. Как реализовать сие? Первая мысль добавить поле в таблицу: 0 - запись не отмечена, 1 - отмечена. Может есть другие пути. Кто сталкивался или у кого есть идею какие-нибудь подскажите плиз.
Sergey13 (2004-01-14 09:39:00) [1]
Вроде никто не упомянул таблицы в памяти. RxMemoryData например. Очень удобно. Скопировал туда датасет, добавил поле и работай с ним как хочешь. Можно легко настроить реакцию на редактирование.
smu (2004-01-14 08:07:00) [2]
> vedmed_ (13.01.04 17:22) [17]
Спасиб, попробую.
Johnmen (2004-01-13 17:45:00) [3]
>roottim
Душа хочет прекрасного. :)
roottim (2004-01-13 17:42:00) [4]
и чего вам всем bookmark-и уже не нравятся...
в гриде
Options->dgMultiSelect
Grid1.SelectedRowsкак раз и будут указателями на твои выбранные "строчки"
vedmed_ (2004-01-13 17:22:00) [5]
создаем StringList для хранения ID отмеченных записей
...
marked: TStringList;
...
marked := TStringList.Create;
...
для ускорения поиска говорим что строки должны быть отсортированы
...
marked.Sorted := True;
marked.Duplicates := dupError;
...
добавляем в DataSet вычисляемое (Calculated) поле DataSetMarked типа Boolean.
в обработчике события OnCalcFields пишем
DataSetMarked.Value := marked.IndexOf(IntToStr(DataSetID.Value)) >= 0;
где DataSetID - поле первичного ключа
для изменения отметки текущей записи
i := marked.IndexOf(IntToStr(DataSetID.Value));
if i < 0 then
marked.Delete(i)
else
marked.Add(IntToStr(DataSetID.Value));
затем или DataSet.Refresh или Grid.Invalidate
для отображения Boolean поля в виде CheckBox-ов используем OnDrawColumnCell или grid из библиотеки ElLib
вместо StringList лучше использовать hash-таблицы например из xRTL
smu (2004-01-13 16:10:00) [6]
> проще всего добавить вычисляемое поле и обрабатывать событие
> OnCalcFields
а как будет выглядеть пометка записи?
vedmed_ (2004-01-13 15:52:00) [7]
проще всего добавить вычисляемое поле и обрабатывать событие OnCalcFields
smu (2004-01-13 14:08:00) [8]
а что нужно сделать, чтобы добавить поле не затрагивая файл.
Я так понимаю создаем объект поле, называем его по левому. А что дальше то как в него что-нить записать?
Vlad (2004-01-13 14:08:00) [9]
> smu © (13.01.04 14:04) [12]
Во-первых это операция не такая уж "дорогостоящая".
Во вторых можно использовать не дин. массив, а любую другую структуру, напр. TList, можно хоть просто переменную типа string
В третьих не нужно проверять при перерисовке каждойячейки, а только ячейки из нужного столбца.
smu (2004-01-13 14:04:00) [10]
> Vlad © (13.01.04 13:59) [11]
ну дык каждый раз проверять весь массив, при прорисовке каждой ячейки...
Vlad (2004-01-13 13:59:00) [11]
> Не.. не подходит ... с перерисовкой кутерня получается...
Это почему ? :-)
smu (2004-01-13 13:58:00) [12]
> Vlad ©
Спасиб, довольно интересно. На досуге почитаю...
> Или можно хранить Id выбранных надписей в чем-то другом.
> В дин. массиве, например.
Не.. не подходит ... с перерисовкой кутерня получается...
Vlad (2004-01-13 13:52:00) [13]
>Sandman25 © (13.01.04 13:44) [6]
Ну да, структуру для хранения можно любую придумать, но ИМХО, если есть возможность хранить в том же НД, то проще сделать так.
> smu © (13.01.04 13:46) [7]
C TDBF не работал, не знаю. Но подозреваю что можно :-)
Если хочешь сделать со стандартным гридом, то вот пару полезных статей на эту тему.
http://www.delphikingdom.com/helloworld/nogrid.htm
http://www.delphikingdom.com/helloworld/dbgridcolor.htm
smu (2004-01-13 13:51:00) [14]
> Или можно хранить Id выбранных надписей в чем-то другом.
> В дин. массиве, например.
Натолкнул на мысль... Хранить не Id а создаем array of byte размерностью кол-ва записей... ну и по порядку...
smu (2004-01-13 13:46:00) [15]
> Есть продвинутый грид (бесплатный) www.ehlib.com
менять влом.. гридов уже много..
> Поле добавить скорее всего придется. Можно не в таблицу,
> а в DataSet.
Использую TDbf. Как я понял Dataset -это этот самый TDbf и будет.
Можно ли добавить в него поле не затрагивая физически файлы таблицы?
Sandman25 (2004-01-13 13:44:00) [16]
В смысле записей, а не надписей.
Sandman25 (2004-01-13 13:44:00) [17]
[4] Vlad © (13.01.04 13:42)
Или можно хранить Id выбранных надписей в чем-то другом. В дин. массиве, например.
Vlad (2004-01-13 13:42:00) [18]
> smu © (13.01.04 13:38) [2]
Поле добавить скорее всего придется. Можно не в таблицу, а в DataSet.
Есть продвинутый грид (бесплатный) www.ehlib.com
Vemer (2004-01-13 13:41:00) [19]
Еще подсветку можно делать.. для визуализации, бледно-зеленую или желтую... тогда можно поле не рисовать, (но его значение менять). Кстати самый простой вариант (кроме булевого) 1 и -1 и умножение на -1 для инвертации (ну нет в IB 6.0 булевых, :))
smu (2004-01-13 13:38:00) [20]
а с таблицей как? поле добавлять все-таки придется?
лучше по моему вариант цветовой отметки записи, это ведь можно реализовать? там че нить вроде GridOnDrawCell...