那位先生愿意为我解释这个问题? ( 积分: 50 )

  • 主题发起人 主题发起人 liu55721
  • 开始时间 开始时间
L

liu55721

Unregistered / Unconfirmed
GUEST, unregistred user!
该程序很大,只摘要了与问题相关的一段中的几句:

type
TMainForm = class(TForm)
ClientPageCtrl: TPageControl;
ShareTabSheet: TTabSheet;
LanTree: TListView;
FindListView: TListView;
.
.

type
PMyTreeItem = ^TMyTreeItem;
TMyTreeItem = record
DirName,Group: string;
TabIndex: integer;
MyClientListView:TListView;
MyRightListItem:TListItem;
end;
type
PListItem = ^TMyListItem;
TMyListItem = record
index,count: integer;
PrevDirItem, NextDirItem, UpDirItem: TListItem;
end;

.
.
var
MainForm : TMainForm;
CurDirName,CurGroupName:string;
CurListView: TListView;
CurDirItem: TListItem;

{$R *.DFM}

.
.
procedure TMainForm.MyListViewClick(Sender: TObject);
var
ListItemPtr : PListItem;
ListItem : Tlistitem;
begin
if pMyTreeItem(LanTree.Selected.Data)^.TabIndex <> 0 then
begin
ClientPageCtrl.ActivePageIndex := pMyTreeItem(LanTree.Selected.Data)^.tabindex;
CurListView:=pMyTreeItem(LanTree.Selected.data)^.MyClientListView;
AddCap(pMyTreeItem(LanTree.Selected.Data)^.Group,pMyTreeItem(LanTree.Selected.Data)^.DirName);
//addcap是一个返回字符串的自定义函数;
ListItem := pMyTreeItem(LanTree.Selected.Data)^.MyRightListItem;
if CurDirItem <> nil
then PListItem(CurDirItem.Data)^.NextDirItem := ListItem;
ListItemPtr := PListItem(ListItem.Data);
ListItemPtr^.PrevDirItem := CurDirItem;
CurDirItem := ListItem;
end

请问CurListView:=pMyTreeItem(LanTree.Selected.data)^.MyClientListView;和PListItem(CurDirItem.Data)^.NextDirItem := ListItem;是什么意思?
CurDirItem.Data、LanTree.Selected.Data在句子中是什么元素?它们扮演了什么角色?
 
该程序很大,只摘要了与问题相关的一段中的几句:

type
TMainForm = class(TForm)
ClientPageCtrl: TPageControl;
ShareTabSheet: TTabSheet;
LanTree: TListView;
FindListView: TListView;
.
.

type
PMyTreeItem = ^TMyTreeItem;
TMyTreeItem = record
DirName,Group: string;
TabIndex: integer;
MyClientListView:TListView;
MyRightListItem:TListItem;
end;
type
PListItem = ^TMyListItem;
TMyListItem = record
index,count: integer;
PrevDirItem, NextDirItem, UpDirItem: TListItem;
end;

.
.
var
MainForm : TMainForm;
CurDirName,CurGroupName:string;
CurListView: TListView;
CurDirItem: TListItem;

{$R *.DFM}

.
.
procedure TMainForm.MyListViewClick(Sender: TObject);
var
ListItemPtr : PListItem;
ListItem : Tlistitem;
begin
if pMyTreeItem(LanTree.Selected.Data)^.TabIndex <> 0 then
begin
ClientPageCtrl.ActivePageIndex := pMyTreeItem(LanTree.Selected.Data)^.tabindex;
CurListView:=pMyTreeItem(LanTree.Selected.data)^.MyClientListView;
AddCap(pMyTreeItem(LanTree.Selected.Data)^.Group,pMyTreeItem(LanTree.Selected.Data)^.DirName);
//addcap是一个返回字符串的自定义函数;
ListItem := pMyTreeItem(LanTree.Selected.Data)^.MyRightListItem;
if CurDirItem <> nil
then PListItem(CurDirItem.Data)^.NextDirItem := ListItem;
ListItemPtr := PListItem(ListItem.Data);
ListItemPtr^.PrevDirItem := CurDirItem;
CurDirItem := ListItem;
end

请问CurListView:=pMyTreeItem(LanTree.Selected.data)^.MyClientListView;和PListItem(CurDirItem.Data)^.NextDirItem := ListItem;是什么意思?
CurDirItem.Data、LanTree.Selected.Data在句子中是什么元素?它们扮演了什么角色?
 
具体问题具体分析
随便拿一段出来没有人知道你要做什么的

CurDirItem.Data、LanTree.Selected.Data都是Pointer,分别指向TMyListItem,TMyTreeItem数据类型,OK,其他要你自己看程序
 
感谢moshengren的指教,该程序有A4纸170页长,要完全贴出,恐怕大家都会烦的.
 
这里定义的两个结构:
type
PMyTreeItem = ^TMyTreeItem;
TMyTreeItem = record
DirName,Group: string;
TabIndex: integer;
MyClientListView:TListView;
MyRightListItem:TListItem;
end;
type
PListItem = ^TMyListItem;
TMyListItem = record
index,count: integer;
PrevDirItem, NextDirItem, UpDirItem: TListItem;
end;
应该是 Delphi 的 TListView 和 TListItem 的内部结构(部分)
CurListView:= pMyTreeItem(LanTree.Selected.data)^.MyClientListView
是利用这个定义的结构直接访问LanTree相对应的地方。详细来讲:
从LanTree.Selected.Data在内存中的地址开始,后面的元素的排列应当符合:
DirName,Group: string;
TabIndex: integer;
MyClientListView:TListView;
MyRightListItem:TListItem;
这个结构。
这样就可以直接访问 TListView 内部那些些私有的域了。
你可以把它简单的看成如下格式:
CurListView := LanTree.Selected.Data.MyClientListView;
当然你不可以这样直接的写。
这种写法多出现在需要访问 TListView 的私有域,这些域被隐藏了,用一般的手段不能访问。
有时候,人们想调用对象下的私有函数,你只要知道这个函数在 VMT 表中的相对位置(偏移量)和入口出口参数的设置,也可以通过类似的原理来调用。
这种用法只能对某一特定的Delphi版本,当不同的版本,这些类型或函数的相对位置改变,那就彻底完了。所以一般并不推荐使用。
下面这个也类似:
PListItem(CurDirItem.Data)^.NextDirItem
我就不多写了。
 
感谢gzgzlxg先生或女士,很多书上都说指针是各种语言中最难的部分,也是很少用到的部分,像上面这段不用指针,用别的办法可以替代吗?我在网上搜了很长时间,也没找到多少,像上面这段程序中的用法还没见到过,我怎么也搞不清CurListView:= pMyTreeItem(LanTree.Selected.data)^.MyClientListView是什么意思,pMyTreeItem是一个指针类型,而data是一个无类型的指针变量,经您这一说,我有些明白了,您还可以给我讲讲:CurListView:= pMyTreeItem(LanTree.Selected.data)^.MyClientListView不用指针用其它办法如何写吗?谢谢
 
感谢各位的参与
 
后退
顶部