http://blog.sina.com.cn/s/blog_5f8861b60102v1nl.html

Delphi 跨单元进入(访问)类的私有成员,protected ,private部分

(2014-09-25 21:33:36)

标签:

delphi

分类: 软件设计
转:http://hi.baidu.com/auwage/blog/item/6142231ef4f127fce1fe0bf4.html
 
作者:二娃(QQ:78493244)
 
delphi 中,同单元类,可以任意进入类成员的private至pulished部分,没有任何限制,但是对于不同的单元之间,如何进入protected ,private部分访问呢?
 
我先讲讲进入protected部分:
进入protected相对简单,现举个例子:
type
TCustomForm = class(TScrollingWinControl)
protected
FFormState: TFormState;
public
property FormState: TFormState read FFormState;
end;
TForm = class(TCustomForm);
从上面可以看出 TForm 的属性FormState是一个只读属性,正常情况下,是不能直接改变这个属性值的.但是我们可以通过一个以下来访问:
新申明一个类,这个类什么事也不做
type
TFormAccess = class(TForm);
 
procedure TForm1.Button1Click(Sender: TObject);
begin 
//这样我们就可以访问FFormState并且可以改变其值
Include(TFormAccess(Form1).FFormState, fsCreating); //注意是TFormAccess 而不是TForm
end;
 
对于private内成员跨单元相对复杂一些:
在这里我借用网上的一个贴子,上面有详细的介绍:
http://topic.csdn.net/t/20020706/20/855337.html 7楼一篇,我借花献佛了
上面的方法相对很繁琐,delphi没搞几年可能看不明白,借用《亮剑》上李云龙的句名言:云山雾绕的,那好,在这里,我介绍一种更为简单的方法,这也是我多年经验的总结
比如:
TList = class(TObject)
private
FList: PPointerList;
FCount: Integer;
FCapacity: Integer;
protected
function Get(Index: Integer): Pointer;
procedure Grow; virtual;
procedure Put(Index: Integer; Item: Pointer);
procedure Notify(Ptr: Pointer; Action: TListNotification); virtual;
procedure SetCapacity(NewCapacity: Integer);
procedure SetCount(NewCount: Integer);
public
destructor Destroy; override;
function Add(Item: Pointer): Integer;
procedure Clear; virtual;
procedure Delete(Index: Integer);
class procedure Error(const Msg: string; Data: Integer); overload; virtual;
class procedure Error(Msg: PResStringRec; Data: Integer); overload;
procedure Exchange(Index1, Index2: Integer);
function Expand: TList;
function Extract(Item: Pointer): Pointer;
function First: Pointer;
function GetEnumerator: TListEnumerator;
function IndexOf(Item: Pointer): Integer;
procedure Insert(Index: Integer; Item: Pointer);
function Last: Pointer;
procedure Move(CurIndex, NewIndex: Integer);
function Remove(Item: Pointer): Integer;
procedure Pack;
procedure Sort(Compare: TListSortCompare);
procedure Assign(ListA: TList; AOperator: TListAssignOp = laCopy; ListB: TList = nil);
property Capacity: Integer read FCapacity write SetCapacity;
property Count: Integer read FCount write SetCount;
property Items[Index: Integer]: Pointer read Get write Put; default;
property List: PPointerList read FList;
end;
对于TList的 private成员
FList: PPointerList;
FCount: Integer;
FCapacity: Integer;
这三个成员,可以通过下面方式访问
 
先声明一个类,
//注意这里,跟TList继承自同一个类.这是关键,这样保证这个新类与TList在vmt表的地址顺序是一样的
TListAccess = class(TObject)
public //注意:FList前面加一个public,还要特别注意的是,下面三个成员必需与原TList的顺序一致,否/则访问时地址会出错
FList: PPointerList;
FCount: Integer;
FCapacity: Integer;
end;
然后,我们直接这样访问了
TListAccess(List1).FList
TListAccess(List1).FCount
TListAccess(List1).FCapacity
看到没有,可以做任何事了,哈哈,够简单吧?
最后要注意的是,对于新手来说,如果你对delphi的vcl机制不熟悉,最好不要控制vcl控件的私有成员,那样风险很大的
 
 
转载自http://myvs01.blog.163.com/blog/static/1853340902011101804736983/

Delphi 跨单元进入(访问)类的私有成员,protected ,private部分的更多相关文章

  1. VC6.0中重载操作符函数无法访问类的私有成员

    整理日: 2015年03月18日 在 C++ 中,操作符(运算符)可以被重载以改写其实际操作.同时我们可以定义一个函数为类的朋友函数(friend function)以便使得这个函数能够访问类的私有成 ...

  2. C#箴言之用属性来访问类的私有成员

    在程序中,难免要访问某个对象的私有成员.那么以前实现这类功能的方法有两种,第一种方法最简单,就是把成员访问符从“private”改为“public”即可:而另一个就是提供公有的成员访问函数来进行访问. ...

  3. 使用C#反射机制访问类的私有成员【转】

    首先我必须承认访问一个类的私有成员不是什么好做法.大家也都知道私有成员在外部是不能被访问的.而一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员访问,可以套用下面这种非常好的方式 ...

  4. c++中嵌套类,外部类访问内部类的私有成员变量

    在嵌套类中,内部类可以直接访问外部类的私有成员变量,但是外部类不能直接访问内部类的私有成员变量,必须把外部类声明为内部类的友元类 /********************************** ...

  5. C++之在类内部访问对象的私有成员

    一.引言 今天看项目里的一段代码发现,竟然可以再类的成员函数中访问该类的对象的私有成员.感觉不可思议. 自己写的实例代码: #include <iostream> using namesp ...

  6. java利用反射访问类的私有(private)属性及方法

    Java语言中,在一个类中,为了不让外界访问到有的属性和方法,通常将其设置为private,用正常的方式(对象名.属性名,对象名.方法名)将无法访问此属性与方法,但有没有其他方法可以访问呢?答案是有的 ...

  7. YTU 2639: 改错题:类中私有成员的访问

    2639: 改错题:类中私有成员的访问 时间限制: 1 Sec  内存限制: 128 MB 提交: 431  解决: 297 题目描述 /* 改错题: 设计一个日期类和时间类,并编写全局函数displ ...

  8. 访问类的私有属性(RTTI和模仿类2种方法)

    如何访问类的私有属性? 下面以 TPathData 为例,它有一个私有属性 PathData,储存了每一个曲线点,但一般无法修改它,需要利用下面方法,才能访问修改(若有更好的方法,歡迎分享): 一.利 ...

  9. C++笔记之外部类访问内部类的私有成员

    如下图所示 内部类可以访问外部类的私有成员 而外部类无法访问内部类的私有成员 为了能让外部类访问内部类的私有成员,将外部类声明为内部类的友元类即可 #include <iostream> ...

随机推荐

  1. es6中class类的全方面理解(一)

    传统的javascript中只有对象,没有类的概念.它是基于原型的面向对象语言.原型对象特点就是将自身的属性共享给新对象.这样的写法相对于其它传统面向对象语言来讲,很有一种独树一帜的感脚!非常容易让人 ...

  2. html的图片移动(js)

    <!DOCTYPE html><html><style> *{padding: 0;margin: 0} #open{ width: 300px; height: ...

  3. Linux系统性能测试工具(六)——磁盘io性能工具之dd

    本文介绍关于Linux系统(适用于centos/ubuntu等)的磁盘io性能测试工具-dd.磁盘io性能测试工具包括: fio: dd

  4. 解决Ubuntu环境下在pycharm中导入tensorflow报错问题

    环境: Ubuntu 16.04LTS anacoda3-5.2.0 问题: ImportError: No module named tensorflow 原因:之前安装的tensorflow所用到 ...

  5. if [ $? -eq 0 ]; then该语句是什么含义?

    某个shell脚本 # mkimage.sh echo "make and copy android images" ./mkimage.sh ]; then echo " ...

  6. Nginx优化_数据包头部信息过大问题

    如果客户端发出请求的URL头部信息过大,网站将不能及时响应,并通过状态码414报错. <center><h1>414 Request-URI Too Large</h1& ...

  7. 012-linux系统管理——进程管理与工作管理

    linux系统管理——进程管理 top 命令是使用 top - :: up :, user, load average: 0.06, 0.60, 0.48 #五分钟钱,十分钟前,十五分钟前负载的值根据 ...

  8. (最新)2019年ICPC东亚地区-区域赛赛站网络赛以及现场赛时间安排

  9. hdu 1506 单调栈

    #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #defin ...

  10. gperftools尝试

    最近在找windows下比较好用的函数时间统计的库,听同事说gperftools是跨平台的,就下载下来尝试了一把.发现它确实实现了windows上可以调用的dll库文件(tcmalloc_minima ...