Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ShellTreeView и SetFocus 
:(
    Опции темы
neweraser
Дата 2.4.2012, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



Здравствуйте. Не могу понять... Мне нужно добавлять папку в директорию и давать пользователю редактировать ее, как все привыкли в обычном проводнике. С showmessage почему-то все замечательно работает, а без них фокус не ставится, либо ставится совсем не туда, либо вылетает ошибка.
Код

  CreateDir(ShellTreeView1.Path +'\123');
  showmessage(ShellTreeView1.Path);
  ShellTreeView1.Path:= ShellTreeView1.Path +'123';
  showmessage(ShellTreeView1.Path);
  ShellTreeView1.SetFocus;
  ShellTreeView1.Selected.EditText;

Ответ должен быть прост, но я уже сломал голову. Спасибо заранее.


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
Ne1tr1n0
Дата 2.4.2012, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 6
Всего: 8



Обновлять список не пробовал?
Так надо чтоб так было?
Код

  CreateDir(ShellTreeView1.Path +'\123');
  ShellTreeView1.Refresh(ShellTreeView1.Selected);
  ShellTreeView1.Path:= IncludeTrailingPathDelimiter(ShellTreeView1.Path) +'123';
  ShellTreeView1.SetFocus;
  ShellTreeView1.Selected.EditText;

PM MAIL   Вверх
Чучмек
Дата 2.4.2012, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



А у меня работает.И без SetFocus работает.


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
neweraser
Дата 2.4.2012, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



Вот эта строчка IncludeTrailingPathDelimiter гораздо лучше того, как я извращался, чтобы не было ошибки с разделителями  smile
Уже намного лучше, но почему-то все равно редактирование не включается, вот после этого
Код

  CreateDir(ShellTreeView1.Path +'\123');
  ShellTreeView1.Refresh(ShellTreeView1.Selected);
  ShellTreeView1.Path:= IncludeTrailingPathDelimiter(ShellTreeView1.Path) +'123';
  ShellTreeView1.SetFocus;
  Showmessage('Не понимаю');
  ShellTreeView1.Selected.EditText;

Все работает как надо) Пробовал вставлять Refresh - ситуация не меняется...

Это сообщение отредактировал(а) neweraser - 2.4.2012, 15:28


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
Ne1tr1n0
Дата 2.4.2012, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 6
Всего: 8



Непонятно, что именно не работает?
Я вот тут набросал по клику на кнопке всё работает, или я что-то неправильно понимаю? Как надо-то?


Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  NewFolder.rar 532,66 Kb
PM MAIL   Вверх
neweraser
Дата 2.4.2012, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



Спасибо, тут совсем по-другому и работает как надо, я без функции делал, по идее все было верно, но загвоздка либо в делфях 7-ки портейбл, либо в моих руках или и в том и другом... если не затруднит, напишешь комментарии к функции? Там что-то много нового для меня. И вообще за день влиться в делфи после года-полтора как-то напряжно  smile Еще раз спасибо, буду дальше разбираться с утра.
И заваливать форум непонятными вопросами  smile 


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
Ne1tr1n0
Дата 3.4.2012, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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 и из-за этого возникает ошибка (вызывается ещё раз процедура создания папки, но она уже переименована, отсюда и ссылка на несуществующий каталог).
Собственно всё.

Да, возможно этот способ несколько костыльный, в идеале надо бы работать непосредственно с объектами оболочки, но работа с ними это отдельная тема для разговора, и если текущий вариант устраивает, то можно оставить и так.
PM MAIL   Вверх
neweraser
Дата 5.4.2012, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



Спасибо, с предыдущей проблемой разобрался, тут еще...
Суть вопроса изменилась, но новая тема имела бы то же самое название, поэтому не стал создавать.
В OnCreate добавляю к ShellTreeView чекбоксы, есть возможность при выделении каких-либо чекбоксов выделять соответствующие строки в treeview и не снимать фокус (или заново восстанавливать) после рефреша?
Вот код:
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  dwStyle: DWord;
begin
  dwStyle:= GetWindowLong(ShellTreeView1.Handle ,GWL_STYLE);
  dwStyle:= dwStyle or TVS_CHECKBOXES;
  SetWindowLong(ShellTreeView1.Handle ,GWL_STYLE,dwStyle);
end;



--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
Ne1tr1n0
Дата 5.4.2012, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 6
Всего: 8



Именно строки выделять? В смысле синим подсвечивать?
Тогда наверное придется писать наследника от ShellTreeView и реализовывать в нем мультиселект, как сделано например в этом компоненте: TSelectableTree
Ну а состояния чекбоксов наверное придется самому хранить где-то и после рефреша восстанавливать их. Вот кстати ещё один потомок от TCustomTreeView, в нем реализована работа с чекбоксами у дерева. Тоже можно взять на вооружение. GSCheckedTreeView
PM MAIL   Вверх
neweraser
Дата 5.4.2012, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



А можно как-то таким способом? 
Код

function TForm1.IsNodeChecked(aNode :TTreeNode): Boolean;
var
  aTVItem: TTVItem;
begin
  with aTVItem do begin
    Mask := TVIF_STATE;
    hItem:= aNode.ItemId;
  end;
  TreeView_GetItem(aNode.TreeView.Handle, aTVItem);
  result:= (aTVItem.State and $2000) = $2000;
end;

...

  TTreeView(ShellTreeView1).MultiSelect:= True;
  for i:=0 to ShellTreeView1.Items.Count-1 do
  if IsNodeChecked(ShellTreeView1.Items[i]) then
  ShellTreeView1.Select(ShellTreeView1.Items[i]); // Вот с этой строчкой путаюсь

...


Наверное, циклом перебирать дерево - не лучший вариант, но мне надо попроще и побыстрее, сроки горят smile


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
Ne1tr1n0
Дата 5.4.2012, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 6
Всего: 8



Ну разве что только не всё дерево обходить, а лишь текущую ноду? Мы ведь только её обновляем, и только у нее чекбоксы сбрасываются...
PM MAIL   Вверх
neweraser
Дата 5.4.2012, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



Согласен, но код все равно не работает. Не подсвечивает синим строки в цикле.. Удерживая control и жмакая лкм в дереве все прекрасно выделяется  smile 


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
Ne1tr1n0
Дата 5.4.2012, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 6
Всего: 8



А так?
Код

procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
begin
for i:=0 to ShellTreeView1.Items.Count-1 do
  if IsNodeChecked(ShellTreeView1.Items[i]) then
    ShellTreeView1.Select(ShellTreeView1.Items[i], [ssCtrl]); // Вот с этой строчкой путаюсь
ShellTreeView1.SetFocus;
end;

PM MAIL   Вверх
neweraser
Дата 5.4.2012, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



Так работает, только почему-то иногда выделяет не все строчки (верхняя не подсвечивается), но это не важно, буду разбираться дальше. Спасибо!


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
Ne1tr1n0
Дата 5.4.2012, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 6
Всего: 8



Возможно по тому, что верхняя строчка уже выделена на тот момент (Это равносильно тому, как если при нажатом Ctrl кликнуть по выделенной ноде - выделение снимется).
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0550 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.