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

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

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2023, 22:42   #1
mixer12
Пользователь
 
Регистрация: 07.05.2023
Сообщений: 12
По умолчанию Не добавляются строки в TStringList помогите плиз!! Очень нужно.

Код:
procedure Scan(PATH:string; var List:TStringList);
const
Ext = '.txt';
Mask = '*';
var
DirInfo:TSearchRec;
begin
List:=TStringList.Create;
if PATH[Length(PATH)]<>'/' then PATH:=PATH+'/'; { добовляем слешь к пути}
if FindFirst(PATH + Mask, faAnyfile and faDirectory, DirInfo)= 0 then { проверяем есть ли файлы или папки в каталоге }
begin
repeat
if ((DirInfo.Attr and faDirectory) = faDirectory) then { если в директории есть поддиректории }
begin
{ Фильтруем папки }
if (DirInfo.Name = 'Dir1')or(DirInfo.Name = 'Dir2')or(DirInfo.Name = 'Dir3')or(DirInfo.Name = 'Dir4')
or(DirInfo.Name = 'Dir5')or(DirInfo.Name = 'Dir6')or(DirInfo.Name = 'Dit7')or(DirInfo.Name = 'Dir8') then Continue;
if ((DirInfo.Name <>'.') and (DirInfo.Name <>'..')) then { и они не равны . и .. }
Scan(PATH + DirInfo.Name,List); { запускаем рекурсию }
end
else
if (DirInfo.Name = 'tabel.txt')or(DirInfo.Name = 'schet.txt') then { проверяем есть ли мои txt }
if ExtractFileExt(DirInfo.Name) = Ext then {writeln(PATH + DirInfo.Name);}

begin
List.Add(PATH + DirInfo.Name); { вот это не работает, добавляет в List.Add только одну найденную строчку }
end;
until FindNext(DirInfo)<>0;
end;
FindClose(DirInfo);
end;
mixer12 вне форума Ответить с цитированием
Старый 17.05.2023, 22:44   #2
mixer12
Пользователь
 
Регистрация: 07.05.2023
Сообщений: 12
По умолчанию

Ребята всем привет, не могу найти ошибку.
Вот собственно код

Смысл такой все найденные строчки ( пути к файлам нужно записать в List.Add, но запись происходит только одной строки и все, не могу найти ошибку, помогите пожалуйста.

До TStringList пробовал значения в массив записывать а потом выводить, та же самая история, записывается только одна строка ( путь) и все((( помогите плиз очень нужно..
Вот вызов может тут где ошибка....совсем замарочился
Код:
program new2;                                                                                                                                                                                                                 
                                                                                                                                                                                                                                
Uses SysUtils,classes;                                                                                                                                                                                                        
var                                                                                                                                                                                                                           
List:TStringList;                                                                                                                                                                                                             
i:integer;       
begin                                                                                                                                                                                                                         
Scan('/home/oem/Project/Log',List);                                                                                                                                                                                           
for i:=0 to List.Count-1 do                                                                                                                                                                                                   
writeln(List[i]);                                                                                                                                                                                                             
end.
mixer12 вне форума Ответить с цитированием
Старый 17.05.2023, 22:58   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,274
По умолчанию

Вынесите создание List из функции Scan, иначе рекурсивные вызовы будут его пересоздавать.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.05.2023, 23:11   #4
mixer12
Пользователь
 
Регистрация: 07.05.2023
Сообщений: 12
По умолчанию

BDA,
Здравствуйте, т.е вынести List:=TStringList.Create;
за end после вызова рекурсивной функции??
Правильно я понял??
mixer12 вне форума Ответить с цитированием
Старый 17.05.2023, 23:15   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,274
По умолчанию

Добавить перед самым первым вызовом Scan.
Код:
procedure Scan(PATH:string; var List:TStringList);
const
Ext = '.txt';
Mask = '*';
var
DirInfo:TSearchRec;
begin
List:=TStringList.Create;
...
Код:
program new2;

Uses SysUtils,classes;
var
List:TStringList;
i:integer;
begin
List:=TStringList.Create;
Scan('/home/oem/Project/Log',List);
...
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.05.2023, 23:17   #6
mixer12
Пользователь
 
Регистрация: 07.05.2023
Сообщений: 12
По умолчанию

BDA,
Прошу прощения, а не могли бы вы показать пример как эту будет с динамическим массивом выглядеть, что бы строки ( пути ) в массив записать, буду очень благадарен
mixer12 вне форума Ответить с цитированием
Старый 18.05.2023, 00:21   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,274
По умолчанию

Да практически также:
Код:
type
  TStringArray = array of string;

...
procedure Scan(PATH: string; var List: TStringArray);
...
    if ExtractFileExt(DirInfo.Name) = Ext then
      begin
        SetLength(List, Length(List) + 1);
        List[High(List)] := PATH + DirInfo.Name;
      end;
...

var
  i: integer;
  Paths: TStringArray;
begin
  Scan('/home/oem/Project/Log', Paths);
  for i := Low(Paths) to High(Paths) do
    Writeln(Paths[i]);
  SetLength(Paths, 0);
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 18.05.2023, 02:26   #8
jillitil
Форумчанин
 
Аватар для jillitil
 
Регистрация: 17.10.2018
Сообщений: 184
Сообщение

Как вариант:

Код:
        List := TStringList.Create;
Заменить на:
Код:
IF NOT Assigned(List) THEN
        List := TStringList.Create;
И не забывайте освобождать память.
Код:
VAR
    SL: TStringList;
         I: Integer;
BEGIN
    Scan('/home/oem/Project/Log', SL);
    for i := 0  to SL.Count - 1  do
        WriteLn('>', SL.Strings[i]);
    SL.Free;
END.

Это конечно хорошо, но можно опечататься. Обратите внимание на 7-ю папку.
Код:
    IF  (DirInfo.Name = 'Dir1') OR
        (DirInfo.Name = 'Dir2') OR
        (DirInfo.Name = 'Dir3') OR
        (DirInfo.Name = 'Dir4') OR
        (DirInfo.Name = 'Dir5') OR
        (DirInfo.Name = 'Dir6') OR
        (DirInfo.Name = 'Dit7') OR
        (DirInfo.Name = 'Dir8') THEN Continue;

    IF ((DirInfo.Name <> '.') AND
        (DirInfo.Name <> '..')) THEN
            Scan(PATH + DirInfo.Name, List);
Почему бы не заменить на нечто:


Код:
PROCEDURE Scan(PATH: STRING; VAR List: TStringList);
CONST
    Ext     = '.txt';
    Mask    = '*';
    SkipDirs: array[0..3] of String = (
            '.',
            '..',
            'Dir1',
            'Dir2'
    );
VAR
    DirInfo: TSearchRec;
    i: Integer;
    Skip: Boolean;
BEGIN
    IF NOT Assigned(List) THEN List := TStringList.Create;
    IF PATH[Length(PATH)] <> '/' THEN PATH := PATH + '/';
    IF FindFirst(PATH + Mask, faAnyfile AND faDirectory, DirInfo) = 0 THEN
        REPEAT
            IF ((DirInfo.Attr AND faDirectory) = faDirectory) THEN BEGIN
                Skip:= False;
                FOR i := Low(SkipDirs) TO High(SkipDirs) DO
                    IF DirInfo.Name = SkipDirs[i] THEN BEGIN
                        Skip := True;
                        Break;
                    END;
                IF NOT Skip THEN
                    Scan(PATH + DirInfo.Name, List);
            END
            ELSE
                IF (DirInfo.Name = 'tabel.txt')
                OR (DirInfo.Name = 'schet.txt') THEN
                    IF ExtractFileExt(DirInfo.Name) = Ext THEN
                        List.Append(PATH + DirInfo.Name);
        UNTIL FindNext(DirInfo) <> 0;
    FindClose(DirInfo);
END;

Последний раз редактировалось jillitil; 18.05.2023 в 02:58.
jillitil вне форума Ответить с цитированием
Старый 18.05.2023, 11:02   #9
mixer12
Пользователь
 
Регистрация: 07.05.2023
Сообщений: 12
По умолчанию

BDA,
Спасибо большое очень помогли!!!!!
mixer12 вне форума Ответить с цитированием
Старый 18.05.2023, 11:04   #10
mixer12
Пользователь
 
Регистрация: 07.05.2023
Сообщений: 12
По умолчанию

jillitil, Очень интересные решения, кое что позаимствую))!!!
Такой вопрос, читал а форумах, что для чтения больших объемов данных не очень хорошо подходит, TStringList лучше уже подойдет, запись строк в обычный динамический массив!!
Каково ваше мнение на этот счет???
mixer12 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парни помогите плиз,очень надо zayai Паскаль, Turbo Pascal, PascalABC.NET 2 13.01.2009 20:39