Показать сообщение отдельно
  #5  
Старый 20.09.2023, 07:03
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,016
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Еще раз.
Какой функционал ты пытаешься сделать?
Поиск файлов и вставка их в БД? Т.е. пользовательского интерфейса нет.
Соответсвенно, вполне можно сделать CallBack в процедуре поиска которая и будет всталять записи в БД. Да, можно заполнить массив/список и уже из него вставлять. А зачем промежуточный код?

Например, возьмем твой код и немного его переделаем:
Код:
type
  TInsertImageToDbCallBack = procedure(AFileName : String; ASize : Integer) of object;

procedure TForm1.FileSearch(const dirName:string; ACallBack : TInsertImageToDbCallBack);
var
  searchResult: TSearchRec;  a : array [1..255] of Integer;
begin
  if FindFirst(dirName+'\*', faAnyFile, searchResult)=0 then begin
    try
      repeat
        if (searchResult.Attr and faDirectory)=0 then begin
          if SameText(ExtractFileExt(searchResult.Name), '.jpg') then begin
            ACallBack(IncludeTrailingBackSlash(dirName)+searchResult.Name,searchResult.Size);           end;
        end else if (searchResult.Name<>'.') and (searchResult.Name<>'..') then begin
          FileSearch(IncludeTrailingBackSlash(dirName)+searchResult.Name);
         end;
      until FindNext(searchResult)<>0
    finally
      FindClose(searchResult);
    end;
  end;
end;

Теперь вызов.
Делаем раз (делаем 2 callback'а, один для отладки, второй для вставки данных):
Код:
procedure TForm1.AddToMemoCb(AFileName : String; ASize : Integer);
begin
  Memo1.Lines.Add(Format('File: %s; Size: %d',[AFileName,ASize]));
end;

procedure TForm1.AddToDbCb(AFileName : String; ASize : Integer);
begin
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Add(Format('INSERT INTO tablename (name, size) VALUES (%s, %d)',[AFileName,ASize]));
  SQLQuery1.Exec;
end;

Ну и, собственно, вызов:
Код:
FileSearch('c:\images\',AddToMemoCb); // Показали в Memo
FileSearch('c:\images\',AddToDbCb); // Записали в БД

А вообще, это еще и в отдельный поток можно "вытолкнуть", что бы основной процесс (интерфейс) не подвисал.
Ответить с цитированием