如何访问没有内容的记录类型?packed record(50分)

  • 主题发起人 主题发起人 suzuwei
  • 开始时间 开始时间
S

suzuwei

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟是一Delphi初学者,在使用Ttreeview控件时,发现TreeNode类里有一Itemid属性,它的数据类型只是
Type
Packed recode
而后面没有具体的内容,不知是何种类型的数据?该如何自由访问它?
 
Contains a handle of type HTreeItem that uniquely identifies each
node in a tree view.

property ItemId: HTreeItem;

Description

Use this property to reference the nodes when making Windows API
calls or calling the GetNode method of the TTreeNodes that owns
the item.

这里已经解释得很清楚了, 需要翻译吗?
 
既然都写出来了,还不“反(翻)”过来!
 
TreeNode中的ItemID说明是:
property ItemId: HTreeItem;
里面包含的是唯一的一个handle, 通常这个属性是不被直接访问的.
其中: HTreeItem = ^_TREEITEM;

另外, 如果实在要访问的话,可以这样:
var ItemNode: TTreeNode;
begin
ItemNode:=TreeView1.Items.Item[0];
TreeView1.Items.GetNode(ItemNode.ItemID);
end;
 
Delphi源代码如下:

unit Commctrl;
type
{$EXTERNALSYM HTREEITEM}
HTREEITEM = ^_TREEITEM;
{$EXTERNALSYM _TREEITEM}
_TREEITEM = packed record
end;

unit ComCtrls;
type
TTreeNode = class(TPersistent)
...
FItemId: HTreeItem;
...
end;

ItemId属性根据TTreeNodes.AddItem的返回值得到,源代码如下:
function TTreeNodes.AddItem(Parent, Target: HTreeItem;
const Item: TTVItem
AddMode: TAddMode): HTreeItem;
begin
..
Result := TreeView_InsertItem(Handle, InsertStruct);
end;

其中TreeView_InsertItem源代码如下:
function TreeView_InsertItem(hwnd: HWND
const lpis: TTVInsertStruct): HTreeItem;
begin
Result := HTreeItem( SendMessage(hwnd, TVM_INSERTITEM, 0, Longint(@lpis)) );
end;

Win32 API中对TVM_InsertItem消息说明为:
...Returns the handle to the new item if successful...

也就是说Delphi向Win32标准控件TreeView发送TVM_InsertItem消息,实现InsertItem动作
并将返回值强制转换为HTreeItem类型

在Win32中,所有的Handle实际上都是32位整数(指针)
对于Delphi来说,因为TTreeNodes对象、TTreeNode对象在存取TreeItem(Win32的叫法)时
是根据ItemID属性(即TreeItem的Handle)发送消息实现的,
实际上只需要Handle而并不需要定义出HTreeItem指向的具体类型,

所以Delphi定义的最后结果就是
type
{$EXTERNALSYM HTREEITEM}
HTREEITEM = ^_TREEITEM;
{$EXTERNALSYM _TREEITEM}
_TREEITEM = packed record
end;
 
上次因为网络的原因,一直没能连上论坛,从263上发邮件又发不出去,很不好意思。
感谢蚯蚓,也感谢大家!
 
后退
顶部