急急急 高手请进 ,奇怪的问题 , 在线等待啊, 恳请高手帮忙啊(50分)

  • 主题发起人 主题发起人 zm790607
  • 开始时间 开始时间
Z

zm790607

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.AddClass(AId: integer;FatherNode:TTreeNode);
var
QryTmp:TADOQuery;
myNode:TTreeNode;
myLabel:TLabel;
begin
QryTmp:=TADOQuery.Create(self);
QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'test.mdb;Persist Security Info=False';
QryTmp.SQL.Add('select * from tb1');
QryTmp.SQL.Add('where FatherId='+inttostr(AId));
QryTmp.Open;
while not QryTmp.Eof do
begin
myNode:=Treeview1.Items.AddChild(FatherNode,QryTmp.fieldbyname('CName').AsString);

//创建标签,caption存放各分支的AutoId表识
myLabel:=TLabel.Create(self);
myLabel.Visible:=false;
myLabel.Caption:=QryTmp.fieldbyname('AutoId').AsString;
myNode.Data:=myLabel;

AddClass(QryTmp.fieldbyname('AutoId').AsInteger,myNode); //递归调用过程
QryTmp.Next;
end;
QryTmp.Free;
end;


把 QryTmp.fieldbyname('AutoId').AsInteger 换成 DataModule1.ADOQuery1.FieldValues['autoid'] 就出现bug 不知道是哪里的问题 ,
真郁闷啊 ,请高手 帮忙啊 指点一下啊 先谢谢啦
 
FieldValues['autoid'],当然是这个地方了
 
呵呵,其实很简单,你写完ADOQuery1后就'.'后面就会带出他的属性,然后看看有没有你要的FieldValues存不存在
 
老兄, 我想了好久了, 我也认为是这个地方,可是 改了还是不行啊 你又没
qq 我的 qq:284664693 帮我想想办法啊

先谢谢了
 
出错提示是什么?fieldvalues是类型自动转换的,可能不适合你的形参啊
 
to bluesweet
但是,我用的是 fieldbyname 也是这样啊,
我觉得好像是我关闭 了
连接的原因
 
奇怪了,可能是其他原因造成的
 
有没有人想想办法啊, 着急啊
 
怎么这么多人看还是没有人帮忙呢? 想想办法啊
 
错在哪步了,什么错误提示?
 
当值为空(NULL)的时候FieldValues['autoid']是要出错的
 
DataModule1.ADOQuery1.Close;
DataModule1.ADOQuery1.SQL.Clear;
sql := 'select * from tb1 where FatherId='+IntToStr(AId);
//DataModule1.ADOQuery1.SQL.Add('select * from tb1');
//DataModule1.ADOQuery1.SQL.Add('where FatherId='+IntToStr(AId));
DataModule1.ADOQuery1.SQL.Add(sql);
//DataModule1.ADOQuery1.ExecSQL;
DataModule1.ADOQuery1.Open;
while not DataModule1.ADOQuery1.Eof do
begin
myNode:=Treeview1.Items.AddChild(FatherNode,DataModule1.ADOQuery1.fieldbyname('CName').AsString);

//创建标签,caption存放各分支的AutoId表识
myLabel:=TLabel.Create(self);
myLabel.Visible:=false;
myLabel.Caption:=DataModule1.ADOQuery1.fieldbyname('AutoId').AsString;
myNode.Data:=myLabel;

showmessage(inttostr(DataModule1.ADOQuery1.fieldbyname('AutoId').AsInteger));
AddClass(DataModule1.ADOQuery1.fieldbyname('AutoId').AsInteger,myNode); //递归调用过程
DataModule1.ADOQuery1.Next;
end;
DataModule1.ADOQuery1.Free;

出现了 循环上面 DataModule1.ADOQuery1.Free; 好像是这个的问题 , 现在这个是我调试的代码 和 FieldValues 没有关系了 我用的是 fieldbyname 得到数据库中的值,
只不过在后面 向下循环的时候出现的问题
 
上面的朋友能不能在qq上面交流 ,比较方便, 谢谢啦
 
你的是递归调用,循环到最底层,把DataModule1.ADOQuery1给释放了,以后在用就错误了
开始你的都是动态创建的,每次调用都创建了新的对象,所以释放的时候就不会有错误了
 
to d5love,
有道理啊, 不过我不知道该怎么改了 怎么办呢?
 
那就象开始的代码那样,动态创建呀
每层节点都要有自己的ADOQuery对象,不能用一个对象,那样的话SQL.Clear之后,覆盖了上层未完成的while循环
 
老兄 有没有办法啊,我 的目的就是为了要用 datamodule 的 , 如果要每次创建的话 ,刷新的时候没法一次刷新的

而且在配置数据库的时候都要改写代码
 
做一些更新操作,可以不刷新,
Treeview的节点操作,和数据库的更新分开操作,如先删除节点对应数据,再删除节点
前提是每个节点需要挂接个自定义的对象存储你节点对应的数据,(以前看别人写过现在记不太清楚了)
 
myNode.Data:=myLabel;这句话好象只是引用了mylabel一次然后就不用了。
你后面要free的是不是mylabel啊,而不是 DataModule1.ADOQuery1.Free;它本来就在的。
 
后退
顶部