![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
параллельное перемещение в двух контролах на форме
normandia © (2004-09-03 10:13:00)Прошу подсказать.
Есть форма. На ней дерево (DB_TreeView) и таблица (DBGrid).
Хотелось бы при перемещении курсора по таблице иметь параллельное перемещение по дереву. А именно, нажатия клавиш и мыши должны обрабатываться обоими элементами.
Видится решение так. После обработки нажатия клавиши или кнопки мыши в таблице эти же события должны передаваться для обработки к дереву.
normandia (2004-09-03 21:42:00) [1]> Amoeba
И у меня проблем не возникло.
Решение с навигацией через id записей самое очевидное.
Все я понимаю. И синхронную навигацию по дереву с использованием id записей ручками могу прописать.
Кстати, я понял, что в моем случае надо решать только через id. Ведь с записи на запись в таблице можно переходить и нажатием мыши, а не только последовательным скроллингом курсорными клавишами. А в этом случае по другому и не выйдет.
Спасибо за внимание.
Просто по ходу дела всплыл вопрос "можно ли событие клавиатуры передать для обработки двум контролам сразу?"
Теперь вопрос стал чисто теоретическим.
Хочу расширить свой кругозор:). Мало ли что пригодится в будущем. Если можно, прошу подсказать, порассуждать на эту тему.
Jeer (2004-09-03 12:08:00) [2]Поскольку TDBTree должна хранить всю таблицу или видимую ее часть, то логичным было бы хранить id и text поля.
Тогда нет проблем с синхронизацией.
Если не хочется связываться с id - тогда GetNextChild у TTreeView
Amoeba (2004-09-03 11:34:00) [3]Что за DB_TreeView используется? Самописный или из готовой библиотеки (типа RaLib/JVcl, VgLib, Polaris)? Во свяком случае у тех компонентов DBTreeView, с которыми мне приходилось иметь дело, таких проблем не возникало.
normandia (2004-09-03 11:20:00) [4]У меня Grid отображает список элементов активной открытой ветви дерева. Причем некоторые из элементов ветви в свою очередь сами могут быть развернуты, при этом таблица будет отображать список содержимого уже этой подветви. При возврате назад надо вернуться в пункт из которого был сделан вход, при этом если путь по дереву длинный, надо помнить id всех пунктов открытой ветви.
А если параллельно с таблицей внутри ветви происходит перемещение по дереву, я всегда узнаю откуда я в подветвь зашел и вернусь обратно туда же.
Списки в дереве и таблице в текущей ветви аналогичны по составу и сортировке, поэтому такое решение кажется удобным.
Jeer (2004-09-03 11:13:00) [5]Можно, но представление данных в Tree и Grid сильно отличается др. от друга.
Как логику перемещений будешь реализовывать ?
Если у тебя были бы два линейных списка, совпадающих по порядку записей - то легко.
А если даже два Грида, но с разными сортировками ?
Как логику отработаешь ?
Поэтому и советую - привязываться по доступу к данным, а не визуальным их представлениям.
normandia (2004-09-03 11:04:00) [6]Но ведь можно как-то программно эмулировать нажатия клавиш и мыши, относящиеся к какому-либо контролу?
Jeer (2004-09-03 11:02:00) [7]Тогда понятно.
Я бы сделал все же на TTable.AfterScroll определение текущей записи по id, а затем поиском по TDBTree
Ну получишь ты событие на перемещение Grid, а далее надо все равно достучаться до Dataset для определения id записи
normandia (2004-09-03 10:57:00) [8]Дело в том, что компонента TDB_TreeView является потомком TTreeView, который не относится к DB-контролам.
Да и вообще интересно:)
Jeer (2004-09-03 10:52:00) [9]Опять не то.
Оставь контролы в покое, если это DB-контролы и работай с Dataset-ами (TTable, TQuery, etc)
normandia (2004-09-03 10:41:00) [10]Тогда самый общий вопрос.
А нельзя передать события после обработки в одном любом контроле для обработки в любой другой?
Jeer (2004-09-03 10:38:00) [11]normandia (03.09.04 10:34) [4]
Пользоваться методами для работы с базами, а не видимыми контролами.
Jeer (2004-09-03 10:35:00) [12]TUser © (03.09.04 10:26) [3]
По меньшей мере, странное решение.
Связать два Dataset как Master-Detail или AfterScroll и Locate по id
normandia (2004-09-03 10:34:00) [13]2 Jeer
Если использовать AfterScroll Dataset-a, то как в нем отдать любое событие клавиатуры или мыши дереву?
2 TUser
Как поймать?
TUser (2004-09-03 10:26:00) [14]Поймай wm_vscroll, wmhscroll у таблицы и пересылай их еще и дереву. Если будешь делать в 2-х направлениях, то предусмотри, чтобы не получитлось бесконечной 'рекурсии'.
Jeer (2004-09-03 10:24:00) [15]AfterScroll Dataset-a
normandia (2004-09-03 10:15:00) [16]В догонку.
Пардон, сам вопрос не задал.
Решение-то видится, но как это сделать не знаю.