我在做一个实例时,遇到以下代码,通不过,不明白问题出在哪里,在此愿诸位大侠解惑
procedure TForm1.LoadDataForTreeView;
var
RootNode,GroupNode,RecordNode:TTreeNode;
PtrMyData:PMyData;
NodeName:String;
begin
TreeView1.Color:=rgb($FF,$FF,$E0);
//
RootNode:=treeview1.Items.Add(Nil,'通讯录');
RootNode.ImageIndex:=0;
RootNode.SelectedIndex:=0;
//
with tblgroup do
begin
open;
while not eof do
begin
PtrMyData:=new(PMyData);//?
PtrMyData.Id:=fieldbyname('group_id').asinteger;
PtrMyData.NodeType:=0;
NodeName:=fieldbyname('group_name').asstring;
//
groupnode:=treeview1.Items.AddChildObject(RootNode,NodeName,PtrMyData);//?
groupnode.ImageIndex:=1;
groupnode.SelectedIndex:=1;
RecordNode:=TreeView1.Items.AddChild(groupnode,'none');
next;
end;
//destroy PMyData;
close;
end;
RootNode.Expanded:=true;
end;
//以上代码中带"?"的是通不过的地方
//以下为TMyData的定义
//定义记录类型TMyData
type
PMyData=Record
Id:integer;
NodeType:integer;
end;
procedure TForm1.LoadDataForTreeView;
var
RootNode,GroupNode,RecordNode:TTreeNode;
PtrMyData:PMyData;
NodeName:String;
begin
TreeView1.Color:=rgb($FF,$FF,$E0);
//
RootNode:=treeview1.Items.Add(Nil,'通讯录');
RootNode.ImageIndex:=0;
RootNode.SelectedIndex:=0;
//
with tblgroup do
begin
open;
while not eof do
begin
PtrMyData:=new(PMyData);//?
PtrMyData.Id:=fieldbyname('group_id').asinteger;
PtrMyData.NodeType:=0;
NodeName:=fieldbyname('group_name').asstring;
//
groupnode:=treeview1.Items.AddChildObject(RootNode,NodeName,PtrMyData);//?
groupnode.ImageIndex:=1;
groupnode.SelectedIndex:=1;
RecordNode:=TreeView1.Items.AddChild(groupnode,'none');
next;
end;
//destroy PMyData;
close;
end;
RootNode.Expanded:=true;
end;
//以上代码中带"?"的是通不过的地方
//以下为TMyData的定义
//定义记录类型TMyData
type
PMyData=Record
Id:integer;
NodeType:integer;
end;
解决方案 »
- 前所未见...朋友们来看看啊..界面调用存储过程问题..
- 深夜发帖!急需解决的问题,请大家多多帮忙!(100分,如解决,另开帖给分!)
- 急,在线等
- 请教下关于模糊查询的问题
- ADOQuery 中为什么不能用GO
- 心情不好,来给亮剑大哥吐槽吐槽
- 请教,如何解决,我的一个表有10个字段,但是在规划Quickrep的时候,一行最多只能放6个字段~~~
- 在memo中只显示汉字字符而不显示英文字符和数字?
- 如何动态改变EXE文件的图标,用什么工具呀?能不能详细说明呀?
- 急!大家帮帮忙!delphi新手!在线等待解决问题!
- TreeView生成树形结构,数据库结构比较特别,本人是通过递归画树的方式,画TreeView树,但是不成功,请各位高手不吝赐教;
- TDBGrid的一个问题
var
RootNode,GroupNode,RecordNode:TTreeNode;
PtrMyData:pPMyData;
NodeName:String;
begin
TreeView1.Color:=rgb($FF,$FF,$E0);
//
RootNode:=treeview1.Items.Add(Nil,'通讯录');
RootNode.ImageIndex:=0;
RootNode.SelectedIndex:=0;
//
with tblgroup do
begin
open;
while not eof do
begin
new(PtrMyData);
PtrMyData.Id:=fieldbyname('group_id').asinteger;
PtrMyData.NodeType:=0;
NodeName:=fieldbyname('group_name').asstring;
//
groupnode:=treeview1.Items.AddChildObject(RootNode,NodeName,PtrMyData);//?
groupnode.ImageIndex:=1;
groupnode.SelectedIndex:=1;
RecordNode:=TreeView1.Items.AddChild(groupnode,'none');
next;
end;
//destroy PMyData;
close;
end;
RootNode.Expanded:=true;
end;
//以上代码中带"?"的是通不过的地方
//以下为TMyData的定义
//定义记录类型TMyData
type
pPMyData=^PMyData;
PMyData=Record
Id:integer;
NodeType:integer;
end;
function TMyTreeView.DataSetToTreeNode(
mDataSet: TDataSet; //数据源
mFieldNameParent: string; //父节点字段名--Tree(树表)表中的ParentNodeID字段
mFieldNameTreeText: string; //节点文本字段名--Tree表中的NodeText
mFieldNameTreeId: string; //每个节点标识字段名--Tree表中的DodeID
mTreeView:TRztreeView; //要操作的树
mTreeNode: TTreeNode; //要添加的节点 (递归对象)
mParentText: string): Boolean; //第一个父节点
var
vTreeNode: TTreeNode;
vFieldValues: Variant;
vFieldNames: string;
begin
Result := False;
if not Assigned(mDataSet) then Exit;
if not Assigned(mTreeView) then Exit;
if not mDataSet.Active then Exit;
vFieldNames := Format('%s;%s;%s',
[mFieldNameParent, mFieldNameTreeText, mFieldNameTreeId]);
mDataSet.Filtered := False;
mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
mDataSet.Filtered := True;
if mDataSet.RecordCount = 0 then Exit;
mDataSet.First;
while not mDataSet.Eof do begin
vTreeNode := mTreeView.Items.AddChild(mTreeNode,
mDataSet.FieldByName(mFieldNameTreeText).AsString); vFieldValues := mDataSet[vFieldNames];
DataSetToTreeNode(mDataSet, mFieldNameParent, mFieldNameTreeText,
mFieldNameTreeId, mTreeView, vTreeNode,
mDataSet.FieldByName(mFieldNameTreeId).AsString);
///////Begin 恢复位置
mDataSet.Filtered := False;
mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
mDataSet.Filtered := True;
mDataSet.Locate(vFieldNames, vFieldValues, []);
///////End 恢复位置
mDataSet.Next;
end;
//下面的一定要,否则修改的时候不能定位
mDataSet.Filtered := False;
Result := True;
//下面是整个Tree的属性设置,可以根据不同需要而进行设置。
mTreeView.FullExpand;//全部展开
mTreeView.HideSelection:=false;//是否自动隐藏所选项
mTreeView.hotTrack:=true;//鼠标移动到控件上时,是否显示特殊的鼠标符号?
mTreeView.Items[0].Selected:=true;
end;
用你的代码,问题马上解决,谢谢,不过有些地方不是太明白,我刚学DELPH,恳请大侠多多解惑
1、该段代码是用来定义记录的,pPMyData=^PMyData;是干什么的,是不是定义指针类型
type
pPMyData=^PMyData;
PMyData=Record
Id:integer;
NodeType:integer;
end;
2、以下代码中PtrMyData:pPMyData;
procedure TForm1.LoadDataForTreeView;
var
RootNode,GroupNode,RecordNode:TTreeNode;
PtrMyData:pPMyData;
NodeName:String;
3、
new(PtrMyData);
//
这三处代码应该是一系列整体,都是为了new(PtrMyData);
能否给我详细介绍一下,new的用法,及这三处代码的关系,为什么这样写
谢谢