标签: rtti

在运行时复制组件

是否有一种简单的方法可以复制父组件下的所有子组件,包括它们的已发布属性?

例如:

  • TPanel
    • 的TLabel
    • TEDIT
    • TListView的
    • TSpecialClassX

当然这是最重要的因素,它应该复制我在TPanel上放弃的任何新组件,而不是在正常情况下修改代码.

我听说过RTTI,但实际上从未使用过它.有任何想法吗?

delphi rtti

12
推荐指数
3
解决办法
1万
查看次数

如何在Delphi中将泛型转换为Variant

我有一个Delphi泛型类,它使用泛型类型的参数公开一个函数.在这个函数中,我需要将泛型类型的实例传递给另一个期望Variant类型的对象.与此类似:

type
  IMyInterface = interface
    DoStuff(Value: Variant);
  end;      

  TMyClass<T> = class
    FMyIntf: IMyInterface
    procedure DoStuff(SomeValue: T);
  end;

[...]

procedure MyClass<T>.DoStuff(SomeValue: T);
begin
  FMyIntf.DoStuff((*convert SomeValue to Variant here*));
end;
Run Code Online (Sandbox Code Playgroud)

我尝试使用Rtti.TValue.From(SomeValue).AsVariant.这适用于整体类型,但对布尔人来说却是爆炸性的.我不太明白为什么,因为通常我能够为Variant分配一个布尔值...

有没有更好的方法进行此转换?我只需要它用于简单的内置类型(不包括枚举和记录)

delphi generics rtti variant delphi-xe

12
推荐指数
1
解决办法
3399
查看次数

Delphi XE6 DLL:不需要的导出:TMethodImplementationIntercept

在Delphi XE6中编译DLL时,它会自动TMethodImplementationIntercept从中导出函数System.Rtti.pas.我试图找到一种方法来避免这种导出,但没有找到任何可以解决问题的配置或编译器指令.

System.Rtti单元几乎无法避免,因为它几乎被delphi中的所有内容间接使用.

在XE6中构建DLL时,有没有办法避免导出此函数?

delphi dll rtti delphi-xe6

12
推荐指数
1
解决办法
2404
查看次数

在抽象基类上使用__declspec(novtable)会以任何方式影响RTTI吗?

或者,使用__declspec(novtable)是否还有其他已知的负面影响?我似乎无法找到任何问题的参考.

c++ rtti visual-studio visual-c++ compiler-specific

11
推荐指数
1
解决办法
5740
查看次数

如何使用Delphi RTTI获取和设置记录值

我试图在Delphi XE或更高版本中使用增强的RTTI功能来读取和写入XML对象.到目前为止,我已成功使用整数,浮点数,字符串,枚举类型,集合和类,但无法正确输出或读取记录.问题似乎是获取记录属性的实例(指针).

//Outputs Properties To XML
procedure TMyBase.SaveToXML(node: TJclSimpleXMLElem);
var
  child , subchild : TjclSimpleXMLElem ;
  FContext : TRttiContext ;
  FType    : TRttiType ;
  FProp    : TRttiProperty ;
  Value    : TValue ;
  MyObj    : TMyBase ;
  FField   : TRttiField ;
  FRecord  : TRttiRecordType ;
  Data     : TValue ;
begin
  FContext := TRttiContext.Create ;
  FType := FContext.GetType ( self.ClassType ) ;
  Child := node.Items.Add ( ClassName ) ;
  for FProp in FType.GetProperties do begin
    if FProp.IsWritable then begin
      case FProp.PropertyType.TypeKind of …
Run Code Online (Sandbox Code Playgroud)

delphi rtti delphi-xe

11
推荐指数
2
解决办法
9214
查看次数

是否可以使用RTTI在接口上获取GUID的值?

如果我有一个界面,如:

IPluginAPI = interface
['{590DFF0B-CA00-46CC-84B0-3848103D4C5A}']
   function add (a : double; b : double) : double;
   function sub (a : double; b : double) : double;
   function mult (a : double; b : double) : double;
   function divide (a : double; b : double) : double;
end;
Run Code Online (Sandbox Code Playgroud)

无论如何使用RTTI获取GUID的值?我正在使用Delphi XE.

delphi rtti

11
推荐指数
1
解决办法
2362
查看次数

如何循环类中的所有属性

我在我的Delphi应用程序中有一个类,我想要一种简单而动态的方法将所有字符串属性重置为'',并将所有布尔属性重置为False就我在网上看到的那样,应该可以创建一个循环某种形式,但如何做到这一点对我来说并不清楚.

delphi properties class rtti delphi-xe

11
推荐指数
2
解决办法
1万
查看次数

序列化Delphi应用程序配置的最佳方法是什么?

我会自己回答这个问题,但如果你比我快,或者你不喜欢我的解决方案,请随时提供你的答案.我想出了这个想法,并希望对此有一些看法.

目标:一个可读的配置类(如INI文件),但无需编写(并在添加新配置项后进行调整)加载和保存方法.

我想创建一个类

TMyConfiguration = class (TConfiguration)
  ...
  property ShowFlags : Boolean read FShowFlags write FShowFlags;
  property NumFlags : Integer read FNumFlags write FNumFlags;
end;
Run Code Online (Sandbox Code Playgroud)

调用TMyConfiguration.Save(继承自TConfiguration)应该创建一个类似的文件

[Options]
ShowFlags=1
NumFlags=42
Run Code Online (Sandbox Code Playgroud)

问题:最好的方法是什么?

delphi configuration-files rtti

10
推荐指数
2
解决办法
3810
查看次数

delphi xe禁用RTTI

我最近使用了delphi xe,但由于rtti(我认为),exe大小非常大

如何删除rtti,我可以使我的应用程序大小与delphi 2009应用程序(490 kb)一样小,没有comprssion; 什么是rtti的用途

delphi rtti application-size delphi-xe

10
推荐指数
3
解决办法
8940
查看次数

TRTTIContext多线程问题

我读过的所有内容都表明TRTTIContext是线程安全的.

但是,当多线程时,TRTTIContext.FindType似乎偶尔会失败(返回nil).在它周围使用TCriticalSection可以解决问题.请注意,我正在使用XE6,并且XE中似乎不存在该问题.编辑:似乎存在于所有具有新RTTI单元的Delphi版本中.

我已经编写了一个测试项目,你可以用来亲自看看.创建一个新的VCL项目,删除TMemo和TButton,用下面替换unit1,并分配Form1.OnCreate,Form1.OnDestroy和Button1.OnClick事件.密钥CS是TTestThread.Execute中的GRTTIBlock.目前已禁用,当我运行200个线程时,我得到3到5个失败.启用GRTTIBlock CS可以消除故障.

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, SyncObjs, Contnrs, RTTI;

type
  TTestThread = class(TThread)
  private
    FFailed: Boolean;
    FRan: Boolean;
    FId: Integer;
  protected
    procedure Execute; override;
  public
    property Failed: Boolean read FFailed;
    property Ran: Boolean read FRan;
    property Id: Integer read FId write FId;
  end;

  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FThreadBlock: TCriticalSection;
    FMaxThreadCount: Integer;
    FThreadCount: Integer; …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading win64 rtti delphi-xe6

10
推荐指数
2
解决办法
1003
查看次数