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. js的抖动及防抖和节流

     js的抖动 在 js 中 改变窗口大小 & 上下滚动滚动条 & 反复向输入框中输入内容 ... , 如果绑定了相应的事件 , 这些事件的触发频率非常高, 严重影响用户体验和服务器的性 ...

  2. 网络层ddos与应用层ddos区别

    以去银行办业务举例: 网络层ddos是让去往银行的道路交通变得拥堵,无法使正真要去银行的人到达:常利用协议为网络层的,如tcp(利用三次握手的响应等待及电脑tcp连接数限制)等 应用层ddos则是在到 ...

  3. Kubernetes 入门-学习-nginx安装-dashboard安装

    一.入门 1.Kubernetes中文社区---http://docs.kubernetes.org.cn/ 2.Kubernetes集群组件: - etcd 一个高可用的K/V键值对存储和服务发现系 ...

  4. 关于Mysql select语句中拼接字符串的记录

    在mysql的SELECT语句中拼接两列(或多列)的字符串显示: mysql> select concat(dname,loc) from dept; 以上语句便把dept表的dname,loc ...

  5. 【Thinkphp5】解决模板输出时间戳自动转换为时间格式的问题

    背景: 数据库存储时间为时间戳,格式为varchar,模板输出时未进行时间格式化却输出了时间格式 如下图 (数据库存储的时间戳) (页面输出的时间) (未进行格式化的时间代码) (格式化后的时间代码) ...

  6. 源讯科技(中国)有限公司(Atos Worldline)

    源讯公司是欧洲***的IT服务公司,去年营收达到88亿欧元,在全球52个国家拥有77100名员工.Worldline为Atos(源讯)全资子公司,专注于金融支付领域.Worldline在B2B及B2C ...

  7. Python3 获取当前文件名

    #__author: mac#date: 2018/12/16 import osimport sys print(__file__)print(sys.argv[0])print(os.path.d ...

  8. 03python面向对象编程4

    http://c.biancheng.net/view/2287.html 1.1定义类和对象 在面向对象的程序设计过程中有两个重要概念:类(class)和对象(object,也被称为实例,insta ...

  9. 【学习】019 SpringBoot

    一.SpringBoot介绍 1.1.SpringBoot简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配 ...

  10. u-boot Kconfig结构解析

    1 /u-boot-2019.07/Kconfig source "arch/Kconfig" 2 /u-boot-2019.07/arch/Kconfig  -->有一个一 ...