| 
| 
 | Вопрос # 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, 17:02 [#1]:пункт 2 - подпапки всегда одни и те же? пункт 3 - если оценка за ответ будет 100 балов - берусь
   Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 5 мая 2011, 17:05 [#2]: Цитата (Кудя): неиспользуя form,методы, procedure, function Я тебя правильно понял: тебе нужно в самом теле программы сделать рекурсивный поиск файлов, не используя никакие подпрограммы?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Кудя (статус: Посетитель), 5 мая 2011, 17:11 [#3]:Вадик К: подпапки могут быть разными min@y™: правильно понял
 Think Different. (c) |  
|   | Вадим К (статус: Академик), 5 мая 2011, 17:15 [#4]:и глубина произвольная? Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Кудя (статус: Посетитель), 5 мая 2011, 17:16 [#5]:см. примечание 2. 
 Просто, когда вы мне покажите\посоветуете\подталкнёте на верную мысль я сам смогу решить, сколько подпапок перебрать программе.
 Think Different. (c) |  
|   | Вадим К (статус: Академик), 5 мая 2011, 17:23 [#6]:поиск по трем подпапкам? это глубина одно вложение. в данном случае правильным решением будет просто запустить find . -name "name" через WinExec, но у тебя одна проблема - не та операционная система.
 Ты можешь нагородить свой стек. Но это тоже печально и муторно.
 У меня есть ещё с десяток идей, как это можно сделать, но к сожалению, они для Вас не под силу.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Кудя (статус: Посетитель), 5 мая 2011, 17:27 [#7]:Я не такой глупый, как кажусь на первый взгляд, я стремлюсь получше познать delphi. Мне нужна одна ваша идея, но только она должна работать. Даже если я немного непойму её, я всё равно её изучу, мне самому веть интересно. Прошу вас, поделитесь идеей Think Different. (c) |  
|   | Вадим К (статус: Академик), 5 мая 2011, 17:29 [#8]:приложение будет запускать само себя с параметром, который равный каталогу для поиска. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Кудя (статус: Посетитель), 5 мая 2011, 17:37 [#9]:Уххтыы. А у вас есть пример этого кода? Think Different. (c) |  
|   | Вадим К (статус: Академик), 5 мая 2011, 17:40 [#10]:Пример будет только после того, как обосновано расскажите зачем это нужно. Если нет - будет считать вопрос глупым и закроем. Ответ типа "мне интересно", "препод задал", "поспорил с друзьями" и подобные не принимается.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Кудя (статус: Посетитель), 5 мая 2011, 17:46 [#11]:Блин. Мне 14 лет, я люблю писать на делфи, я много всего пробывал, перед тем как я вам задал вопрос, я много мучался, я пытался сделать поиск в ручную, но у меня была проблема: после until FindNext(SR)<>0 ;
 SysUtils.FindClose(SR);
 значение поисковой переменной резко меняется, и поэтому дальше поиск не шёл, я с психики переудалял всё, теперь пытаюсь что-нибудь другое, уже как месяц голосу ломаю. на самом деле мне интересно. Ну ладно, простите что теряю ваше время, буду искать дальше. Удачи.
 Think Different. (c) |  
|   | Вадим К (статус: Академик), 5 мая 2011, 17:50 [#12]: Цитата (Кудя): значение поисковой переменной резко меняется Так это же правильное, поведение! если мы закрываем поиск, то какой смысл его делать дальше? а после закрытия значения переменной неопределенно. то есть там может быть что угодно.
 
 Примеров поиска тут было уже на форуме куча. И пример от min@y™ вполне себе был очень хорош для изучения.
 
 Я рекомендую начать с простых примеров. А потом заняться извращениями.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Кудя (статус: Посетитель), 5 мая 2011, 17:54 [#13]:А если убрать FindClose, то значение переменной останется? И прога небудет ругаться? Think Different. (c) |  
|   | Вадим К (статус: Академик), 5 мая 2011, 18:01 [#14]:Покажите код. В общем - лучше findClose не убирать - чревато ошибками.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Кудя (статус: Посетитель), 5 мая 2011, 18:03 [#15]:с психики я удалил проект, если вы подождёте минут 30, я его заново напишу Think Different. (c) |  
|   | min@y™ (статус: Доктор наук), 5 мая 2011, 18:04 [#16]: Цитата (Кудя): А если убрать FindClose, то значение переменной останется? И прога небудет ругаться?  Ругаться не будет, но будет утечка памяти. И мне интересно, как ты эту переменную будешь использовать дальше, даже без FindClose()?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Кудя (статус: Посетитель), 5 мая 2011, 18:07 [#17]:ну в самом самом конце программы я напишу findclose, если это надо Think Different. (c) |  
|   | Вадим К (статус: Академик), 5 мая 2011, 18:08 [#18]: Цитата (Кудя): с психики я удалил проект психовать не стоит. нервы ведь не железные. Хороший программист должен иметь железные нервы и быть спокойным как стена или танк (как минимум). любые проблемы в коде его не должны выводить из себя.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 5 мая 2011, 18:13 [#19]: Цитата (Кудя): ну в самом самом конце программы я напишу findclose, если это надо Это ты зря. Память-то выделяет функция FindFirst(). А её-то ты будешь вызывать несколько раз. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Кудя (статус: Посетитель), 5 мая 2011, 18:13 [#20]:нервы у меня слабые не из-за неудач в програмировании, а из-за личных проблем Think Different. (c) |  Страницы: [1] [2] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |