Текущий архив: 2004.02.06;
Скачать: CL | DM;
Вниз
Визуальная группировка данных Найти похожие ветки
← →
smu © (2004-01-13 13:33) [0]Уважаемые мастера, столкнулся со следующей задачей: нужно чтобы пользователь отмечал нужные записи в DBGridе, например как в
ВинКоммандере правой кнопкой. Как реализовать сие? Первая мысль добавить поле в таблицу: 0 - запись не отмечена, 1 - отмечена. Может есть другие пути. Кто сталкивался или у кого есть идею какие-нибудь подскажите плиз.
← →
Vlad © (2004-01-13 13:35) [1]Колонка с чекбоксами в гриде не устроит ?
← →
smu © (2004-01-13 13:38) [2]а с таблицей как? поле добавлять все-таки придется?
лучше по моему вариант цветовой отметки записи, это ведь можно реализовать? там че нить вроде GridOnDrawCell...
← →
Vemer © (2004-01-13 13:41) [3]Еще подсветку можно делать.. для визуализации, бледно-зеленую или желтую... тогда можно поле не рисовать, (но его значение менять). Кстати самый простой вариант (кроме булевого) 1 и -1 и умножение на -1 для инвертации (ну нет в IB 6.0 булевых, :))
← →
Vlad © (2004-01-13 13:42) [4]
> smu © (13.01.04 13:38) [2]
Поле добавить скорее всего придется. Можно не в таблицу, а в DataSet.
Есть продвинутый грид (бесплатный) www.ehlib.com
← →
Sandman25 © (2004-01-13 13:44) [5][4] Vlad © (13.01.04 13:42)
Или можно хранить Id выбранных надписей в чем-то другом. В дин. массиве, например.
← →
Sandman25 © (2004-01-13 13:44) [6]В смысле записей, а не надписей.
← →
smu © (2004-01-13 13:46) [7]
> Есть продвинутый грид (бесплатный) www.ehlib.com
менять влом.. гридов уже много..
> Поле добавить скорее всего придется. Можно не в таблицу,
> а в DataSet.
Использую TDbf. Как я понял Dataset -это этот самый TDbf и будет.
Можно ли добавить в него поле не затрагивая физически файлы таблицы?
← →
smu © (2004-01-13 13:51) [8]
> Или можно хранить Id выбранных надписей в чем-то другом.
> В дин. массиве, например.
Натолкнул на мысль... Хранить не Id а создаем array of byte размерностью кол-ва записей... ну и по порядку...
← →
Vlad © (2004-01-13 13:52) [9]>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:58) [10]
> Vlad ©
Спасиб, довольно интересно. На досуге почитаю...
> Или можно хранить Id выбранных надписей в чем-то другом.
> В дин. массиве, например.
Не.. не подходит ... с перерисовкой кутерня получается...
← →
Vlad © (2004-01-13 13:59) [11]
> Не.. не подходит ... с перерисовкой кутерня получается...
Это почему ? :-)
← →
smu © (2004-01-13 14:04) [12]
> Vlad © (13.01.04 13:59) [11]
ну дык каждый раз проверять весь массив, при прорисовке каждой ячейки...
← →
Vlad © (2004-01-13 14:08) [13]
> smu © (13.01.04 14:04) [12]
Во-первых это операция не такая уж "дорогостоящая".
Во вторых можно использовать не дин. массив, а любую другую структуру, напр. TList, можно хоть просто переменную типа string
В третьих не нужно проверять при перерисовке каждой ячейки, а только ячейки из нужного столбца.
← →
smu © (2004-01-13 14:08) [14]а что нужно сделать, чтобы добавить поле не затрагивая файл.
Я так понимаю создаем объект поле, называем его по левому. А что дальше то как в него что-нить записать?
← →
vedmed_ (2004-01-13 15:52) [15]проще всего добавить вычисляемое поле и обрабатывать событие OnCalcFields
← →
smu © (2004-01-13 16:10) [16]
> проще всего добавить вычисляемое поле и обрабатывать событие
> OnCalcFields
а как будет выглядеть пометка записи?
← →
vedmed_ (2004-01-13 17:22) [17]создаем 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
← →
roottim (2004-01-13 17:42) [18]и чего вам всем bookmark-и уже не нравятся...
в гриде
Options->dgMultiSelect
Grid1.SelectedRows
как раз и будут указателями на твои выбранные "строчки"
← →
Johnmen © (2004-01-13 17:45) [19]>roottim
Душа хочет прекрасного. :)
← →
smu © (2004-01-14 08:07) [20]
> vedmed_ (13.01.04 17:22) [17]
Спасиб, попробую.
← →
Sergey13 © (2004-01-14 09:39) [21]Вроде никто не упомянул таблицы в памяти. RxMemoryData например. Очень удобно. Скопировал туда датасет, добавил поле и работай с ним как хочешь. Можно легко настроить реакцию на редактирование.
Страницы: 1 вся ветка
Текущий архив: 2004.02.06;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.019 c