Delphi - 一旦第一个过程完成,从列表中打开下一个文件

Delphi - open next file from a list once procedure finishes on the first

我总共有 3214.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;

尝试 System.IOUtils.TDirectory.GetFiles

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

这是一个example

您会在 SO 上找到一些。

更新

...
var
line: string;
...   
for line in Memo1.Lines do begin
 <your code per file>
 ShowMessage(line);
end
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;