![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| neweraser |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 17.2.2008 Репутация: нет Всего: 6 |
Здравствуйте. Не могу понять... Мне нужно добавлять папку в директорию и давать пользователю редактировать ее, как все привыкли в обычном проводнике. С showmessage почему-то все замечательно работает, а без них фокус не ставится, либо ставится совсем не туда, либо вылетает ошибка.
Ответ должен быть прост, но я уже сломал голову. Спасибо заранее. -------------------- Кто ищет, тот всегда найдет. |
|||
|
||||
| Ne1tr1n0 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 1.3.2009 Репутация: 6 Всего: 8 |
Обновлять список не пробовал?
Так надо чтоб так было?
|
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
А у меня работает.И без SetFocus работает.
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| neweraser |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 17.2.2008 Репутация: нет Всего: 6 |
Вот эта строчка IncludeTrailingPathDelimiter гораздо лучше того, как я извращался, чтобы не было ошибки с разделителями
Уже намного лучше, но почему-то все равно редактирование не включается, вот после этого
Все работает как надо) Пробовал вставлять Refresh - ситуация не меняется... Это сообщение отредактировал(а) neweraser - 2.4.2012, 15:28 -------------------- Кто ищет, тот всегда найдет. |
|||
|
||||
| Ne1tr1n0 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 1.3.2009 Репутация: 6 Всего: 8 |
Непонятно, что именно не работает?
Я вот тут набросал по клику на кнопке всё работает, или я что-то неправильно понимаю? Как надо-то? Присоединённый файл ( Кол-во скачиваний: 12 )
NewFolder.rar 532,66 Kb |
|||
|
||||
| neweraser |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 17.2.2008 Репутация: нет Всего: 6 |
Спасибо, тут совсем по-другому и работает как надо, я без функции делал, по идее все было верно, но загвоздка либо в делфях 7-ки портейбл, либо в моих руках или и в том и другом... если не затруднит, напишешь комментарии к функции? Там что-то много нового для меня. И вообще за день влиться в делфи после года-полтора как-то напряжно
И заваливать форум непонятными вопросами -------------------- Кто ищет, тот всегда найдет. |
|||
|
||||
| Ne1tr1n0 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 1.3.2009 Репутация: 6 Всего: 8 |
Ну не сказал бы что совсем по другому, просто разные объекты пространства имен оболочки могут частично ссылаться на одни и те же объекты файловой системы. Так корневой объект Shell Namespace'a Desktop (рабочий стол) частично содержит дочерние элементы физической папки C:\Users\<User>\Desktop, для которой тоже есть объект оболочки. ShellTreeView он на то и Shell* что отображает иерархию объектов оболочки. При этом если создать папку на рабочем столе, то она появится дочерним элементом как у одного объекта, так и у другого. Собственно у меня обновляется тот узел дерева, который выделен, поэтому создается впечатление, что папка появляется именно там, где нужно. Функция FindNodeWithText взята из недр DelphiWorld'a находит новую созданную папку (перебирает дочерние элементы узла TreeView и при совпадении имен возвращает ссылку на этот узел), и мы выделяем её для редактирования имени.
При этом первый If на случай если выделенный узел в TreeView является виртуальной папкой (Сетевое окружение, Мой компьютер, Панель управления и т.д.), то в этих папках CreateDir по понятным причинам не отработает. Соответственно и выделять нечего. SetFocus на TreeView нужен, потому что редактирование имени папки в TreeView как правило завершается нажатием Enter, но без SetFocus'a его принимает Button и из-за этого возникает ошибка (вызывается ещё раз процедура создания папки, но она уже переименована, отсюда и ссылка на несуществующий каталог). Собственно всё. Да, возможно этот способ несколько костыльный, в идеале надо бы работать непосредственно с объектами оболочки, но работа с ними это отдельная тема для разговора, и если текущий вариант устраивает, то можно оставить и так. |
|||
|
||||
| neweraser |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 17.2.2008 Репутация: нет Всего: 6 |
Спасибо, с предыдущей проблемой разобрался, тут еще...
Суть вопроса изменилась, но новая тема имела бы то же самое название, поэтому не стал создавать. В OnCreate добавляю к ShellTreeView чекбоксы, есть возможность при выделении каких-либо чекбоксов выделять соответствующие строки в treeview и не снимать фокус (или заново восстанавливать) после рефреша? Вот код:
-------------------- Кто ищет, тот всегда найдет. |
|||
|
||||
| Ne1tr1n0 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 1.3.2009 Репутация: 6 Всего: 8 |
Именно строки выделять? В смысле синим подсвечивать?
Тогда наверное придется писать наследника от ShellTreeView и реализовывать в нем мультиселект, как сделано например в этом компоненте: TSelectableTree Ну а состояния чекбоксов наверное придется самому хранить где-то и после рефреша восстанавливать их. Вот кстати ещё один потомок от TCustomTreeView, в нем реализована работа с чекбоксами у дерева. Тоже можно взять на вооружение. GSCheckedTreeView |
|||
|
||||
| neweraser |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 17.2.2008 Репутация: нет Всего: 6 |
А можно как-то таким способом?
Наверное, циклом перебирать дерево - не лучший вариант, но мне надо попроще и побыстрее, сроки горят -------------------- Кто ищет, тот всегда найдет. |
|||
|
||||
| Ne1tr1n0 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 1.3.2009 Репутация: 6 Всего: 8 |
Ну разве что только не всё дерево обходить, а лишь текущую ноду? Мы ведь только её обновляем, и только у нее чекбоксы сбрасываются...
|
|||
|
||||
| neweraser |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 17.2.2008 Репутация: нет Всего: 6 |
Согласен, но код все равно не работает. Не подсвечивает синим строки в цикле.. Удерживая control и жмакая лкм в дереве все прекрасно выделяется
-------------------- Кто ищет, тот всегда найдет. |
|||
|
||||
| Ne1tr1n0 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 1.3.2009 Репутация: 6 Всего: 8 |
А так?
|
|||
|
||||
| neweraser |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 17.2.2008 Репутация: нет Всего: 6 |
Так работает, только почему-то иногда выделяет не все строчки (верхняя не подсвечивается), но это не важно, буду разбираться дальше. Спасибо!
-------------------- Кто ищет, тот всегда найдет. |
|||
|
||||
| Ne1tr1n0 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 1.3.2009 Репутация: 6 Всего: 8 |
Возможно по тому, что верхняя строчка уже выделена на тот момент (Это равносильно тому, как если при нажатом Ctrl кликнуть по выделенной ноде - выделение снимется).
|
|||
|
||||
| neweraser |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 17.2.2008 Репутация: нет Всего: 6 |
Да, надо как-то убирать фокус перед обновлением по клику на ShellTreeView. Может к вечеру начнет голова соображать..
зы. во тему раздул... -------------------- Кто ищет, тот всегда найдет. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |