Delphi - открыть следующий файл из списка после завершения процедуры первого - PullRequest
0 голосов
/ 07 января 2019

У меня всего 3214 . doc. Мне нужно открыть первый файл, скопировать его содержимое, вставить его в RichEdit, извлечь некоторый текст, вставить его в базу данных, затем перейти к следующему файлу и повторить процедуру.

Пока мне удалось:

  • Открыть 1-й .doc / любой 1 .doc только
  • Скопируйте содержимое и вставьте его в RichEdit
  • Извлечение текста из RichEdit
  • Вставить извлеченный текст в базу данных
  • Закрыть открытый .doc и очистить содержимое RichEdit

Я загрузил все 3214 имен файлов по порядку в Memo.

Как только я закончу с первым файлом из списка, как мне теперь заставить его перейти к следующему .doc из списка и сделать то же самое, повторяя это, пока я не закончу все 3214 файлы .doc? В данный момент читаю о циклах, но пока не могу понять.

Код до сих пор:

procedure TForm1.Button4Click(Sender: TObject);
var
  content: string;
  StartPos: Integer;
  endPos: Integer;
  i: integer;
  fname: string;
  WordApp : Variant;    
begin
  WordApp := CreateOleObject('Word.Application');
  for i := 1 to 1 do    
    fname := Memo1.Lines[i - 1];
  WordApp.Visible := True;
  WordApp.Documents.Open('C:\Users\tcsh\Desktop\all\'+fname);
  WordApp.ActiveDocument.Select;
  WordApp.Selection.Copy;
  RichEdit1.Lines.Add(WordApp.Selection);
  WordApp.documents.item(1).Close;
  WordApp.Quit;

  content:= RichEdit1.Text;    
  //<text extract code is here>    
  begin
    //<sql code is here>
  end;

  RichEdit1.Clear;
  Edit1.Clear;
  Edit2.Clear;
  Edit3.Clear;
  Edit4.Clear;
  Edit5.Clear;
  Edit7.Clear;
  Edit8.Clear;
  //the TEdit's hold the extracted text so the sql can retrieve it from them and insert into the database
end;

Ответы [ 2 ]

0 голосов
/ 07 января 2019
for i := 1 to 1 do

Хммм, это будет запускаться только один раз ..

Вы также можете попробовать:

  • Создание объекта WordApp в каждой итерации,
  • Добавить задержку между каждой итерацией (используя Sleep и Application.ProcessMessages) (как указывает LU RD, в этом нет необходимости)

Пример кода ниже:

  for i := 0 to Memo1.Lines.Count - 1 do
  begin
    WordApp := CreateOleObject('Word.Application');
    fname := Memo1.Lines[i];
    WordApp.Visible := True;
    WordApp.Documents.Open(fname);
    WordApp.ActiveDocument.Select;
    WordApp.Selection.Copy;
    Memo2.Lines.Add(WordApp.Selection);
    Memo2.Lines.Add('===');
    WordApp.documents.item(1).Close;
    WordApp.Quit;
    //Sleep(1000);  -> not needed
    //Application.ProcessMessages;
  end;
0 голосов
/ 07 января 2019

Попробуйте с System.IOUtils.TDirectory.GetFiles

GetFiles('C:\temp\', '*.doc');

Вот пример

Вы найдете несколько здесь, на SO.

Обновление

...
var
line: string;
...   
for line in Memo1.Lines do begin
 <your code per file>
 ShowMessage(line);
end
...