求教,代码运算速度可以加快? ( 积分: 100 )

  • 主题发起人 主题发起人 optn3
  • 开始时间 开始时间
O

optn3

Unregistered / Unconfirmed
GUEST, unregistred user!
memo1.text数据量大时,比如几千行时,执行代码很慢,怎样才能加快。
代码意为:对memo1中出现相同符合ComboBox1.Text的数抽出来。

private
{ Private declarations }
sl1: tstringlist;
sl2: tstringlist;

procedure TForm1.getmemotext(var list: tstringlist); //memo1按条件统计出现次多的保留
var i: Integer;
s: string;
ss:TStringList;
begin
ss:=TStringlist.Create;
ss.Text := memo1.Text;
list.Clear;
for i := 0 to ss.Count - 1 do
begin
s := list.Values[ss];
if s = '' then
begin
s := '1';
list.Add(ss+'='+ s);
end else
list.Values[ss] := IntToStr(StrToInt(s)+1);
end;
ss.Free;

end;

procedure TForm1.Button1Click(Sender: TObject);
var i,j,g: Integer;
sk:TStringList;
begin
sk:=TStringlist.Create;
sk.Text := memo1.Text;

getmemotext(sl1);
j := 0;
for i := 0 to sk.Count - 1 do
if sl1.Values[sk[j]] <> '' then
//////////////从combobox3中选择参数作为条件 在memo1中进行过滤
begin
if form1.ComboBox3.Text = '>=' then
if StrToInt(sl1.Values[sk[j]]) < StrToInt(ComboBox1.Text) then
sk.Delete(j)
else
j := j + 1;
if form1.ComboBox3.Text = '>' then
if StrToInt(sl1.Values[sk[j]]) <= StrToInt(ComboBox1.Text) then
sk.Delete(j)
else
j := j + 1;
if form1.ComboBox3.Text = '<' then
if StrToInt(sl1.Values[sk[j]]) >= StrToInt(ComboBox1.Text) then
sk.Delete(j)
else
j := j + 1;
if form1.ComboBox3.Text = '<=' then
if StrToInt(sl1.Values[sk[j]]) > StrToInt(ComboBox1.Text) then
sk.Delete(j)
else
j := j + 1;
if form1.ComboBox3.Text = '=' then
if StrToInt(sl1.Values[sk[j]]) <> StrToInt(ComboBox1.Text) then
sk.Delete(j)
else
j := j + 1;
end;
{ if StrToInt(sl1.Values[Memo1.Lines[j]]) < StrToInt(ComboBox1.Text) then
Memo1.Lines.Delete(j)
else
j := j + 1; }
memo1.Text := sk.Text;
sk.Free;
getmemotext(sl1);
end;
 
象这样写代码, 能快嘛?
 
to duhai_lee,老大,怎样写才快。
 
既然是数字比较,就干脆开数字数组,而不是每次比较时候做转化
由于循环前,比较条件已经确定,就把先判断比较方式再循环。

补充一下,如果用装到clientdataset ,然后在条件过滤,是否可行[:D]
 
你要统计什么
1 在tstringlist中第一行加入"字段1"
1 把Tstringlist中的数据存储成本地TXT文件
2 要求转化成SQL的条件 " and length(字段1)"+ComboBox3.Text +ComboBox1.Text
2 ADOConnection.Execute(format('Select [字段1] from [Text;Database=e:/temp].1.txt where 1=1 %s',[条件]);
如果要显示可以用DBGRID显示,如果要用MEMO显示可以用下面这个查询语句
ADOConnection.Execute(format('Select [字段1] into [Text;Database=e:/temp].temp.txt from [Text;Database=e:/temp].1.txt where 1=1 %s',[条件]);
e:/temp/temp.txt就是查询的结果,我想这个查询的效率应该还可以吧
 
后退
顶部