Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TreeView составление пути к отмеченному итему


Автор: Antony41 22.4.2009, 16:53
Использую RZCheckTree компонент, сделал подобную копию ShellTreeView, только с чекбоксами.

Пользователь должен отметить какой нибудь путь по выбору например

- C:\
   |_- Downloads
   |    |_Musik (поставил галочку тут)
   |_  |_Progi
   |_- Games
        |_Quake(и тут)
+D:\
+E:\

Как можно раскопать полный путь к отмеченному итемам
соответственно через цикл от 0 to Items.count-1

PS Заколебался рисовать smile 

Автор: Beltar 22.4.2009, 17:50
Это что за компонент такой у которого даже Parent у узлов нету??

Автор: Antony41 22.4.2009, 18:19
Парэнт у узлов есть. как можно реализовать?

Автор: Beltar 22.4.2009, 19:00
По родителям подниматься наверх, начиная с выбранных. Если хочешь начать сверху, то начинаешь с первого, заносишь его путь и сам узел в стек, берешь его первый дочерный, добавляешь его в стек и так пока не дойдешь до конечного. Выводишь получившийся путь, в стек не ложишь, смотришь следующий узел, если он есть, если он не конечный, то опять в стек, если ветка кончилась, выталкиваешь ее и помещаешь  в стек начало соседней ветки.

Автор: Keeper89 22.4.2009, 19:29
Короче говоря, вам надо организовать какой-то такой цикл (конкретных методов и св-в у вашего компонента не знаю):
Код

const
  SEP = '\';
var
  Path: String;
  myNode: TTreeNode;
begin
  Path := '';
  myNode := RZCheckTree.Selected;
  while myNode <> Nil do
  begin
    Path := Path + myNode.Text + SEP;
    myNode := myNode.Parent;
  end;
  Showmessage(Path);
end.

Автор: Antony41 23.4.2009, 11:01
Спасибо всё прекрасно, но вот еще кое что

Код

procedure TForm1.BitBtn1Click(Sender: TObject);
var
I:Integer;
FParent: TTreeNode;
FResult:string;
begin
with TreeView1 do
   for I:=Items.Count-1 downto 0 do
      if Items.Item[I].StateIndex=2 then //(Если галочка стоит)
         begin
         Fparent:=Items.Item[I];
         while FParent<>nil do
            begin
            FResult:=FParent.Text+'\'+FResult;
            Fparent:=Fparent.Parent;
         end;
Showmessage(FResult);
end;
end;


Нужно составить запрос для Поиска файлов. (указать ему путь для поиска)
если директория на уровень выше отмечена, то соответственно все остальные дирректории, входящие должны включаться сами уже поиском.

-  С:
    |_- (v) Downloads (Если тут выделяю, то входящие папки, не должны включаться в результат) результат должен быть  такой C:\Downloads\
    |           |_Musik
    |           |_Archives
    |           |_Video
    |
    |_- (>) Games
                |_(x)Quake
                |_(v)Quake2  (А тут такой C:\Games\Quake2\)
                |_(x)Quake3
+ D:
+ E:

В конце цикла после добавлений результатов в строку запроса для поиска (C:\Downloads\; C:\Games\Quake2\)

Что то не получается у меня по парентам вычислить где какой должен выводится результат

Автор: Keeper89 23.4.2009, 13:17
Цитата(Antony41 @  23.4.2009,  11:01 Найти цитируемый пост)
Нужно составить запрос для Поиска файлов. (указать ему путь для поиска)
если директория на уровень выше отмечена, то соответственно все остальные дирректории, входящие должны включаться сами уже поиском.

Здесь вы говорите, что должны включаться...
Цитата(Antony41 @  23.4.2009,  11:01 Найти цитируемый пост)
Если тут выделяю, то входящие папки, не должны включаться в результат

а здесь уже нет.

Насколько я понял, нужно отмечать галочкой все поддиректории того узла, который отмечен, так или нет?

Автор: Antony41 23.4.2009, 18:04
поддиректории сами отмечаются если выбираешь директорию где они находятся.

Например в папке А1 находятся 3 поддиректории Если отмечена например С1 уже отмечена, и я нажму  на А1, то автоматически
отметятся все поддиректории B1, C1, D1.

С:\A1\B1\
C:\A1\C1\
C:\A1\D1\

Как ты понял уже работает. Я использую цикл и записываю пути в FResult(смотри код выше)
Если директория А1 отмечена (все поддиректории соответственно тоже отмечаются сами именно так как ты понял), а вот в

FResult записывается вот так С:\A1\B1\;C:\A1\C1\;C:\A1\D1\, а надо просто С:\A1\ (если в этой директории все поддиректории отмечены)

Автор: Keeper89 23.4.2009, 20:14
Ну пробегись в цикле по дочерним узлам: если все дочерние узлы для конкретной папки отмечены, не вноси их в Резалт.

Автор: Antony41 24.4.2009, 00:33
Ну я так и понял, что нужно проверять дочерние узлы, на состояние отмечен он или нет. 
Пробовал не получалось, завтра еще помучаюсь...

Автор: Antony41 24.4.2009, 15:52
Очень всем благодарен всё получилось вот что как должно быть
Код

procedure TForm1.sBitBtn1Click(Sender: TObject);
var
I:Integer;
FParent: TTreeNode;
FResult:string;
SL:TStringList;
begin
SL:=TStringList.Create;
with TreeView1 do
   for I:=Items.Count-1 downto 0 do
      if Items.Item[I].StateIndex=2 then
         if Items.Item[I].Parent<>nil then
            if Items.Item[I].Parent.StateIndex=3 then
            begin
               FResult:='';
               Fparent:=Items.Item[I];
               while FParent<>nil do
                  begin
                  FResult:=FParent.Text+'\'+FResult;
                  FParent:=FParent.Parent;
                  end;
               SL.Add(FResult);
            end
               else
         else
            if Items.Item[I]<>nil then
               SL.Add(Items.Item[I].Text+'\');

FResult:='';
for I:=SL.Count-1 downto 0 do
   FResult:=FResult+SL.Strings[i]+#13#10;
   ShowMessage(FResult);

SL.Destroy;
end;

Автор: Keeper89 25.4.2009, 19:48
Поздравляю! Пометь вопрос решенным ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)