如何使用 Lazarus 将 html table 文件打开到(字符串)网格中?
How to open a html table file into a (string)grid using Lazarus?
我是新来的,请随时就我的提问方式提供反馈。
对于学校的一个项目,我需要使用 Lazarus 在 stringgrid 中打开 html 包含表格的文件。我的老师说我需要使用 pos
来定位 html 标签,使用 <th>
和 <tr>
我应该可以定义行和列,但我找到了很难。
我还没有解决这个问题,我还停留在早期阶段。我正在尝试查看我的 pos
是否正常工作,但事实并非如此。我的想法:点击 Button1
将打开 OpenDialog1
。然后我选择一个 html 文件,我的程序将搜索 Pos('<th', filename)
中的文本(参见包含的代码)。该文本的位置将放在 Label1
.
中
我收到这个错误:
unit1.pas(46,30) Error: Incompatible type for arg no. 2: Got "TStringList", expected "Variant"
所以我的子问题是:如何在文件中使用 pos
?
这是我使用的代码。随时提问并提供反馈。提前致谢!
procedure HtmlToGrid(Grid: TStringGrid; const FileName: string; Sender: TObject);
var
TextFile, Line: TStringList;
Row: Integer;
Col: Integer;
prob: Integer;
begin
Grid.RowCount := 0; //clear any previous data
TextFile := TStringList.Create;
Textfile.LoadFromFile(filename);
prob := Pos('<th', TextFile);
if (Sender is TLabel) then
TLabel(Sender).Caption := IntToStr(prob);
end;
procedure TForm1.Button1Click(Sender: TObject);
var filename : string;
begin
if OpenDialog1.Execute then begin
filename:= OpenDialog1.FileName;
HtmlToGrid(database, filename, Label1);
end;
end;
我认为给你造成困难的一点是没有意识到曾经
您已将文件加载到 TStringList 中,TStringList 的内容可通过其文本 属性 作为字符串访问,因此您可以执行类似
的操作
var
P : integer;
[...]
P := Pos('<th', Textfile.Text).
但是,您可能希望逐行处理文件,这可以使用 TStringList 的字符串 属性 来实现,如
S := MyStringList.Strings[Index].
请注意字符串 属性 是从零开始的,因此第一个列表是 MyStringLIst.Strings[0]。
您可以像这样逐行处理您的 TextFile 内容
var
i : Integer;
[...]
for i := 0 to TextFile.Count - 1 do begin
if Pos('<th', TextFile.Strings[i]) > 0 then
{ do something }
end;
顺便说一句,最好给你的变量一个能反映它们类型的名称,'TextFile' 对实际上是 TStringList 的东西有点误导,所以名称 'StringList' 可能比 'TextFile'.
花半个小时阅读联机帮助中的 TStringList 是非常值得的。
我是新来的,请随时就我的提问方式提供反馈。
对于学校的一个项目,我需要使用 Lazarus 在 stringgrid 中打开 html 包含表格的文件。我的老师说我需要使用 pos
来定位 html 标签,使用 <th>
和 <tr>
我应该可以定义行和列,但我找到了很难。
我还没有解决这个问题,我还停留在早期阶段。我正在尝试查看我的 pos
是否正常工作,但事实并非如此。我的想法:点击 Button1
将打开 OpenDialog1
。然后我选择一个 html 文件,我的程序将搜索 Pos('<th', filename)
中的文本(参见包含的代码)。该文本的位置将放在 Label1
.
我收到这个错误:
unit1.pas(46,30) Error: Incompatible type for arg no. 2: Got "TStringList", expected "Variant"
所以我的子问题是:如何在文件中使用 pos
?
这是我使用的代码。随时提问并提供反馈。提前致谢!
procedure HtmlToGrid(Grid: TStringGrid; const FileName: string; Sender: TObject);
var
TextFile, Line: TStringList;
Row: Integer;
Col: Integer;
prob: Integer;
begin
Grid.RowCount := 0; //clear any previous data
TextFile := TStringList.Create;
Textfile.LoadFromFile(filename);
prob := Pos('<th', TextFile);
if (Sender is TLabel) then
TLabel(Sender).Caption := IntToStr(prob);
end;
procedure TForm1.Button1Click(Sender: TObject);
var filename : string;
begin
if OpenDialog1.Execute then begin
filename:= OpenDialog1.FileName;
HtmlToGrid(database, filename, Label1);
end;
end;
我认为给你造成困难的一点是没有意识到曾经 您已将文件加载到 TStringList 中,TStringList 的内容可通过其文本 属性 作为字符串访问,因此您可以执行类似
的操作var
P : integer;
[...]
P := Pos('<th', Textfile.Text).
但是,您可能希望逐行处理文件,这可以使用 TStringList 的字符串 属性 来实现,如
S := MyStringList.Strings[Index].
请注意字符串 属性 是从零开始的,因此第一个列表是 MyStringLIst.Strings[0]。
您可以像这样逐行处理您的 TextFile 内容
var
i : Integer;
[...]
for i := 0 to TextFile.Count - 1 do begin
if Pos('<th', TextFile.Strings[i]) > 0 then
{ do something }
end;
顺便说一句,最好给你的变量一个能反映它们类型的名称,'TextFile' 对实际上是 TStringList 的东西有点误导,所以名称 'StringList' 可能比 'TextFile'.
花半个小时阅读联机帮助中的 TStringList 是非常值得的。