|
Вопрос # 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™ (статус: Доктор наук), 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™ (статус: Доктор наук), 5 мая 2011, 18:50 [#31]:
Цитата (Кудя):
сам не знаю как быть=(
Да делай ты через рекурсию, задолбал.
Сдаётся мне, в прошлой жизни ты был комсомольцем.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Кудя (статус: Посетитель), 5 мая 2011, 18:53 [#32]:
как? Я могу это сделать, но требования моего вопроса запрещают
Think Different. (c)
|
|
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™ (статус: Доктор наук), 5 мая 2011, 19:33 [#39]:
Хотелось бы теперь узнать, как ты будешь применять свеженаписанную прогу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Страницы: [« Предыдущая] [1] [2]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|