Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Визуальная группировка данных [D6]


Страницы:   1 2

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...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо