OnGetText太慢,有什么好的办法? ( 积分: 17 )

  • 主题发起人 主题发起人 LJH1978
  • 开始时间 开始时间
L

LJH1978

Unregistered / Unconfirmed
GUEST, unregistred user!
界面上的字段为自动生成,为了达到数据的3NF,字段的实际值为代码,显示值为字符
如地区代码 "110104" 显示为 "北京市宣武区"我的具体做法是

在表的AfterOpen 事件中加入 FieldByName('名称').OnGetText :=NameOnGettext;//名称的获取显示的事件
procedure NameOnGetText(Sender :TField;Text :String; var DisplayText :Boolean );
var tb :TAdoDataSet; // 可以是一个共享的数据表,打开后不关闭;在这我就不创建了
begin
if DisplayText then
begin
tb.commandText :='select * from Table where 编号=' + Sender.dataset.FieldbyName ('编号').AsString;
tb.Open; //tb这个表可以放在一个公共的单元,在这里这打开会非常影速度
//打开后可以用定位的方法(Locate())获得属性,速度会比较快
Text :=sender.asString{原来的名称} + tb.规格 + tb.……

end;
end;

这样做能达到显示字符的目的,但一个要命的问题是,我这个软件中用了大量的代码,如地区,学历,职务等,
这样的话速度会非常慢,移动一条记录要1秒左右,别说用户受不了,自己感觉都实在太慢了,各位是如何解决这个问题的?
 
一般的做法是将这些需要被引用的表先打开,并取到本地作为缓存,这样在OnGetText事件里就不用打开表,速度就会快很多;
需要注意的是,打开/关闭数据集需要花费比较多的时间,取数据反而花不了太多时间(除非你的数据特别多).
 
to dreamisx
我是在窗体创建时就打开数据集,在OnGetText事件事件中根据参数定位
 
用表连接的办法,
可以这样做,原先的表不变(select * from a),查询时同时再作一个查询连接(select * from a inner join b on a.id=b.id)
OnGetText
代码改成
data2.recno:=data1.recno
text:=data1.fieldbyname('field').asstring
这样做省了滚动时的OPEN
 
没有什么更好的办法了吗?

看到一个软件HRP,里面的代码有100多个,用DBEDIT显示字符,保存代码,它的就很快,不知如何做到的?
 
这个gettext经常执行的,不应该在里面执行.open类的费时动作

可以在查询的时候将"名称"字段查询出来,楼上的left join或者一些子查询都可以
select id, (select caption from b where b.id=a.id) as caption from a

比较好的解决是在表里面增加一列"名称",直接看表的时候可以看出内容,维护也比较方便
 
多人接受答案了。
 

Similar threads

X
回复
0
查看
821
xalion
X
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部