收录日期:2018/05/22 08:53:32 时间:2016/05/20 18:27:24 标签:基础类
动态创建控件时的问题. 
开始运行没有问题,但在程序里多取几次n的值就会出错,请问这是怎么回事? 
如何解决???? 
int n=ADOQuery2->FieldCount; 
for(int i=0;i<11;i++) 

if(TEdit2[i]!=NULL) 

TEdit2[n]->Free(); 
DLabel[n]->Free(); 


for(int i=0;i<n;i++) 

TEdit2[i]=new TEdit(this); 
DLabel[i]=new TLabel(this); 
}
看不出什么意思?i,n,11
int n=ADOQuery2->FieldCount; 
for(int i=0;i<11;i++)  //11???

if(TEdit2[i]!=NULL)  //i???

TEdit2[n]->Free(); //n???
DLabel[n]->Free(); //n???



for(int i=0;i<n;i++) 

TEdit2[i]=new TEdit(this); 
DLabel[i]=new TLabel(this); 
}

你没有给出具体的edit和label new时候的代码,我怀疑你的TEdit[n]虽然不等于空,但并不等于DLabel[n]也不等于空啊!还有,你不要用递增来遍历,尝试一下用递减
你说话顺序太乱,能不能说的具体一些?例如:TEdit2和DLabel两个组什么时候建立,什么时候删除?
edit和lable是同时创建,也同时删除,窗体show的时候创建,但每次创建之前把原来创建的删除
n是数据表的字段数,总是n<11,循环变量,创建和删除的代码都在上面了
对不起,开始代码写错了点,现更正如下
int n=ADOQuery2->FieldCount; 
for(int i=0;i<11;i++) //i是循环变量, 

if(TEdit2[i]!=NULL)  

TEdit2[i]->Free(); //在这里删除
DLabel[i]->Free(); 



for(int i=0;i<n;i++) //n总是小于11

TEdit2[i]=new TEdit(this); //在这里创建
DLabel[i]=new TLabel(this); 
}
int n=ADOQuery2->FieldCount; 
for(int i=0;i<n;i++)  //11???

  if(TEdit2[i]!=NULL)  //i???
  { 
    delete TEdit2[i];
    TEdit2[i]=NULL;

  } 
  if(DLabel[i]!=NULL)  //i???
  { 
    delete DLabel[i];
    DLabel[i]=NULL;

  } 

for(int i=0;i<n;i++) 

  TEdit2[i]=new TEdit(this); 
  DLabel[i]=new TLabel(this); 
}
用了zjqyb() 的方法后,问题好像解决了,至少现在我切换了好几次都没出现问题.
但zjqyb()你能告诉我为什么吗?
你不应该use
  TEdit2[i]->Free();
  DLabel[i]->Free(); 
去析构
何况析构后TEdit2[i]也不可能为NULL
必须自己Tedit2[i]=NULL


delphi中use :FreeAndNil(TEdit2[i])
多谢