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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TreeView составление пути к отмеченному итему 
V
    Опции темы
Antony41
Дата 22.4.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Использую RZCheckTree компонент, сделал подобную копию ShellTreeView, только с чекбоксами.

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

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

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

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

Это сообщение отредактировал(а) Antony41 - 22.4.2009, 16:58
PM MAIL   Вверх
Beltar
Дата 22.4.2009, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 7



Это что за компонент такой у которого даже Parent у узлов нету??


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Antony41
Дата 22.4.2009, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Парэнт у узлов есть. как можно реализовать?
PM MAIL   Вверх
Beltar
Дата 22.4.2009, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 7



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


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Keeper89
Дата 22.4.2009, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

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



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

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.


Это сообщение отредактировал(а) Keeper89 - 22.4.2009, 19:34


--------------------
PM MAIL WWW   Вверх
Antony41
Дата 23.4.2009, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо всё прекрасно, но вот еще кое что

Код

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\)

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

Это сообщение отредактировал(а) Antony41 - 23.4.2009, 11:05
PM MAIL   Вверх
Keeper89
Дата 23.4.2009, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

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



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

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

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

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


--------------------
PM MAIL WWW   Вверх
Antony41
Дата 23.4.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



поддиректории сами отмечаются если выбираешь директорию где они находятся.

Например в папке А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\ (если в этой директории все поддиректории отмечены)
PM MAIL   Вверх
Keeper89
Дата 23.4.2009, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

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



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

Это сообщение отредактировал(а) Keeper89 - 23.4.2009, 20:18


--------------------
PM MAIL WWW   Вверх
Antony41
Дата 24.4.2009, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну я так и понял, что нужно проверять дочерние узлы, на состояние отмечен он или нет. 
Пробовал не получалось, завтра еще помучаюсь...
PM MAIL   Вверх
Antony41
Дата 24.4.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Очень всем благодарен всё получилось вот что как должно быть
Код

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;


Это сообщение отредактировал(а) Antony41 - 24.4.2009, 16:51
PM MAIL   Вверх
Keeper89
Дата 25.4.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

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



Поздравляю! Пометь вопрос решенным ;)


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

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

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

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

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


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

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


 




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


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

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