Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 254

/ вопрос решён /

Приветствую, уважаемые эксперты! Можно ли сделать рекурсивный поиск(может этот поиск уже будет не рекурсивным, а немного иначе), неиспользуя form,методы, procedure, function. В данный вопрос постарайтесь писать исключительно для дела. Я могу не отвечать на вопросы, некасающие самой главной проблемы.

Примечания: 1.поиск по диску C
2.поиск по 3 подпапкам(много не требуется)
3.удовлетворяющий ответ будет хорошо оценен

Кудя Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Кудя (статус: Посетитель)
Вопрос отправлен: 5 мая 2011, 16:43
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Кудя!
Хотя я знаю, как исправить код:) Уровень телепатии зашкаливает, мозг кипит, но решение придумано:)
Не гарантирую, что он заработает, но попробуйте.

uses
  Classes,
  windows,
  System,
  dialogs,
  messages,
  SysUtils;
 
//----------------------------------------------------------------------------
var
  SR: TsearchRec;
  SR2: TsearchRec;
  SR3: TsearchRec;
//-----------------------------------------------------------------------------
begin
  if FindFirst('C:\*',fadirectory,SR)=0 then
    repeat
 
      if ((SR.Attr and faDirectory) <> 0) and (SR.Name <> '..') and (SR.Name <> '.') then begin
        showmessage('1.'+'C:\'+SR.name);
 
        if FindFirst('C:\'+SR.Name+'\*',fadirectory,SR2)=0 then
          repeat
            if ((SR2.Attr and faDirectory) <> 0) and (SR2.Name <> '..') and (SR2.Name <> '.')  then begin
              showmessage('2.'+'C:\'+SR.Name+'\'+SR2.Name);
 
              if FindFirst('C:\'+SR.Name+'\'+SR2.Name+'\*',fadirectory,SR3)=0 then
                repeat
                  if ((SR3.Attr and faDirectory) <> 0) and (SR3.Name <> '..') and (SR3.Name <> '.') then
                    showmessage('3.'+'C:\'+SR.Name+'\'+SR2.Name+'\'+SR3.Name);
                until FindNext(SR3)<>0 ;
                SysUtils.FindClose(SR3);
            end;
          until FindNext(SR2)<>0 ;
          SysUtils.FindClose(SR2);
      end;
    until FindNext(SR)<>0 ;
    SysUtils.FindClose(SR);
end.

Код нужно ещё раз 10 выверить, но идея думаю ясна

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 5 мая 2011, 19:15
Оценка за ответ: 5

Комментарий к оценке: Спасибо большое!

Мини-форум вопроса

Всего сообщений: 39; последнее сообщение — 5 мая 2011, 19:33; участников в обсуждении: 3.

Страницы: [« Предыдущая] [1] [2]

Вадим К

Вадим К (статус: Академик), 5 мая 2011, 18:15 [#21]:

в целом правило такое - сам наследил - сам прибери. Если вызвал FindFirst - вызови FindClose. На каждый.
и с одной и той же "поисковой переменной" не нужно вызвать findFirst подряд, только так
FindFirst(sr);
//чтото делаем
FindClose(sr);
FindFirst(sr);
//чтото делаем
FindClose(sr);

А если будет так
FindFirst(sr);
//чтото делаем
FindFirst(sr);
//чтото делаем
FindClose(sr);
будет 100% бяка.
Галочка "подтверждения прочтения" - вселенское зло.
Кудя

Кудя (статус: Посетитель), 5 мая 2011, 18:32 [#22]:

ПОИСК ПАПОК И ПОДПАПКОК. выглядело примерно так. 3 подпапку почемуто ненаходит=(
program my34program;
uses
  Classes,
  windows,
  System,
  dialogs,
  messages,
  SysUtils;
 
//----------------------------------------------------------------------------
var
  SR: TsearchRec;
  SR2: TsearchRec;
  SR3: TsearchRec;
//-----------------------------------------------------------------------------
begin
            if FindFirst('C:\*',fadirectory,SR)=0 then
repeat
            if (SR.Attr and faDirectory) <> 0 then
            if (SR.Name <> '..') and (SR.Name <> '.') then
            showmessage('1.'+'C:\'+SR.name);
until
            FindNext(SR)<>0 ;
//-----------------------------------------------------------------------------
begin
           if FindFirst('C:\'+SR.Name+'\*',fadirectory,SR2)=0 then
repeat
           if (SR2.Attr and faDirectory) <> 0 then
           if (SR2.Name <> '..') and (SR2.Name <> '.') then
           showmessage('2.'+'C:\'+SR.Name+'\'+SR2.Name);
until
          FindNext(SR2)<>0 ;
//-----------------------------------------------------------------------------
begin
           if FindFirst('C:\'+SR.Name+'\'+SR2.Name+'\*',fadirectory,SR3)=0 then
repeat
           if (SR3.Attr and faDirectory) <> 0 then
           if (SR3.Name <> '..') and (SR3.Name <> '.') then
           showmessage('3.'+'C:\'+SR.Name+'\'+SR2.Name+'\'+SR3.Name);
until
          FindNext(SR3)<>0 ;
          SysUtils.FindClose(SR3);
          SysUtils.FindClose(SR2);
          SysUtils.FindClose(SR);
end;
end;
end.
Think Different. (c)

5 мая 2011, 18:32: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Алгоритмы, преобразования модератором Ерёмин А.А.

min@y™

min@y™ (статус: Доктор наук), 5 мая 2011, 18:39 [#23]:

Жуть какая.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 5 мая 2011, 18:39 [#24]:

Этот код не будет работать.
когда FindFirst вызывается второй раз, значение переменной SR.Name неопределенно.
В какой именно папке должен начать искать второй FindFirst?
Галочка "подтверждения прочтения" - вселенское зло.
Кудя

Кудя (статус: Посетитель), 5 мая 2011, 18:43 [#25]:

Ну как тогда????
Think Different. (c)
Вадим К

Вадим К (статус: Академик), 5 мая 2011, 18:44 [#26]:

этого я не знаю, пока не ответите на вопрос

Цитата (Вадим К):

В какой именно папке должен начать искать второй FindFirst?
Галочка "подтверждения прочтения" - вселенское зло.
Кудя

Кудя (статус: Посетитель), 5 мая 2011, 18:46 [#27]:

2 findfirst должен начать с папки результата первого findfirst(вот диск C:\ 1findfirst нашёл папку 1, и 2findfirst должен искать так: C:\1\ третий, например так: C:\1\2\;)
Think Different. (c)
Вадим К

Вадим К (статус: Академик), 5 мая 2011, 18:47 [#28]:

но ведь первый findfirst может найти несколько каталогов. как быть?
Галочка "подтверждения прочтения" - вселенское зло.
Кудя

Кудя (статус: Посетитель), 5 мая 2011, 18:47 [#29]:

незапланированный смайлик, как то сам сделался, извините
Think Different. (c)
Кудя

Кудя (статус: Посетитель), 5 мая 2011, 18:48 [#30]:

сам не знаю как быть=(
Поэтому к экспертам и обращаюсь
Think Different. (c)
min@y™

min@y™ (статус: Доктор наук), 5 мая 2011, 18:50 [#31]:

Цитата (Кудя):

сам не знаю как быть=(

Да делай ты через рекурсию, задолбал.
Сдаётся мне, в прошлой жизни ты был комсомольцем.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Кудя

Кудя (статус: Посетитель), 5 мая 2011, 18:53 [#32]:

как? Я могу это сделать, но требования моего вопроса запрещают
Think Different. (c)
min@y™

min@y™ (статус: Доктор наук), 5 мая 2011, 18:59 [#33]:

Цитата (Кудя):

как? Я могу это сделать, но требования моего вопроса запрещают

Да забудь ты про этот вопрос и живи спокойно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 5 мая 2011, 19:03 [#34]:

Хотя я знаю, как исправить код:) Уровень телепатии зашкаливает, мозг кипит, но решение придумано:)
Не гарантирую, что он заработает, но попробуйте.
uses
  Classes,
  windows,
  System,
  dialogs,
  messages,
  SysUtils;
 
//----------------------------------------------------------------------------
var
  SR: TsearchRec;
  SR2: TsearchRec;
  SR3: TsearchRec;
//-----------------------------------------------------------------------------
begin
  if FindFirst('C:\*',fadirectory,SR)=0 then
    repeat
 
      if ((SR.Attr and faDirectory) <> 0) and (SR.Name <> '..') and (SR.Name <> '.') then begin
        showmessage('1.'+'C:\'+SR.name);
 
        if FindFirst('C:\'+SR.Name+'\*',fadirectory,SR2)=0 then
          repeat
            if ((SR2.Attr and faDirectory) <> 0) and (SR2.Name <> '..') and (SR2.Name <> '.')  then begin
              showmessage('2.'+'C:\'+SR.Name+'\'+SR2.Name);
 
              if FindFirst('C:\'+SR.Name+'\'+SR2.Name+'\*',fadirectory,SR3)=0 then
                repeat
                  if ((SR3.Attr and faDirectory) <> 0) and (SR3.Name <> '..') and (SR3.Name <> '.') then
                    showmessage('3.'+'C:\'+SR.Name+'\'+SR2.Name+'\'+SR3.Name);
                until FindNext(SR3)<>0 ;
                SysUtils.FindClose(SR3);
            end;
          until FindNext(SR2)<>0 ;
          SysUtils.FindClose(SR2);
      end;
    until FindNext(SR)<>0 ;
    SysUtils.FindClose(SR);
end.

Код нужно ещё раз 10 выверить, но идея думаю ясна
Галочка "подтверждения прочтения" - вселенское зло.
Кудя

Кудя (статус: Посетитель), 5 мая 2011, 19:13 [#35]:

я делал почти тоже самое!!!!!! Правда непомню, что отличает ваш пример от моего давнешнего. Но мысль такаяже. И у меня не получилось, я был совсем близок к цели, я считай смог, но что-то было не то. Спасибо большое Вадик К, программа заработала, я счастлив =) Так, я бы тебе +10 к рейтингу сделал, но тут похожу +1 к рэйтингу за одно соопщение. Тут можно за каждое соопщение +1 к рэйтингу сделать? Не забанят?
Think Different. (c)
Вадим К

Вадим К (статус: Академик), 5 мая 2011, 19:16 [#36]:

можно просто поставить оценку за ответ.
А теперь мораль. как только экспертам начинают отвечать на их уточняющие вопросы - так сразу и обрисовывается решение:)
Галочка "подтверждения прочтения" - вселенское зло.
Кудя

Кудя (статус: Посетитель), 5 мая 2011, 19:19 [#37]:

Истинная правда
Think Different. (c)
Кудя

Кудя (статус: Посетитель), 5 мая 2011, 19:21 [#38]:

оценка за ответ, там тока 5 поставить можна, ну хотябы
Think Different. (c)

5 мая 2011, 19:29: Статус вопроса изменён на решённый (изменил автор вопроса — Кудя)

min@y™

min@y™ (статус: Доктор наук), 5 мая 2011, 19:33 [#39]:

Хотелось бы теперь узнать, как ты будешь применять свеженаписанную прогу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Страницы: [« Предыдущая] [1] [2]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 апреля 2026, 22:05
Выполнено за 0.04 сек.