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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Explore Patch по TreeView 
:(
    Опции темы
Чиви Чейс
Дата 28.7.2003, 21:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered












Нужна фукция каторая будет раскрыват TreeView до нужного места
что то типа ExplorePatch(Y:\RED\SER\FEON\):boolean;

Таким макаром в компоненте TreeView раскроет item (с именем 'Y:')
далее в его SubItema'х раскроется 'RED' и тд. до нужного места.
Если последующего итема нет то сответсно result:=false;
  Вверх
p0s0l
Дата 29.7.2003, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



На оптимальность не претендует, но работает...

Код
function ExplorePath(tv : TTreeView; path : string) : boolean;
var
 node : TTreeNode;
 p : integer;
 text1 : string;
begin
 Result := false;
 if tv.Items.Count = 0 then exit;
 node := tv.Items[0];
 repeat
   p := pos('\', path);
   if p = 0 then p := Length(path)+1;
   text1 := copy(path, 1, p-1);
   delete(path, 1, p);

   repeat
     if node.Text = text1 then
     begin
       if path = '' then
       begin // НАШЛИ !!!
         Result := true;
         node.MakeVisible;
         node.Selected := true;
         exit;
       end;
       node := node.getFirstChild;
       break;
     end;
     node := node.getNextSibling;
   until node = nil;

 until node = nil;
end;

Функция ищет node уровня 0 с тектом "Y:", потом у его детей ищет нод с текстом "RED" и т.д.
Может быть тебе надо будет сделать проверку без различий большие/маленькие буквы ?



--------------------
С уважением, г-н Посол.
PM   Вверх
stab
Дата 29.7.2003, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

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



а мне на деревьях ближе рекурсия, хоть объем явно больше и похоже эффективность то ж невысока:

Код


function ExpandPath(path: String; nodes: TTreeNodes): Boolean;
var
 r: Boolean;

function GetRootNodeName(path: String; var newPath: String): String;
var
 sp: Integer;
begin
 sp := Pos('\', path);
 if sp <> 0 then begin
   Result := Copy(path, 1, sp - 1);
   newPath := Copy(path, sp + 1, High(Integer));
 end
 else begin
   if path <> '' then begin
     Result := path;
     newPath := '';
   end
   else begin
     Result := '';
     newPath := '';
   end;
 end;
end;

procedure DoExpand(node: TTreeNode; path: String);
var
 curNode, newPath: String;
begin
 if (node = nil) and (path <> '') then
   r := False
 else begin
   curNode := GetRootNodeName(path, newPath);
   while node <> nil do begin
     if CompareText(node.Text, curNode) = 0 then begin
       node.Expand(False);
       node.Selected := True;
       node.Focused := True;
       if newPath <> '' then
         DoExpand(node.getFirstChild, newPath);
       Break;
     end
     else
       node := node.getNextSibling;
   end;
   if node = nil then r := False;
 end;
end;

begin
 r := True;
 DoExpand(nodes.GetFirstNode, path);
 Result := r;
end;




--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Чиви чейс
Дата 29.7.2003, 23:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Всем спасибо, я думал что сам справлюсь, но ошибался поэтому подвопрос:

А как сделать так чтобы сначала
открылся первый итем у TreeView потом по событию OnExpanded раскрылся следующий и тд.
  Вверх
p0s0l
Дата 29.7.2003, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Тебе чо, надо чтоб дерево полностью раскрылось ? Или как ? Я немного не понял вопрос...



--------------------
С уважением, г-н Посол.
PM   Вверх
чиви чейс
Дата 30.7.2003, 10:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Значит так:

Есть TreeView в нём заголовок одного из итемов 'c:',
а заголовок суб итема этого итема 'tmp'.
Код

+C:
    |
     -TMP


Первый итем находится в состоянии Collapsed;

У первого итема существует суб итем для того что бы по событию OnExpanding (компонента TreeView) можно былобы прочтитать папки диска C:\ и запихнуть их в качестве детей родителя 'c:'

Код

-C:
   |
    +Windows
    +Programs
...




Далее - Есть поле ввода и я хочу сделать так чтобы пособытию происходила последовательность открытия дерева, тоесть :

путь c:\windows\system

обрабатываем первую строчку до символа ' \ ' тоесть ' c: '

делаем
Node.Expand(false);

когда TreeView придёт в состояние Expanded то у родителя с заголовком 'c' уже будут дети (каталоги диска c:\ ), каждый из каторых будет прибывать в состоянии collapsed и будет иметь своего ребенка с заголовком 'tmp'.

По событию OnExpanded следует обработать следующую строчку пути 'Windows' и так далее.
===========================================================

Кароче нужно последовательное открытие пути дерева, с задержкой до события OnExpanded








  Вверх
p0s0l
Дата 30.7.2003, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Для этого тебе надо в моем варианте только и сделать что добавить строку
node.Expand(false);
перед строкой
node := node.getFirstChild;

В варианте cully - сам ищи куда это пихать.

Цитата
У первого итема существует суб итем для того что бы по событию OnExpanding (компонента TreeView) можно былобы прочтитать папки диска C:\ и запихнуть их в качестве детей родителя 'c:'


Не обязательно иметь детей, чтобы можно было раскрывать нод. Нужно сделать
node.HasChildren := true и тогда появится плюсик.

Вот текст OnExpanded:

Код
procedure TForm1.TreeView1Expanded(Sender: TObject; Node: TTreeNode);
var
 sr, sr2 : TSearchRec;
 node1 : TTreeNode;
 path : string;
begin
 path := Node.Text;
 node1 := Node.Parent;
 while node1 <> nil do
 begin
   path := node1.Text + '\' + path;
   node1 := node1.Parent;
 end;

 if FindFirst(path + '\*.*', faAnyFile, sr) = 0 then
 begin
   repeat
     if (sr.Name = '.') or (sr.Name = '..') then continue;
     node1 := TreeView1.Items.AddChild(Node, sr.Name);
     if (sr.Attr and faDirectory) <> 0 then
       if FindFirst(path + '\' + sr.Name + '\*.*', faAnyFile, sr2) = 0 then
       begin
         repeat
           if (sr2.Name <> '.') and (sr2.Name <> '..') then
           begin
             node1.HasChildren := true;
             break;
           end;
         until FindNext(sr2) <> 0;
         FindClose(sr2);
       end;
   until FindNext(sr) <> 0;
   FindClose(sr);
 end;
end;


Тут при добавлении child'а проверяется, есть ли у этого каталога файлы, если есть, то ставится рядом с ним плюсик.
Я не знаю надо ли тебе читать только каталоги, или все - и каталоги и файлы.
В процедурине читаются все файлы. Если надо только каталоги, то замени faAnyFile на faDirectory (в двух строчках).



--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 30.7.2003, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Я тебе немного наврал. Для того чтобы работал способ HasChildren := true, надо юзать не OnExpanded, а OnExpanding.
В конце процедурины OnExpanding поставить:
AllowExpansion := true;



--------------------
С уважением, г-н Посол.
PM   Вверх
Unregistered
Дата 31.7.2003, 14:13 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











P0S0l а как Переименовать Node.Text

Опятьже путь C:\MyFplder\REG

Надо переименовать 'REG' ?

  Вверх
p0s0l
Дата 31.7.2003, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
P0S0l а как Переименовать Node.Text


немного измени функцию ExplorePath на:
function ExplorePath(tv : TTreeView; path : string) : TTreeNode;
и внутри функции перед exit поставь Result := node;

Потом в проге пиши :
ExplorePath(TreeView1, 'C:\MyFolder\REG').Text := 'NewName';

Это сообщение отредактировал(а) p0s0l - 31.7.2003, 19:57


--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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