首页 > 其他分享 >Delphi中相关单元

Delphi中相关单元

时间:2024-12-17 15:41:54浏览次数:6  
标签:MyObject Name Delphi System 类型 TypInfo 相关 Age 单元

1.Delphi的TypInfo单元是什么?

TypInfo 单元是 Delphi 运行时类型信息 (RTTI) 的核心单元。它提供了一组函数和类型,用于在运行时检查和操作类型信息。这对于许多高级编程技术非常有用,例如对象检查器、序列化、持久化以及元编程。

TypInfo 单元的主要功能和用途:

  • 运行时类型识别 (RTTI): 允许程序在运行时确定对象的类型。
  • 访问类型信息: 提供对类型名称、字段、方法、属性等信息的访问。
  • 动态创建对象: 允许根据类型信息动态创建类的实例。
  • 设置和获取属性值: 允许通过名称在运行时设置和获取对象的属性值。
  • 方法调用: 允许通过名称在运行时调用对象的方法。
  • 枚举类型信息: 允许遍历类的字段、方法、属性等。

TypInfo 单元中重要的类型和函数:

  • PTypeInfo 指向类型信息的指针。这是 TypInfo 中最重要的类型,它包含了类型的各种元数据。
  • GetTypeInfo 函数: 返回给定类型的 PTypeInfo 指针。例如:PTypeInfo(TypeInfo(TMyClass))
  • GetPropInfo 函数: 返回给定类型的指定属性的信息。
  • GetMethodInfo 函数: 返回给定类型的指定方法的信息。
  • GetFieldInfo 函数: 返回给定类型的指定字段的信息。
  • SetPropValueGetPropValue 函数: 用于设置和获取对象的属性值。
  • Invoke 函数: 用于调用对象的方法。
  • TypeKind 类型: 枚举类型,表示类型的种类(例如 tkIntegertkStringtkClasstkMethod 等)。
  • PPropInfoPMethodInfoPFieldInfo 类型: 分别包含属性、方法和字段的信息。

使用 TypInfo 的示例:

以下代码演示了如何使用 TypInfo 单元获取类的属性信息并设置属性值:

代码段  
uses
  System.TypInfo, System.Rtti, System.SysUtils;

type
  TMyClass = class(TObject)
  private
    FName: string;
    FAge: Integer;
  published
    property Name: string read FName write FName;
    property Age: Integer read FAge write FAge;
  end;

procedure TestTypInfo;
var
  MyObject: TMyClass;
  PropInfo: PPropInfo;
begin
  MyObject := TMyClass.Create;
  try
    // 获取 TMyClass 类型的 PTypeInfo
    PropInfo := GetPropInfo(TypeInfo(TMyClass), 'Name');
    if PropInfo <> nil then
    begin
      // 使用 SetPropValue 设置 Name 属性的值
      SetPropValue(MyObject, PropInfo, 'Test Name');
    end;

    PropInfo := GetPropInfo(TypeInfo(TMyClass), 'Age');
    if PropInfo <> nil then
    begin
       // 使用 SetPropValue 设置 Age 属性的值
      SetPropValue(MyObject, PropInfo, 30);
    end;
    Writeln(Format('Name: %s, Age: %d', [MyObject.Name, MyObject.Age])); // 输出:Name: Test Name, Age: 30

    // 使用 RTTI context(更强大的方式)
    var context := TRttiContext.Create;
    try
      var rttiType := context.GetType(TypeInfo(TMyClass));
      var rttiProperty := rttiType.GetProperty('Name');
      rttiProperty.SetValue(MyObject, 'Another Name');
      rttiProperty := rttiType.GetProperty('Age');
      rttiProperty.SetValue(MyObject, 40);
      Writeln(Format('Name: %s, Age: %d', [MyObject.Name, MyObject.Age])); // 输出:Name: Another Name, Age: 40
    finally
        context.Free;
    end;

  finally
    MyObject.Free;
  end;
end;

begin
  TestTypInfo;
  Readln;
end.

System.Rtti 单元的比较:

Delphi XE2 引入了 System.Rtti 单元,它提供了一种更强大、更面向对象的 RTTI 机制。System.Rtti 提供了诸如 TRttiContextTRttiTypeTRttiProperty 等类,使 RTTI 的使用更加方便和类型安全。尽管 TypInfo 仍然可用,但在新的 Delphi 代码中,通常推荐使用 System.Rtti。上面的代码也演示了使用 System.Rtti 的方法,更加的简洁直观。

总结:

TypInfo 单元是 Delphi 中处理运行时类型信息的重要工具。它允许程序在运行时动态地检查和操作类型,从而实现一些高级的功能。虽然现在推荐使用 System.Rtti,但是理解 TypInfo 仍然有助于深入理解 Delphi 的类型系统。

标签:MyObject,Name,Delphi,System,类型,TypInfo,相关,Age,单元
From: https://www.cnblogs.com/jonvy/p/18612620

相关文章

  • PHP中处理html相关函数集锦
    1、html_entity_decode() 函数把 HTML 实体转换为字符。Html_entity_decode() 是 htmlentities() 的反函数。例子:<?Php$star=”& ‘”;echo $str=html_entity_decode($star);?>(浏览器其实可以自动识别这样的代码,只要你输出的是html实体,浏览器会自动识别的)2、htmls......
  • java poi 限定单元格只能输入数字
    importorg.apache.poi.ss.usermodel.*;importorg.apache.poi.ss.util.*;importorg.apache.poi.xssf.usermodel.XSSFWorkbook;publicclassEasyPoiNumberValidation{publicstaticvoidmain(String[]args){Workbookworkbook=newXSSFWorkbook();......
  • Delphi WebBroker【Web服务器应用程序】+简单接口
    一、建好项目1.新建File-New–Other–找到Web服务器应用程序2.然后会弹出这些界面,基本都直接下一步就好了【这个Demo就是这样这样的】下面可以测试一下自己的8080端口是否被占用了,占用了就换别的就好了,然后完成【不会影响后面的操作】 二、项目创建完成后然后就......
  • Delphi 在窗体界面显示之后执行事件 AfterShow
    正常情况下,需要在启动之后直接执行某事件,一般会将函数放在Create或者OnShow里面。但是,这种情况下,当事件耗时较久是,界面会迟迟不肯出现,只能等待Create喝OnShow执行完毕之后才会显示。为了能够在界面能够先出现,然后运行需要的事件,可以使用消息的机制自定义添加一个AfterShow的函数......
  • Springboot 单元测试报错:javax.websocket.server.ServerContainer not available
    错误描述 解决方案@SpringBootTest(webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT)  importlombok.extern.slf4j.Slf4j;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;im......
  • Java新兴技术:探索与微服务相关的技术演进
    Java不仅在语言功能上不断演化,其在企业应用领域中的地位也日益巩固。随着云原生架构的流行,微服务已成为构建高性能、可扩展应用系统的首选模式。本文将聚焦Java在微服务技术栈中的最新进展,包括SpringBoot3、Helidon和Quarkus框架,及其在云原生时代如何高效支持企业级开发。1......
  • 相关问题及排查
    一、Pod相关问题及排查Pod无法启动,如何查找原因?使用kubectldescribepod[pod_name]-n[namespace_name]命令查看该Pod的状态信息,检查容器的状态和事件信息,判断是否出现问题。使用kubectllogs[pod_name]-n[namespace_name]命令查看该Pod容器的日志信息......
  • HarmonyOS 获取进程相关的信息process 常用的几个方法
    获取进程相关的信息,提供进程管理的相关功能。process1.EventListener2.isIsolatedProcess3.is64Bit4.getStartRealtime5.getPastCpuTime导入模块import{process}from'@kit.ArkTS';属性名称类型可读可写说明uidnumber是否进程的用户标识。pidnumber是......
  • 单元测试中Hamcrest的常见用法
    maven:<groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId><version>1.3</version> 在Spock单元测试框架中,Hamcrest提供了一系列的匹配器方法,用于增强测试断言的表达力和可读性。以下是一些Spock中常用的Hamcrest匹配器方法及其详细介绍:Hamcrest......
  • sumo——相关地图文件格式转换
    netconvertxodr转net.xml格式使用netconvert命令转换netconvert--opendrive-filescaoyang.xodr-ocaoyang.net.xml使用工具类将caoyang.net.xml转caoyang.geojsonpackagecom.ys.test.netxml_to_geojson;importorg.w3c.dom.*;importjavax.xml.parsers.*;impor......