Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2010, 15:12   #1
Sensizu
Otsukitakitte
Форумчанин
 
Аватар для Sensizu
 
Регистрация: 01.10.2009
Сообщений: 126
Восклицание Построение цикла

Доброго времени суток.
Начал официально, так как проблема довольно весомая для меня, и довольно трудная (также всё еще для меня).
Задача: построить цикл заполнения TreeView с помощью Direcoty List (отображаем папки в директории) и FileListBox (отображаем файлы в директории). Я уже писал на форум с этой проблемой, но понять её с середины сути - всё-равно что начать смотреть сериал с сотой серии. Потому решил обратится за помощью создания всего цикла заново, на основе того, что у меня есть.

Общий алгоритм цикла:
1. Запускается наш OpenDialog (далее просто OD). Добавляем главную папку stree.item.addFirst(nil, OD.FileName).
2. Нашему DirectoryList (далее dr) делаем следующее: dr.directory:=OD.FileName. Теперь получаем папки вложенные в нашу открытую директорию, и добавляем их в первый узел TreeView.
3. Теперь присваиваем FileListBox (далее rzBox) rzBox.ApplyFilePath(OD.FileName). Таким образом мы получаем файлы, находящиеся именно в открытой нами директории. Добавляем с помощью stree.Item.AddChild(stree.item.item[0], rzBox.Items[rzBox.ItemIndex]); Тут снова работает цикл, т.к. файлов может быть несколько.
4. Далее, с помощью цикла мы заходим в каждую вложенную в OD.FileName директорию папку (которые добавили в шаге 2) и проверяем на наличие в них файлов. Если файлы есть - снова циклом добавляем, только уже в директорию вложенную в OD.FileName. И так циклом с каждой дочерней папкой нашей главной директории.
Это основные 4 шага, которые должен сделать цикл при открытии документа. Вот мой код, который работает, но шаг 3 не выполняется (он выполняется, но чудесное окно ошибки о потере индекса мешает мне):
Код:
  // загружаем открытую директорию в список файлов:
  RzBox.ApplyFilePath(OD.FileName);
  // загружаем туже директорию в список папок:
  dr.Directory:=OD.FileName;

  // добавляем первый, основной айтим в дерево:
  stree.Items.AddFirst(nil,rzBox.Directory);
  stree.Items.Item[0].ImageIndex:=1;
  stree.Items.Item[0].SelectedIndex:=1;
  // ставим позицию файлового списка на самый первый элемент:
  rzBox.ItemIndex:=0;

  // циклично добавляем папки в главный узел (айтим)
for i:=1 to dr.Count-dr.ItemIndex do
    begin
    r:=stree.Items.AddChildFirst(stree.Items[0],dr.Items[dr.ItemIndex]);
    r.Selected:=True;
    r.ImageIndex:=1;
    r.SelectedIndex:=1;  

    // получаем путь именно добавляемой на данный момент папки, и 
    // открываем этот путь в список файлов. Если файлы есть - добавляем 
    rzBox.ApplyFilePath(stree.Items.Item[0].Text+'\'+dr.Items[dr.ItemIndex]+'\');
    rzBox.ItemIndex:=0;
    if rzBox.items.Count<>0 then
    begin
    for ii:=0 to rzBox.Items.Count do
    begin
    x:=stree.Items.AddChild(stree.Items.Item[0], dr.Items[dr.ItemIndex]+'\'+rzBox.Items[rzBox.ItemIndex]);
    x.Selected:=True; x.ImageIndex:=0; x.SelectedIndex:=0;
    rzBox.ItemIndex:=rzBox.ItemIndex+1;
    end;
    end else rzBox.Refresh;
    dr.ItemIndex:=dr.ItemIndex+1;
  end;

  // теперь, добавляем файлы, лежащие непосредственно в директории
  // OD.FileName
rzBox.ApplyFilePath(OD.FileName); rzBox.Update;
  rzBox.ItemIndex:=0;
  for i:=1 to rzBox.items.count do
  begin
    x:=stree.Items.AddChild(stree.Items.Item[0], rzBox.items[rzbox.itemindex]);
    x.selected:=true; x.imageindex:=0; x.selectedindex:=0;
    rzBox.itemIndex:=rzBox.itemIndex+1;
  end;
Проблема с шагом 2. Только с дочерними папками, вернее файлами в них.
Очень прошу помочь. Я еще не до конца осознал всю сущность работы с TreeView, потому индексы и правильные позиции для меня сложная вещь. Заранее большое спасибо!
Помог - ставь плюс.
$("question").onAnswer(function() { $(this).getItWright(true); });

Последний раз редактировалось Sensizu; 18.06.2010 в 15:14.
Sensizu вне форума Ответить с цитированием
Старый 18.06.2010, 15:23   #2
ex.cluz
Участник клуба
 
Аватар для ex.cluz
 
Регистрация: 15.01.2010
Сообщений: 1,325
По умолчанию

Пока конкретных рецептов нет, но есть предложение по оптимизации (что вообще-то говоря сейчас глупо, с неработающим кодом ), но тем не менее, в расчете на будущее:
Если файлов действительно много, то прога будет "висеть". Я бы только первую "ступень" показывал сразу, а остальную индексацию в отдельный поток повесил с небольшим приоритетом.
Грибы - они разные. Один тебя накормит, другой тебе кино покажет...
Редактор журнала "
[ПРОграммист]"
Yan's Home Digital Lab
ex.cluz вне форума Ответить с цитированием
Старый 18.06.2010, 15:33   #3
Sensizu
Otsukitakitte
Форумчанин
 
Аватар для Sensizu
 
Регистрация: 01.10.2009
Сообщений: 126
По умолчанию

ex.cluz, код рабочий на 100%. У меня проблема в описанном мною шаге 2 (когда файлы из дочерних папок добавляются в список в нужный индекс). Я не могу правильно указать этот индекс.

P.S. Здесь циклы элементарные. Тестирую - комп даже не думает зависать. Если будет такая проблема - как устранить - я пойму. Сейчас мне главное правильно цикл построить. Может я местами путаю последние два цикла. Без понятия...
Помог - ставь плюс.
$("question").onAnswer(function() { $(this).getItWright(true); });

Последний раз редактировалось Sensizu; 18.06.2010 в 15:38.
Sensizu вне форума Ответить с цитированием
Старый 18.06.2010, 15:56   #4
ex.cluz
Участник клуба
 
Аватар для ex.cluz
 
Регистрация: 15.01.2010
Сообщений: 1,325
По умолчанию

Да, по поводу оптимизации - скорее всего вы правы. Я похожую работу года 3 назад делал. И нужно было обрабатывать большое число файлов (порядка десятка тысяч) и плюс к этому комп был не самый производительный (даже по тем временам). Так что, может, я и глупость в качестве совета написал (хотя надо бы проверить).

С индексами тут напутано, надо разбираться...Приду домой - попробую.
Грибы - они разные. Один тебя накормит, другой тебе кино покажет...
Редактор журнала "
[ПРОграммист]"
Yan's Home Digital Lab

Последний раз редактировалось ex.cluz; 18.06.2010 в 16:06.
ex.cluz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
операторы цикла pilot76 Помощь студентам 4 10.09.2009 19:08
Переход от цикла к циклу не выходя из цикла (без multithreading) Qousio Общие вопросы C/C++ 2 16.05.2009 09:27
Операторы цикла. Paul Oakenfold Паскаль, Turbo Pascal, PascalABC.NET 4 14.04.2009 20:07
Операторы цикла Paul Oakenfold Паскаль, Turbo Pascal, PascalABC.NET 4 14.04.2009 19:28
Оператор цикла с предусловием While. Оператор цикла с пост условием Repeat McMilin Помощь студентам 7 11.11.2007 14:10