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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2021, 15:57   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 620
По умолчанию Двойная ссылка (для поиска: поиск папок в папке)

Вопрос такой. Когда в параметры процедуры по ссылке передается переменная которая сама является ссылкой - то в этом случае будет двойная ссылка (ссылка на ссылку), или все будет передана ссылка напрямую на переменную?

Показываю на примере кода процедуры, которая находит папки в папке.
Выкладываю код, может кому пригодится.
Буду хорошим человеком=)) Кто-то мне помог тут, кому-то я помогу

Код:
{Добавляет строку в TStrings с сортировкой по алфавиту}
Procedure SortAddStringToTStrings(const s:string; ss: TStrings; const st:byte);
var
 j:longInt;
begin
 For j:= st to ss.Count-1 do begin
  If s<ss[j] then begin
   ss.Insert(j, s);
   exit;
  end;
 end;
 ss.Add(s);
end;

{Находит все папки в папке и сортирует их по-алфавиту}
procedure DirSearchDirSort(Dir: string; SL: TStrings);
var
   SearchRec: TSearchRec;

begin
   Dir := IncludeTrailingBackslash(Dir);
   if FindFirst(Dir + '*.*', faDirectory, SearchRec) = 0 then

     repeat
       Application.ProcessMessages;

       if (SearchRec.Attr and faDirectory)<>0 then begin
          If not(SearchRec.Name='.') and not(SearchRec.Name='..') then begin
            SortAddStringToTStrings( (Dir + SearchRec.Name), SL, 0);
          end;
       end;
     until FindNext(SearchRec)<>0;
   FindClose(SearchRec);
end;
Kronos913 вне форума Ответить с цитированием
Старый 23.05.2021, 19:08   #2
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Как-то грубо
Код:
If s<ss[j] then begin
   ss.Insert(j, s);
   exit;
  end;
лучше
Код:
If s<ss[j] then begin
   ss.Insert(j, s);
   Break; // <-
  end;
Shouldercannon вне форума Ответить с цитированием
Старый 23.05.2021, 19:10   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 620
По умолчанию

После брейка выполнится оператор ss.Add(s); а после эксита - нет
И тогда придется лишний булеан делать чтобы отловить была ли строка вставлена в середину списка, или нет
Kronos913 вне форума Ответить с цитированием
Старый 24.05.2021, 01:54   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,867
По умолчанию

Вставлять ProcessMessages на каждой итерации некоего цикла это перебор.
northener вне форума Ответить с цитированием
Старый 31.05.2021, 09:16   #5
D1973
Пользователь
 
Регистрация: 04.04.2018
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
может кому пригодится
Начать надо с того, что уже в Дельфи 7 функция IncludeTrailingBackslash() использовалась только для обратной совместимости, т.е., по русски говоря, безбожно устарела... И на кой ляд вообще трогать абстрактный класс TStrings?
Далее, даже для прошловековой Дельфи-6 тут чересчур много нагромождений... На кой ляд вообще нужна процедура SortAddStringToTStrings, если у класса TStringList есть свои методы Sort() и CustomSort()? Да, собственно, проще уж сразу сказать, чтобы список создавался сортированным.
Код для Д7
Код:
procedure DirSearchDirSort(Dir: string; SL: TStringList);
var SearchRec: TSearchRec;
begin
   Dir := IncludeTrailingPathDelimiter(Dir);
   SL.Sorted := true;
   if FindFirst(Dir + '*.*', faDirectory, SearchRec) = 0 then
     repeat
       if (SearchRec.Attr and faDirectory)<>0 then
         if not(SearchRec.Name='.') and not(SearchRec.Name='..') then SL.Add(Dir + SearchRec.Name);
     until FindNext(SearchRec)<>0;
   FindClose(SearchRec);
end;
В RAD Studio все еще компактнее:
Код:
uses ... , System.Types, System.IOUtils;
...
procedure DirSearchDirSort(Dir: string; SL: TStringList);
var
  i: integer;
  A: TStringDynArray;
begin
  A := TDirectory.GetDirectories(Dir);
  SL.Sorted := true;
  for i := Low(A) to High(A) do
    SL.Add(A[i]);
end;

Последний раз редактировалось D1973; 31.05.2021 в 09:20.
D1973 вне форума Ответить с цитированием
Старый 31.05.2021, 19:40   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от D1973 Посмотреть сообщение
трогать абстрактный класс TStrings
А это чтобы вызывать, например, так "DirSearchDirSort('D:\', memo1.lines);". Но добавление сначала в "самосортирующийся" TStringList, а затем присвоение его содержимого визуальному компоненту, возможно, будет эффективнее.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Список папок в папке Kronos913 Общие вопросы Delphi 6 11.02.2021 22:02
Двойная ссылка на Листы dragonqwert Microsoft Office Excel 22 04.01.2012 18:04
Ссылка на книгу в другой папке Brandon Skywalker Microsoft Office Excel 1 06.10.2011 07:58
Процедура поиска - необходимо организовать поиск по маске *.txt в папке Test GvR Общие вопросы Delphi 3 04.11.2009 15:31
Microsoft Office Outlook : удаление папок в папке контакты bufer Софт 0 05.12.2007 16:58