(关于new )其实也不简单啊 还没有解决 也许是专家级别的 我是不是太吝啬了 王邦东是我,给我提个醒吧,是不是delphi的bug啊 (100分)

  • 主题发起人 主题发起人 cyf_00002
  • 开始时间 开始时间
C

cyf_00002

Unregistered / Unconfirmed
GUEST, unregistred user!
各位前辈好:
我是个delphi的初学者,
希望各位前辈能多多帮忙。
问题如下:
定义记录:
type
pdata=^nodedata;
nodedata=record
value:string;
wjbm:string;
sq:string;
end;

添加树节点:
var
nodx :ttreenode;
p1:pdata;
begin
nodx:=treeview1.selected;
new(p1);//(应该是new的错误)
p1^.value='1';
p1^.wjbm='1 ';
p1^.sq='1';
nodx=treeview1.items.addchildobject(nodx,'实验',p1);//(在此产生异常)
end;
奇怪的问题
在别处写的代码运行的很正常,但在此处产生异常,说是new产生的地址不能写,我很纳闷
希望各位大侠帮帮忙

以前在PB里面也遇到过这类问题 在别处的代码在这里就不行 哈
 
為什麼我看不到問題內容?
 
>>nodx=treeview1.items.addchildobject(nodx,'实验',p1);//(在此产生异常)
老兄,改成这样呢?
nodx=treeview1.items.addchildobject(nodx,'实验',tobject(p1));
其实tTreeNode本身就有属性:Data来保存Pointer,
干嘛要AddObject啊?
 
大哥:
还是哪样啊,不行啊,
出错的地方是new那几行的代码,new 分配的地址不能写
提示是:EAccessViolation 错误发生在00404684 readofaddress的时候
有那位大哥能系统的讲讲new的用法啊

 
我用Delphi6,把你的代码原样贴进去,一点问题也没有呀
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
TreeView1: TTreeView;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

pdata=^nodedata;
nodedata=record
value:string;
wjbm:string;
sq:string;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
nodx :ttreenode;
p1:pdata;
begin
nodx:=treeview1.selected;
new(p1);
p1^.value :='1';
p1^.wjbm :='1 ';
p1^.sq :='1';
nodx :=treeview1.items.addchildobject(nodx,'实验',p1);
end;


end.
 
大哥:
我写的例子是这样的,一样的代码在别的地方很正常,但就是我那块代码里面不行,
我也不知道怎么回事,应该是new的问题吧,我把那段代码写下来请大哥看看是怎么回事啊
真的很不好意思,我公司就我一个从VB往DELPHI转,现在做一个小程序(不是例子啊)
但就在这块给打住了,也可以用别的办法,但要大改程序了,
procedure TF_sq.BitBtn1Click(Sender: TObject);//添加书签
var
nodx:ttreenode;
p2:^pdata;
str_temp:string;
str_parent:string;
str1:string;
begin
try
nodx:=treeview1.Selected ;
if nodx=nil then
begin
showmessage('请选择好目录在进行该操作');
exit ;
end;
if ((wj_bm='') or (sq='' ))then
begin
showmessage('请选择好书签在进行该操作');
exit ;
end;
str_parent:=pdata(nodx.data)^.value ;
// '界面处理

max_id:=max_id+1;
str1:=sq_name(wj_bm,sq);//是个求名称的函数
showmessage(str1);

// new命令产生的错误 为什么会这样呢?得问专家

new(p2);
str_temp:= inttostr(max_id);
p2^.value :=str_temp;
p2^.wjbm :=wj_bm;
p2^.sq :=sq ;
//地址操作完就出现错误,也许是我系统是事情吧,但别的地方都可以啊,也解释不通

// nodx :=treeview1.Items.AddChildObject(nodx,str1,tobject(p1));
nodx :=treeview1.Items.AddChild(nodx,str1);
nodx.Data :=p1;
//下面是写入数据库
end;
 
大家给我个建议也好啊,
 
p2:^pdata;
这一行声明不对呀,这成了指向指针的指针了,直接p2:pdata;就可以啊,我有个程序与你这段
代码几乎一样,没有问题啊.
 
同意YoungSun
p2:^pdata;有错
直接写p2: pdata 就可以了
Delphi中的例子
The following code defines a record type of TMyRec and a record pointer type of PMyRec.

type
PMyRec = ^TMyRec;
TMyRec = record
FName: string;
LName: string;
end;

Assuming these types are used, the following code adds a node to TreeView1 as the last sibling of a specified node. A TMyRec record is associated with the added item. The FName and LName fields are obtained from edit boxes Edit1 and Edit2. The Index parameter is obtained from edit box Edit3. The item is added only if the Index is a valid value.

procedure TForm1.Button1Click(Sender: TObject);

var
MyRecPtr: PMyRec;
TreeViewIndex: LongInt;
begin
New(MyRecPtr);
MyRecPtr^.FName := Edit1.Text;
MyRecPtr^.LName := Edit2.Text;
TreeViewIndex := StrToInt(Edit3.Text);
with TreeView1 do
begin
if Items.Count = 0 then
Items.AddObject(nil, 'Item' + IntToStr(TreeViewIndex), MyRecPtr)
elseif (TreeViewIndex < Items.Count) and (TreeViewIndex >= 0) then
Items.AddObject(Items[TreeViewIndex], 'Item' + IntToStr(TreeViewIndex), MyRecPtr);

end;
end;
 
哈:
谢谢了
谢谢各位
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
后退
顶部