Delphi - 一旦第一个过程完成,从列表中打开下一个文件
Delphi - open next file from a list once procedure finishes on the first
我总共有 3214.doc
。我需要打开第一个文件,复制其内容,将其粘贴到 RichEdit
中,提取一些文本,将其插入数据库,然后转到下一个文件并重复该过程。
到目前为止我已经做到了:
- 打开第一个 .doc/any 仅 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;
尝试 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;
我总共有 3214.doc
。我需要打开第一个文件,复制其内容,将其粘贴到 RichEdit
中,提取一些文本,将其插入数据库,然后转到下一个文件并重复该过程。
到目前为止我已经做到了:
- 打开第一个 .doc/any 仅 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;
尝试 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;