关于TList类的困惑,这段代码如何优化。(50分)

  • 主题发起人 主题发起人 hmily1688
  • 开始时间 开始时间
H

hmily1688

Unregistered / Unconfirmed
GUEST, unregistred user!
[:(]MyBtnList为一个List类,其中为其赋值代码如下
while (!ADODataSet1->Eof)
{
TmpBtnInfo->ID = ADODataSet->FieldByName("ID")->AsInteger;
//TmpBtnInfo为一record类型,NewBtn为按钮对像
TmpBtnInfo->BtnAddress = NewBtn;// 把内存地址传给BtnAddress
ADOdataSet->Next();
}
我现在选定了某个按钮,我如何确定其id值呢,我的代码如下
PBtnInfo MyBtnInfo = NULL;
MyBtnInfo = (PBtnInfo) (MyBtnList->Items);
for (int i = 0;
i < MyBtnList->Count;
i++)
{
MyBtnInfo = (PBtnInfo) (MyBtnList->Items);
if (MyBtnInfo->BtnAddress == UserSelectedBtn)
{
ShowMessage(String(MyBtnInfo->RecID));
}
} //for
其中 UserSelectedBtn 为我当前选中的按钮,在这个按钮的onmousedown中取得
UserSelectedBtn = dynamic_cast<TPanel *>(Sender);
我想把取id值的代码优化,有没有别的写法
 
我谈谈自己的想法,不一定对啊
我想关键是你要优化向MyBtnList赋值的这段代码,因为如果象你上面那样没有规律地将
TmpBtnInfo类型的数据赋值给MyBtnList,那么将来在从MyBtnList里向外取值的时候,就
只有循环穷举了。
我大致想了一下,应该是每向MyBtnList赋一个值的时候,做一下判断BtnAddress,以决定是追加(Append)
还是插入(Insert),这样,所有数据都赋值完了,也就是排好序了,取值也就可以直接取出了。
这个,我再想一下,到底怎么写代码,如果想好,就告诉你。
另外,给你提个建议,看你用的是C++Builder,如果TList类型的数量很大,比如:超过5000,
那么最好就不要用TList了,而改用C++语言独有的利器--STL(标准模板库)
 
哈哈,没有那么多,到多也就是100条吧,为其赋值是从数据库中取出来的,一个表中
保存有按钮的left,top,还有id(唯一),然后从库中取出这些值,来画在一个ScrollBox组
件上,动态创建 这些组件(TPanl型的),我就只能用while (!eof)这种取了。[V]
 
你把ID放在动态创建的控件(Button,Panel等等都可以)Tag属性中不就方便了。
 
谢谢各位,关键是我的Tag属性中已有东西放了。
 
哦,这么回事啊!
那你可以这样吗,既然ID是唯一标识不同按钮的,那么你在动态建立这些按钮的时候就可以这样,比如:
ID=1的按钮,命名为Name:='Button'+IntToStr(ID),然后在点击某个按钮的时候,在用SubString等函数将这个
ID分离出来,不就行了吗! :) 唉!前面想复杂了.
具体这样:
命名时:Name = "Button" + IntToStr(ID);
点击按钮时:StrToInt(Name.SubString(7, Name.Length()-6));
//因为“Button”是6个字符
 
哈哈,其实还是不行,不过谢谢你,给分了,我的ID是种子字段(自增型),在我动态创建
是并不知道其ID值,未保存数据库前其值为-1,如果还没有保存到数据库我又想删除,则不
有多个-1的值,所以现在不考虑那么多了,反正客户的机器是pentium2.4G,256ddr内存,不
管了,就这么做吧。
 
多人接受答案了。
 
后退
顶部