Delphi-在第一个步骤完成后,打开列表中的下一个文件

时间:2019-01-07 07:24:42

标签: delphi delphi-10.2-tokyo

我总共有 3214 doc。我需要打开第一个文件,复制其内容,将其粘贴到RichEdit中,提取一些文本,将其插入数据库中,然后移至下一个文件并重复该过程。

到目前为止,我已经设法:

  • 仅打开第一个.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 :(得分:1)

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;

答案 1 :(得分:0)

尝试使用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