![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Здравствуйте
Столкнулся с таким вопросом - есть рекурсивная функция, т.е. которая сама себя определенное кол-во раз вызывает. Код:
function TForm1.FolderSearch(SrcFolder: String): TStringList;
var
sTemp: String;
SR: TSearchRec;
begin
Result := TStringList.Create;
SrcFolder := IncludeTrailingBackSlash(SrcFolder);
if not DirectoryExists(SrcFolder) then Exit;
if FindFirst(SrcFolder + '*', faAnyFile, SR) = 0 then
begin
repeat
if (SR.Attr and faDirectory) = faDirectory then
begin
if (sr.Name <> '') and (sr.Name <> '.') and (sr.Name <> '..') then
begin
sTemp := SrcFolder + sr.Name;
Result.Add(sTemp);
FolderSearch(sTemp);
end;
end;
until FindNext(SR) <> 0;
FindClose(SR);
end;
end;Хотел сделать, чтобы она возвращала значение (как видно из кода - список вложенных папок) в виде TStringList. Проблема в том, что без Result := TStringList.Create вылезает ошибка, что нормально, а с таким его созданием результат не тот, какой нужен, т.к. из-за рекурсии Result пересоздается и записанные ранее данные пропадают. Подскажите, есть ли варианты, как исправить? |
|
#2
|
|||
|
|||
|
Да, передаватьь готовый TStringList в функцию извне и, соответсвенно, передавать его при рекурсивных вызовах. Если ты хочешь иметь именно такую сигнатуру функции, как указана у тебя, то это делается так: пишется функция стартер с нужной сигнатурой и пишется функция, которая выполняет реальную работу, которую стартер и вызывает.
|
|
#3
|
||||
|
||||
|
Да в принципе это не критично
Изначально вообще вместо функции использовал просто процедуру, которая заполняла переменную типа StringList, но просто стало интересно, можно ли сделать такую функцию. Но все равно спасибо за ответ ![]() |