请问这是什么原因!(0分)

  • 主题发起人 主题发起人 Free_sky
  • 开始时间 开始时间
F

Free_sky

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做树形图时(连接SQL数据库),在增加节点时,加一个节点没有问题!
再加节点时就提示如下错误!
Project Project1.exe raised exception class EAccessViolation with message 'Access
violation at address 004784B8 in module 'PROJECT1.EXE'.Read of address FFFFFFFF'.
Process stopped.Use Step or Run to continue.
请问这是什么错误!我要把树形图做成网络版,有很多人同时输入,要保证正常运行!
请问如何解决!请高手指点!谢谢您!
 
太惨了,没有高手释疑吗?
如果需要分,有了我一定给!
 
你应当将你的树形图生成代码写出,才好解决。估计是对象没有用好。
 
增加节点的代码如下!请指点!
type
TTemp=record
vid:string;
vname:string;
end;
PTemp=^TTemp;

procedure TForm1.N4Click(Sender: TObject);
var
InsertNode,SelectNode:TtreeNode;
str,code:string;
ATemp:PTemp;
begin
treeview1.MultiSelect :=false;
SelectNode:=treeview1.Selected;
case SelectNode.Level of
0:
with query1 do
try
treeview1.Items.BeginUpdate;
InsertNode:=treeview1.Items.AddChild(treeview1.Selected,'Name');
treeview1.Items.EndUpdate;
treeview1.Selected.Expand(true);
insertNode.Focused:=true;
InsertNode.EditText ;
try
close;
sql.Clear;
SQL.Add('insert into TempMx(id,DB0) values (:vid,:vname) ');
ParambyName('vname').asstring:='0';
query3.Close;
query3.SQL.Clear;
query3.SQL.Add('select MAX(DISTINCT ID) AS Expr1 FROM TempMx WHERE ({ fn LENGTH(ID) } = 3)');
query3.Open;
if query3.FieldByName('Expr1').AsString='' then
begin
ParambyName('vid').asstring:='101';
end
else
begin
ParambyName('vid').AsString:=inttostr(strtoint(query3.FieldByName('Expr1').AsString)+1);
end;
ExecSql;
treeview1.Update;
query2.Close;
query2.SQL.Clear;
query2.SQL.Add('select * from TempMx where id="'+query1.ParambyName('vid').asstring+'" order by id');
query2.Open;
except
MessageDlg('增加新节点失败!',mtInformation,[mbOk],0);
end;
finally
free;
end;
1:
with query1 do
try
ATemp:=new(PTemp);
ATemp^.vid :=trim(fieldbyname('id').AsString);
code:=Ptemp(SelectNode.Data)^.vid;
treeview1.Items.BeginUpdate;
InsertNode:=treeview1.Items.AddChildObject(SelectNode,'Name',ATemp);
treeview1.Items.EndUpdate;
treeview1.Selected.Expand(true);
insertNode.Focused:=true;
InsertNode.EditText ;
try
close;
sql.Clear;
SQL.Add('insert into TempMx(id,DB1,SID) values (:vid,:vname,:id) ');
ParambyName('vname').asstring:='1';
ParambyName('id').AsString :=code;
query3.Close;
query3.SQL.Clear;
query3.SQL.Add('select MAX(DISTINCT ID) AS Expr1 FROM TempMx WHERE ({ fn LENGTH(ID) } = 6) AND (SUBSTRING(ID, 1, 3) = "'+code+'")');
query3.Open;
if query3.FieldByName('Expr1').AsString='' then
begin
ParambyName('vid').asstring:=code+'201';
end
else
begin
ParambyName('vid').AsString:=inttostr(strtoint(query3.FieldByName('Expr1').AsString)+1);
//str:=parambyname('vid').AsString;
end;
ExecSql;
treeview1.Update;
query2.Close;
query2.SQL.Clear;
query2.SQL.Add('select * from TempMx where id like ("'+copy(code,1,3)+'"+"%") order by id');
query2.Open;
//if query2.RequestLive=false then
//begin
//query2.RequestLive:=true;
//query2.Edit;
//end;
except
MessageDlg('增加新节点失败!',mtInformation,[mbOk],0);
end;
finally
free;
end;
end;
。。。。。。
下面还有几层,大体一样!
 
ATemp:=new(PTemp);
ATemp^.vid :=trim(fieldbyname('id').AsString);
code:=Ptemp(SelectNode.Data)^.vid;
问题好象出在这里,但不知什么原因,如何解决呢?
 
你的selectNode赋值不对:
在程序开始处
begin
treeview1.MultiSelect :=false;
SelectNode:=treeview1.Selected;
不应当一开始就赋值,应先判断treeview1.selected是否存在,这时如果值不存在就会在
code:=Ptemp(SelectNode.Data)^.vid;
处出现以上错误,所以在每次引用selectNode 时都应当保证其有确定的值.有时不好判断,我在写出
程序时就曾在此处被整的头大。
 
很感谢您!
可是我是在用右键选中节点以后才增加啊!也就是说
treeview1.selected是肯定存在的啊!
 
我code显示的数据当id太大时(比如:101201301401)那么
code和id的数据不一致
 
你可以跟踪一下,使用Ctrl+F5增加表达式Ptemp(SelectNode.Data)^.vid,在对话框中选
中allow function calls,如果selectnode没有赋值的话,就会出现提示表示无法存取
 
好象真的是这个问题啊!提示的错误是
inaccessible value。请问你是怎么解决
这个问题的啊!
 
tt:=treeview1.selected;
if tt=nil then 没有赋值
 
好象解决不了问题啊!还是那个讨厌的错误!
大家救命啊
 
接受答案了.
 
后退
顶部