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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2022, 19:16   #1
Катя93
Пользователь
 
Регистрация: 11.01.2021
Сообщений: 48
По умолчанию Как осуществить по очереди поиск информации из списка файлов?

Здравствуйте помогите решить проблему, у меня три поля. Edit1 указываю путь к папке, Edit2 указываю расширения файлов например txt, при нажатии “Запуск сканера”, начинаются искать эти файлы с расширением txt в папке которую указала в Edit1.

Мне требуются также сделать, чтобы при запуске сканере происходил заход в каждый файл и осуществлялся поиск по ключевому слову который указан допустим в edit3. Например прописываем в edit3 слово “development”, файл открывается ищет в нем это слово, если его нет файл закрывается и продолжается поиск (количество похожих слов в одном файле не имеет значение, главное чтобы до первого встречного слова заданного в Edit3 и потом добавлялся файл в Memo2).

В случае если это слово присутствует то файл, добавлялся в компонент Memo2 и таким образом пополнялся список файлов где присутствует заданное ключевое слово в Edit3.
Вот некоторый пример работы с файлами:

Код:
//FileList - список найденных файлов во время поиска
for j := i + 1 to Length(FilesList) - 1 do
    begin
       FileMode := fmOpenRead;
       AssignFile(F1, GetPath(FilesList[i].Folder) + FilesList[i].Name);
       Reset(F1, 1);
       //ПРОВЕРКА ФАЙЛА НА НАЛИЧИЕ КЛЮЧЕВОГО СЛОВА И ДОБАВЛЕНИЕ ЭТОГО ФАЙЛА
       //В MEMO2.
      CloseFile(F1);
    end;
А вот полностью код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Shared, StdCtrls;

type
  TMainForm = class(TForm)
    StartButton: TButton;
    Edit1: TEdit;
    OperationName: TLabel;
    ProgressStatus: TLabel;
    Edit2: TEdit;
    Memo1: TMemo;
    procedure StartButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
  TProgressThread = class(TThread)
    procedure Execute; override;
  end;

var
  MainForm: TMainForm;
  ProgressThread: TProgressThread;
implementation

{$R *.dfm}



procedure TProgressThread.Execute;
var
  i, j, k, BytesInBuffer, n, DoubleNumber: Cardinal;
  F: TSearchRec;
  SearchResult: Integer;
  S1, S2: String;
  F1, F2: File;
  l: Boolean;
  procedure ProgressTerminate;
  begin
    SetLength(FoldersTree, 0);
    SetLength(FilesList, 0);
    MainForm.StartButton.Caption := 'Начать сканирование';
    MainForm.StartButton.Tag := 0;
    MainForm.OperationName.Caption := 'Сканирование прервано';
    MainForm.ProgressStatus.Left := MainForm.OperationName.Width + 15;
    MainForm.ProgressStatus.Caption := '';
    MainForm.Repaint;
  end;
begin
  MainForm.OperationName.Caption := 'Сканирование папок';
  MainForm.ProgressStatus.Left := MainForm.OperationName.Width + 15;
  MainForm.ProgressStatus.Caption := '';
  MainForm.Repaint;

  i := 1;
  while (i < Length(FoldersTree)) and (not ProgressThreadTerminated) do
  begin
   Str(i, S1);
   Str(Length(FoldersTree) - 1, S2);
   MainForm.ProgressStatus.Caption := S1 + ' из ' + S2 + ' ';
   SearchResult := FindFirst(GetPath(i) + '*', faAnyFile, F);

   //Запускает подсчет найденных файлов
   while (SearchResult = 0) and (not ProgressThreadTerminated) do
    begin
     
       //and (ExtractFileExt(F.Name)='.as')
      if (F.Name <> '.') and (F.Name <> '..') then
        if (F.Attr and faDirectory) = faDirectory  then
        begin
          if ScanSubfolders then
          begin
           
            SetLength(FoldersTree, Length(FoldersTree) + 1);
            FoldersTree[Length(FoldersTree) - 1].Name := F.Name;
            FoldersTree[Length(FoldersTree) - 1].Parent := i;
          end;
        end  
        else
        begin

        if (ExtractFileExt(F.Name) = MainForm.Edit2.Text) then
        begin

          SetLength(FilesList, Length(FilesList) + 1);
          FilesList[Length(FilesList) - 1].Folder := i;
          FilesList[Length(FilesList) - 1].Time := F.Time;
          FilesList[Length(FilesList) - 1].Size := F.Size;
          FilesList[Length(FilesList) - 1].Name := F.Name;
        end;
        end;
      SearchResult := FindNext(F);
    end;
    FindClose(F);
    Inc(i);
  end;
  if ProgressThreadTerminated then
  begin
    ProgressTerminate;
    Exit;
  end;

  if Length(FilesList) < 1 then
  begin
    MainForm.OperationName.Caption := 'Файлов с таким расширением не найдено';
    MainForm.ProgressStatus.Left := MainForm.OperationName.Width + 15;
    MainForm.ProgressStatus.Caption := '';
    MainForm.Repaint;
    MainForm.StartButton.Caption := 'Начать сканирование';
    MainForm.StartButton.Tag := 0;
    Exit;
  end;

  MainForm.OperationName.Caption := 'Сравнение файлов';
  MainForm.ProgressStatus.Left := MainForm.OperationName.Width + 15;
  MainForm.ProgressStatus.Caption := '';
  MainForm.Repaint;
  DoubleNumber := 0;
  MainForm.Memo1.Clear;
  for i := 0 to Length(FilesList) - 1 do
  begin
    
    MainForm.Memo1.Lines.Add(FilesList[i].Name);
    if ProgressThreadTerminated then Break;
    Str(i, S1);
    Str(Length(FilesList) - 1, S2);
    MainForm.ProgressStatus.Caption := S1 + ' из ' + S2 + ' ';
    for j := i + 1 to Length(FilesList) - 1 do
    begin
       FileMode := fmOpenRead;
       AssignFile(F1, GetPath(FilesList[i].Folder) + FilesList[i].Name);
       Reset(F1, 1);
       //ПРОВЕРКА ФАЙЛА НА НАЛИЧИЕ КЛЮЧЕВОГО СЛОВА И ДОБАВЛЕНИЕ ЭТОГО ФАЙЛА
       //В MEMO2.
       CloseFile(F1);
    end;
  end;

  

end;
procedure TMainForm.StartButtonClick(Sender: TObject);
var
  i, j: Integer;
  l: Boolean;
begin
  if StartButton.Tag = 1 then
  begin
    ProgressThreadTerminated := True;
    Exit;
  end;

  SetLength(FoldersTree, 1);
  SetLength(FilesList, 0);
  ScanSubfolders := True;
  if ScanSubfolders then
  begin
   l := True;
   if l then
      begin
      // SaveToFile('FolderListBox1.txt',
      // FoldersListBox.Items[j]);
        SetLength(FoldersTree, Length(FoldersTree) + 1);
        FoldersTree[Length(FoldersTree)-1].Parent := 0;
        FoldersTree[Length(FoldersTree)-1].Name :=
        Copy(Edit1.Text, 1, Length(Edit1.Text) - 1);
      end; 
  end
  else
  begin
    //for i := 0 to FoldersListBox.Count - 1 do
    //begin
      SetLength(FoldersTree, Length(FoldersTree) + 1);
      FoldersTree[1].Parent := 0;
      FoldersTree[1].Name := Copy(Edit1.Text, 1, Length(Edit1.Text) - 1);
    //end;
  end;
  StartButton.Caption := 'Остановить сканирование';
  StartButton.Tag := 1;
  ProgressThreadTerminated := False;
  ProgressThread := TProgressThread.Create(False);
 
end;

end.

Последний раз редактировалось Катя93; 08.06.2022 в 19:22.
Катя93 вне форума Ответить с цитированием
Старый 08.06.2022, 19:16   #2
Катя93
Пользователь
 
Регистрация: 11.01.2021
Сообщений: 48
По умолчанию

Также прикладываю код дополнительного файла Shared, где хранятся данные о файлах и прочее.
Код:
unit Shared;

interface

uses
  SysUtils;

var
  ISResult: Boolean;
  ProgressThreadTerminated: Boolean;
  DoubleIndications: record
    Name, Size, Contents: Boolean;
  end;
  ScanSubfolders: Boolean;
  FoldersTree: array of record
    Parent: Cardinal;
    Name: String[128];
  end;
  FilesList: array of record
    Folder: Cardinal;
    Time: Integer;
    Size: Integer;
    Name: String[128];
  end;

function GetPath(i: Cardinal): String;
procedure DeleteItem(i: Cardinal);
procedure SortBy(Key: String); //Key = 'Double' or  'Name' or  'Size' or 'Time' or 'Folder'

implementation

function GetPath(i: Cardinal): String;
var
  S: String;
begin
  S := '';
  while i <> 0 do
  begin
    S := FoldersTree[i].Name + '\' + S;
    i := FoldersTree[i].Parent;
  end;
  GetPath := S;
end;

procedure DeleteItem(i: Cardinal);
var
  j: Cardinal;
begin
  if (Length(FilesList) = 0) or (i > Length(FilesList) - 1) then Exit;
  if  Length(FilesList) > 1 then
    for j := i to Length(FilesList) - 2 do FilesList[j] := FilesList[j + 1];
  SetLength(FilesList, Length(FilesList) - 1);
end;

procedure SortBy(Key: String);
var
  l, l1: Boolean;
  i, SwIndex: Cardinal;
begin
  if Length(FilesList) < 2 then Exit;
  SwIndex := Length(FilesList);
  SetLength(FilesList, Length(FilesList) + 1);
  l := True;
  while l do
  begin
    l := False;  
    for i := 0 to Length(FilesList) - 2 do
    begin
      l1 := False;
     
      if (Key = 'Name') and (AnsiCompareText(FilesList[i].Name, FilesList[i + 1].Name) > 0) then l1 := True;
      if (Key = 'Size') and (FilesList[i].Size > FilesList[i + 1].Size) then l1 := True;
      if (Key = 'Time') and (FilesList[i].Time > FilesList[i + 1].Time) then l1 := True;
      if (Key = 'Folder') and (AnsiCompareText(GetPath(FilesList[i].Folder), GetPath(FilesList[i + 1].Folder)) > 0) then l1 := True;
      if l1 then
      begin
        l := True;
        FilesList[SwIndex] := FilesList[i];
        FilesList[i] := FilesList[i + 1];
        FilesList[i + 1] := FilesList[SwIndex];
      end;
    end;
  end;
  SetLength(FilesList, Length(FilesList) - 1);
end;

end.
Катя93 вне форума Ответить с цитированием
Старый 08.06.2022, 19:36   #3
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Если вы ищите текст, то зачем открывать нетипизированный файл. Измените переменную F1 на TextFile или вам надо искать во всевозможных кодировках одно и тоже слово?

ADD: На приведенном изображении показаны следующие строки (дополненные до 128 байт):
  1. "Строка в кодировке ANSI (Windows-1251)" в диапазоне 0000 .. 0025
  2. "Строка в кодировке ANSI (CP866)" в диапазоне 0080 .. 009E
  3. "Строка в кодировке UTF8" в диапазоне 0100 .. 0127
  4. "Строка в кодировке UTF16BE (Unicode BigEndian)" в диапазоне 0180 .. 01DB
  5. "Строка в кодировке UTF16LE (Unicode LittleEndian)" в диапазоне 0200 .. 0261 обратите внимание на завершающий байт 00
К сожалению mc отображает файлы в кодировке UTF8, поэтому в правой колонке не все символы расшифрованы правильно (Поэтому дал расшифровку в списке выше).
Изображения
Тип файла: png Кодировки.png (37.4 Кб, 58 просмотров)

Последний раз редактировалось macomics; 08.06.2022 в 20:44.
macomics вне форума Ответить с цитированием
Старый 09.06.2022, 09:11   #4
Катя93
Пользователь
 
Регистрация: 11.01.2021
Сообщений: 48
По умолчанию

Я не чего не поняла, мне нужен конкретный пример. Вот простой код который ищет в тексте ключевое слово, но это только для одного файла. Как это можно применить в цикле, чтобы делать поиск ключевого слово во множество найденных файлов поочередно?
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  myFile : TextFile;
  text   : String;
begin
 Memo1.Lines.Clear;

AssignFile(myFile, 'license.txt');
Reset(myFile);

while not Eof(myFile) do
  begin
    ReadLn(myFile, text);
    Memo1.Lines.Add(text);
  end;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
  TS: TStringList;
  s, OneWord: string;
  i, Cnt: integer;
begin
TS := TStringList.Create;
  TS.Delimiter := '+';
  TS.LoadFromFile('license.txt');
  s := TS.Text;
  TS.DelimitedText := s;
  if TS.Count = 0 then
  begin
    ShowMessage('Не одного слова не найдено!');
    Exit;
  end;
  TS.Sort;
  Memo1.Lines.Clear;
  OneWord := TS.Strings[0];
  Cnt := 1;
  Edit1.Text:=IntToStr(TS.Count);
  for i := 1 to TS.Count - 1 do
    if AnsiUpperCase(TS.Strings[i]) = AnsiUpperCase('DEVELOPMENT') then
    begin
      
      Memo1.Lines.Append('DEVELOPMENT+' + InttoStr(Cnt));
      Break;
    end;

  FreeAndNil(TS);
end;

end.
Катя93 вне форума Ответить с цитированием
Старый 09.06.2022, 09:30   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Катя93 Посмотреть сообщение
procedure TForm1.Button1Click(Sender: TObject);
var
myFile : TextFile;
text : String;
begin
Memo1.Lines.Clear;

AssignFile(myFile, 'license.txt');
Reset(myFile);

while not Eof(myFile) do
begin
ReadLn(myFile, text);
Memo1.Lines.Add(text);
end;

end;
А закрывать файл будет дядя Ваня?
Код:
//FileList - список найденных файлов во время поиска
for j := i + 1 to Length(FilesList) - 1 do
    begin
       FileMode := fmOpenRead;

       name := GetPath(FilesList[i].Folder) + FilesList[i].Name;

       AssignFile(F1, name);
       Reset(F1);
       //ПРОВЕРКА ФАЙЛА НА НАЛИЧИЕ КЛЮЧЕВОГО СЛОВА И ДОБАВЛЕНИЕ ЭТОГО ФАЙЛА
       //В MEMO2.

  edit := AnsiUpperCase('DEVELOPMENT');

while not Eof(F1) do
  begin
    ReadLn(F1, text);
// Edit.Text не предполагает ввод разделителя строки. Поэтому искать можно построчно не загружая весь файл в память.
    if  AnsiUpperCase(text) = edit then
    begin
      Memo2.Lines.Append(name);
      Break;
    end;

  end;

      CloseFile(F1);
    end;
Но это будет искать совпадение со словами в совпадающей кодировке и все. Текст в файлах может кодироваться по разному. На картинке выше в 16 средних столбцах показаны шестнадцатеричные представления байт из которых состоят символы в разных кодировках. К примеру символы 'С' русская во всех строках будут закодированы разными последовательностями байт:
  1. D1 = 209
  2. 91 = 145
  3. D0, A1 = 208, 161
  4. 04, 21 = 4, 33
  5. 21, 04 = 33, 4
В вашем проекте используются ANSI строки. Значит в зависимости от кодировки установленной компилятором строки будут искать совпадения в одном из 2 первых вариантах.

Последний раз редактировалось macomics; 09.06.2022 в 09:48.
macomics вне форума Ответить с цитированием
Старый 13.06.2022, 01:23   #6
Катя93
Пользователь
 
Регистрация: 11.01.2021
Сообщений: 48
По умолчанию

Еще одна ошибка связанная с ReadLn, в этой процедуре TProgressThread.Execute; Когда я пытаюсь передать text: String в ReadLn, выдает ошибку:
Цитата:
[Error] Unit1.pas(153): Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'String'
Вот этот код:
Код:
for j := i + 1 to Length(FilesList) - 1 do
    begin
       FileMode := fmOpenRead;
       name := GetPath(FilesList[i].Folder) + FilesList[i].Name;
       //AssignFile(F1, GetPath(FilesList[i].Folder) + FilesList[i].Name);
       Reset(F1, 1);
       //ПРОВЕРКА ФАЙЛА НА НАЛИЧИЕ КЛЮЧЕВОГО СЛОВА И ДОБАВЛЕНИЕ ЭТОГО ФАЙЛА
       //В MEMO2.
       edit := AnsiUpperCase('DEVELOPMENT');

      while not Eof(F1) do
      begin
          ReadLn(F1, text);
// Edit.Text не предполагает ввод разделителя строки.
//Поэтому искать можно построчно не загружая весь файл в память.
          if  AnsiUpperCase(text) = edit then
          begin
           MainForm.Memo2.Lines.Append(name);
           Break;
          end;

       end;

       CloseFile(F1);
    end;
Проблема в этой строке.
Код:
 ReadLn(F1, text);
Полностью процедура:
Код:
procedure TProgressThread.Execute;
var
  i, j, k, BytesInBuffer, n: Cardinal;
  F: TSearchRec;
  SearchResult: Integer;
  S1, S2, edit, name: String;
  F1, F2: File;
  l: Boolean;
  text:String;
  procedure ProgressTerminate;
  begin
    SetLength(FoldersTree, 0);
    SetLength(FilesList, 0);
    MainForm.StartButton.Caption := 'Начать сканирование';
    MainForm.StartButton.Tag := 0;
    MainForm.OperationName.Caption := 'Сканирование прервано';
    MainForm.ProgressStatus.Left := MainForm.OperationName.Width + 15;
    MainForm.ProgressStatus.Caption := '';
    MainForm.Repaint;
  end;
  
begin
  MainForm.OperationName.Caption := 'Сканирование папок';
  MainForm.ProgressStatus.Left := MainForm.OperationName.Width + 15;
  MainForm.ProgressStatus.Caption := '';
  MainForm.Repaint;

  i := 1;
  while (i < Length(FoldersTree)) and (not ProgressThreadTerminated) do
  begin
   Str(i, S1);
   Str(Length(FoldersTree) - 1, S2);
   MainForm.ProgressStatus.Caption := S1 + ' из ' + S2 + ' ';
   SearchResult := FindFirst(GetPath(i) + '*', faAnyFile, F);

   //Запускает подсчет найденных файлов
   while (SearchResult = 0) and (not ProgressThreadTerminated) do
    begin
     
       //and (ExtractFileExt(F.Name)='.as')
      if (F.Name <> '.') and (F.Name <> '..') then
        if (F.Attr and faDirectory) = faDirectory  then
        begin
          if ScanSubfolders then
          begin
           
            SetLength(FoldersTree, Length(FoldersTree) + 1);
            FoldersTree[Length(FoldersTree) - 1].Name := F.Name;
            FoldersTree[Length(FoldersTree) - 1].Parent := i;
          end;
        end  
        else
        begin

        if (ExtractFileExt(F.Name) = MainForm.Edit2.Text) then
        begin

          SetLength(FilesList, Length(FilesList) + 1);
          FilesList[Length(FilesList) - 1].Folder := i;
          FilesList[Length(FilesList) - 1].Time := F.Time;
          FilesList[Length(FilesList) - 1].Size := F.Size;
          FilesList[Length(FilesList) - 1].Name := F.Name;
        end;
        end;
      SearchResult := FindNext(F);
    end;
    FindClose(F);
    Inc(i);
  end;
  if ProgressThreadTerminated then
  begin
    ProgressTerminate;
    Exit;
  end;

  if Length(FilesList) < 1 then
  begin
    MainForm.OperationName.Caption := 'Файлов с таким расширением не найдено';
    MainForm.ProgressStatus.Left := MainForm.OperationName.Width + 15;
    MainForm.ProgressStatus.Caption := '';
    MainForm.Repaint;
    MainForm.StartButton.Caption := 'Начать сканирование';
    MainForm.StartButton.Tag := 0;
    Exit;
  end;

  MainForm.OperationName.Caption := 'Сравнение файлов';
  MainForm.ProgressStatus.Left := MainForm.OperationName.Width + 15;
  MainForm.ProgressStatus.Caption := '';
  MainForm.Repaint;
  
  MainForm.Memo1.Clear;
  for i := 0 to Length(FilesList) - 1 do
  begin
    
    MainForm.Memo1.Lines.Add(FilesList[i].Name);
    if ProgressThreadTerminated then Break;
    Str(i, S1);
    Str(Length(FilesList) - 1, S2);
    MainForm.ProgressStatus.Caption := S1 + ' из ' + S2 + ' ';
    for j := i + 1 to Length(FilesList) - 1 do
    begin
       FileMode := fmOpenRead;
       name := GetPath(FilesList[i].Folder) + FilesList[i].Name;
       //AssignFile(F1, GetPath(FilesList[i].Folder) + FilesList[i].Name);
       Reset(F1, 1);
       //ПРОВЕРКА ФАЙЛА НА НАЛИЧИЕ КЛЮЧЕВОГО СЛОВА И ДОБАВЛЕНИЕ ЭТОГО ФАЙЛА
       //В MEMO2.
       edit := AnsiUpperCase('DEVELOPMENT');

      while not Eof(F1) do
      begin
          ReadLn(F1, text);
// Edit.Text не предполагает ввод разделителя строки.
//Поэтому искать можно построчно не загружая весь файл в память.
          if  AnsiUpperCase(text) = edit then
          begin
           MainForm.Memo2.Lines.Append(name);
           Break;
          end;

       end;

       CloseFile(F1);
    end;
end;
Катя93 вне форума Ответить с цитированием
Старый 13.06.2022, 01:36   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Пропустили
Код:
AssignFile(F1, name);
Reset(F1); // Без длины блока
Тип файла поменяйте на TextFile. Я там еще кое-что написал "ленивым способом"
Код:
if  AnsiUpperCase(text) = edit then // Вместо = тут нужна функция поиска подстроки в строке типа pos(edit, text) <> 0
          begin
           MainForm.Memo2.Lines.Append(name);
           Break;
          end;

Последний раз редактировалось macomics; 13.06.2022 в 01:42.
macomics вне форума Ответить с цитированием
Старый 13.06.2022, 10:33   #8
Катя93
Пользователь
 
Регистрация: 11.01.2021
Сообщений: 48
По умолчанию

Файлы, он в папке ищет, но текст в них не находит.
Код:
for j := i + 1 to Length(FilesList) - 1 do
    begin
       FileMode := fmOpenRead;
       name := GetPath(FilesList[i].Folder) + FilesList[i].Name;
       AssignFile(F1, name);
       Reset(F1);
       //ПРОВЕРКА ФАЙЛА НА НАЛИЧИЕ КЛЮЧЕВОГО СЛОВА И ДОБАВЛЕНИЕ ЭТОГО ФАЙЛА
       //В MEMO2.  AnsiUpperCase( )
       edit := AnsiUpperCase('DEVELOPMENT');

      while not Eof(F1) do
      begin
          
          ReadLn(F1, text);
         // SaveToFile('doc44.txt',text);
// Edit.Text не предполагает ввод разделителя строки.
//Поэтому искать можно построчно не загружая весь файл в память.
          if  AnsiUpperCase(text) = edit then
          begin
           MainForm.Memo2.Lines.Append(name);
           Break;
          end;

       end;

       CloseFile(F1);
    end;
Почему, то не срабатывает это условие.
Код:
if  AnsiUpperCase(text) = edit then
Я добавилав в код новую функцию SaveToFile, чтобы сохранять все значения которые попадают в text, в итоге открыв новый документ doc44.txt, я обнаружила, что документы, при нахождении сохраняются, но, поиск по этим документам все равно не осуществляется.
Катя93 вне форума Ответить с цитированием
Старый 13.06.2022, 14:29   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Катя93 Посмотреть сообщение
Код:
if  AnsiUpperCase(text) = edit then
          begin
           MainForm.Memo2.Lines.Append(name);
           Break;
          end;
Это сравнение целой строки считанной из файла с подстрокой в edit. Если в каком-то файле встретится строка DeVeLoPmEnT, то он это найдет. Чтобы находил подстроки надо так
Код:
if  Pos(edit, AnsiUpperCase(text)) <> 0 then
          begin
           MainForm.Memo2.Lines.Append(name);
           Break;
          end;
Я об этом написал в комментарии выше
macomics вне форума Ответить с цитированием
Старый 13.06.2022, 17:20   #10
Катя93
Пользователь
 
Регистрация: 11.01.2021
Сообщений: 48
По умолчанию

Добавила, дополнительный массив (запись), чтобы туда вносить все файлы где были найдены совпадения по ключам.
Код:
FilesListSel: array of record
   Name: String[128];
  end;
Теперь пытаюсь записывать в этот массив найденные файлы, но из-за нескольких вложений в циклах, в массив записывается столько данных сколько всего файлов существует в папках, как записать только те файлы в которые присутсвуют ключевые слова?
Код:
for i := 0 to Length(FilesList) - 1 do
  begin
    
    MainForm.Memo1.Lines.Add(FilesList[i].Name);
    if ProgressThreadTerminated then Break;
    Str(i, S1);
    Str(Length(FilesList) - 1, S2);
    MainForm.ProgressStatus.Caption := S1 + ' из ' + S2 + ' ';

    for j := i + 1 to Length(FilesList) - 1 do
    begin
       FileMode := fmOpenRead;
       name := GetPath(FilesList[i].Folder) + FilesList[i].Name;
       AssignFile(F1, name);
       Reset(F1);
       edit := AnsiUpperCase('DEVELOPMENT');
      
      
      while not Eof(F1) do
      begin

          ReadLn(F1, text);
        
          if  Pos(edit, AnsiUpperCase(text)) <> 0 then
          begin
           SetLength(FilesListSel, Length(FilesListSel) + 1);
           FilesListSel[Length(FilesListSel) - 1].Name := name;
           Break;
          end;

       end;

       CloseFile(F1);
    end;
  end;
Катя93 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Free Pascal] Сортировка списка очереди. Dikoobraz Помощь студентам 3 25.04.2013 21:33
Реализация очереди с элементами из списка Quadrelle Паскаль, Turbo Pascal, PascalABC.NET 1 20.04.2013 22:05
Как нескольким потокам брать строку из одного списка по очереди? trafbite Общие вопросы Delphi 23 12.03.2012 19:34
Списка. Стеки, очереди, Кольца c++ megavolt91 Помощь студентам 0 01.06.2009 20:23