是否有一种简单的方法可以复制父组件下的所有子组件,包括它们的已发布属性?
例如:
当然这是最重要的因素,它应该复制我在TPanel上放弃的任何新组件,而不是在正常情况下修改代码.
我听说过RTTI,但实际上从未使用过它.有任何想法吗?
我有一个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 XE6中编译DLL时,它会自动TMethodImplementationIntercept从中导出函数System.Rtti.pas.我试图找到一种方法来避免这种导出,但没有找到任何可以解决问题的配置或编译器指令.
System.Rtti单元几乎无法避免,因为它几乎被delphi中的所有内容间接使用.
在XE6中构建DLL时,有没有办法避免导出此函数?
或者,使用__declspec(novtable)是否还有其他已知的负面影响?我似乎无法找到任何问题的参考.
我试图在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) 如果我有一个界面,如:
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应用程序中有一个类,我想要一种简单而动态的方法将所有字符串属性重置为'',并将所有布尔属性重置为False就我在网上看到的那样,应该可以创建一个循环某种形式,但如何做到这一点对我来说并不清楚.
我会自己回答这个问题,但如果你比我快,或者你不喜欢我的解决方案,请随时提供你的答案.我想出了这个想法,并希望对此有一些看法.
目标:一个可读的配置类(如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 xe,但由于rtti(我认为),exe大小非常大
如何删除rtti,我可以使我的应用程序大小与delphi 2009应用程序(490 kb)一样小,没有comprssion; 什么是rtti的用途
我读过的所有内容都表明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) rtti ×10
delphi ×9
delphi-xe ×4
delphi-xe6 ×2
c++ ×1
class ×1
dll ×1
generics ×1
properties ×1
variant ×1
visual-c++ ×1
win64 ×1