根据之前一篇文章的一个答案,我正在研究以下设计的可能性
TChildClass = class(TObject)
private
FField1: string;
FField2: string;
end;
TMyClass = class(TObject)
private
FField1: TChildClass;
FField2: TObjectList<TChildClass>;
end;
Run Code Online (Sandbox Code Playgroud)
现在,在现实世界中,TMyClass将有10个不同的列表,所以我希望能够使用RTTI解决这些列表.但是,我对这个类的其他字段不感兴趣,所以我需要检查某个字段是否是某种TObjectList.这是我到目前为止所得到的:
procedure InitializeClass(RContext: TRttiContext; AObject: TObject);
var
ROwnerType: TRttiType;
RObjListType: TRttiType;
RField: TRttiField;
SchInf: TSchemaInfoDetail;
begin
ROwnerType := RContext.GetType(AObject.ClassInfo);
RObjListType := RContext.GetType(TObjectList<TObject>);
for RField in ROwnerType.GetFields do begin
// How do I check if the type of TMyClass.FField2 (which is TObjectList<TChildClass>) is some sort of TObjectList?
end;
Run Code Online (Sandbox Code Playgroud)
显然,RField.FieldType <> RObjListType.FieldType.但是,他们确实有一些关系,不是吗?看起来很糟糕(而且错误!)对常见功能进行非常精细的检查,以使其非常可能RField.FieldType实际上是一个TObjectList.
说实话,我对泛型非常不舒服,所以这个问题可能很天真.但是,我非常乐意学习.以上解决方案是否可以实施?TIA!
我正在尝试使用D2010 RTTI获取接口.
program rtti_sb_1;
{$APPTYPE CONSOLE}
{$M+}
uses
SysUtils,
Rtti,
mynamespace in 'mynamespace.pas';
var
ctx: TRttiContext;
RType: TRttiType;
MyClass: TMyIntfClass;
begin
ctx := TRttiContext.Create;
MyClass := TMyIntfClass.Create;
// This prints a list of all known types, including some interfaces.
// Unfortunately, IMyPrettyLittleInterface doesn't seem to be one of them.
for RType in ctx.GetTypes do
WriteLn(RType.Name);
// Finding the class implementing the interface is easy.
RType := ctx.FindType('mynamespace.TMyIntfClass');
// Finding the interface itself is not.
RType := ctx.FindType('mynamespace.IMyPrettyLittleInterface');
MyClass.Free;
ReadLn;
end. …Run Code Online (Sandbox Code Playgroud) 我正在尝试调用通过RTTI获得的构造函数(运行D2010版本14.0.3593.25826).构造函数将字符串和对象混合为参数,所有这些都应该初始化为''或nil.(免责声明:我知道所需的构造函数将是具有最大参数数量的构造函数,因此看起来很奇怪,但设计不是很理想.)
代码如下:
program sb_rtti;
{$APPTYPE CONSOLE}
uses RTTI, TypInfo, SysUtils;
type
TMyClass = class (TObject)
FField1: string;
FObject1: TObject;
public
constructor Create(Field1: string = ''; Object1: TObject = nil);
end;
constructor TMyClass.Create(Field1: string; Object1: TObject);
begin
FField1 := Field1;
FObject1 := Object1;
end;
function GetConstructor(rType: TRttiType) : TRttiMethod;
var
MaxParams: integer;
Methods: TArray<TRttiMethod>;
Method: TRttiMethod;
Params: TArray<TRttiParameter>;
begin
Methods := rType.GetMethods('Create');
MaxParams := 0;
for Method in Methods do begin
Params := Method.GetParameters();
if (Length(Params) > …Run Code Online (Sandbox Code Playgroud) 我正试图在D2010中使用RTTI克隆对象.这是我到目前为止的尝试:
uses SysUtils, TypInfo, rtti;
type
TPerson = class(TObject)
public
Name: string;
destructor Destroy(); Override;
end;
destructor TPerson.Destroy;
begin
WriteLn('A TPerson was freed.');
inherited;
end;
procedure CloneInstance(SourceInstance: TObject; DestinationInstance: TObject; Context: TRttiContext); Overload;
var
rSourceType: TRttiType;
rDestinationType: TRttiType;
rField: TRttiField;
rSourceValue: TValue;
Destination: TObject;
rMethod: TRttiMethod;
begin
rSourceType := Context.GetType(SourceInstance.ClassInfo);
if (DestinationInstance = nil) then begin
rMethod := rSourceType.GetMethod('Create');
DestinationInstance := rMethod.Invoke(rSourceType.AsInstance.MetaclassType, []).AsObject;
end;
for rField in rSourceType.GetFields do begin
if (rField.FieldType.TypeKind = tkClass) then begin
// TODO: Recursive clone …Run Code Online (Sandbox Code Playgroud) 我正在尝试扩展计算器示例,以便解析器将确定代数语句是否为真,而不是解析和评估代数表达式.我的意思是1 + 5 * 5 - 10 = 19 - 3(期望的解析器结果是true)和3 - 1 = 9(期望的解析器结果false).
我必须承认我是新手,boost::spirit而且现在这一切都是压倒性的.但是,我觉得我理解计算器示例足够好,至少可以取得一些进展.
使用提供的示例作为起点,语法如下所示:
calculator() : calculator::base_type(expression)
{
using qi::uint_;
using qi::_val;
using qi::_1;
expression =
term [_val = _1]
>> *( ('+' >> term [_val = _val + _1])
| ('-' >> term [_val = _val - _1])
);
term =
factor [_val = _1]
>> *( ('*' >> factor [_val = _val * …Run Code Online (Sandbox Code Playgroud) 我想设置动态数组的长度,如本文所述.我有两个类TMyClass和相关的TChildClass定义为
TChildClass = class
private
FField1: string;
FField2: string;
end;
TMyClass = class
private
FField1: TChildClass;
FField2: Array of TChildClass;
end;
Run Code Online (Sandbox Code Playgroud)
数组扩充实现为
var
RContext: TRttiContext;
RType: TRttiType;
Val: TValue; // Contains the TMyClass instance
RField: TRttiField; // A field in the TMyClass instance
RElementType: TRttiType; // The kind of elements in the dyn array
DynArr: TRttiDynamicArrayType;
Value: TValue; // Holding an instance as referenced by an array element
ArrPointer: Pointer;
ArrValue: TValue;
ArrLength: LongInt;
i: integer;
begin
RContext …Run Code Online (Sandbox Code Playgroud) 我正试图抓住一个物体TRttiContext.FindType(QualifiedTypeName).这是我得到的:
program MissingRTTI;
{$APPTYPE CONSOLE}
uses System.SysUtils, RTTI, Classes;
type
TMyClass = class(TObject) end;
var
rCtx: TRttiContext;
rType: TRttiInstanceType;
begin
rCtx := TRttiContext.Create();
rType := rCtx.GetType(TypeInfo(TMyClass)) as TRttiInstanceType;
if (rType <> nil) then begin
WriteLn('Type found using TypeInfo');
end;
rType := rCtx.FindType(TMyClass.QualifiedClassName) as TRttiInstanceType;
if (rType <> nil) then begin
WriteLn('Type found using qualified class name.');
end;
ReadLn;
rCtx.Free();
end.
Run Code Online (Sandbox Code Playgroud)
不幸的是,rCtx.GetType似乎只找到了所需的类型.(我也尝试使用GetTypes列出所有类型.所需的类型不会出现在结果数组中.)任何人都知道如何强制编译器为此类型发出RTTI?
我一直在尝试使用bootstrap实现嵌套的手风琴.到目前为止,我能够拥有充当手风琴的嵌套面板,如此jsfiddle中所示,并在下面重复.(抱歉代码臃肿.)
<div class="panel-group" id="accordion1">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion1" href="#collapseOne">
Collapsible Group Item #1
</a>
</h4>
</div>
<div id="collapseOne" class="panel-collapse collapse in">
<div class="panel-body">Panel 1</div>
</div>
</div>
<!-- I'd like the content of this group to behave as the panels do. -->
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion1" href="#collapseTwo">
Collapsible Group Item #2
</a>
</h4>
</div>
<div id="collapseTwo" class="panel-collapse collapse">
<div class="panel-body">
<div class="collapse-group" id="#accordion2">
<h2>Heading</h2>
<p><a data-toggle="collapse" data-parent="#accordion2" …Run Code Online (Sandbox Code Playgroud) 我在Delphi XE2中排序字符串列表时遇到问题.这是一个例子:
procedure AddText();
var
StrList: TStringList;
begin
StrList := TStringList.Create();
StrList.Add('Test1');
StrList.Sort();
WriteLn('Sorted: ' + BoolToStr(StrList.Sorted, true)); // Prints "Sorted: false"
StrList.Add('Test2');
StrList.Sort();
WriteLn('Sorted: ' + BoolToStr(StrList.Sorted, true)); // Prints "Sorted: false"
StrList.Add('Test3');
StrList.Free();
end;
Run Code Online (Sandbox Code Playgroud)
据我所知,问题是由于事实TStringList.Sorted永远不会设置为true(既不直接也不使用SetSorted).它只是我还是一个bug?
我希望在一个 React 组件中共享一个公共事件处理程序的多个 material-ui 滑块。但是,要完成这项工作,我需要确定原始滑块。从API 文档中我看不出这是如何实现的。我已经尝试对-component应用id和name属性<Slider>,但我没有在事件处理程序的合成事件中看到这些。
handleChange = (event, value) => {
console.log(event); // 'Id' and 'name' attributes in 'target' are empty
this.setState({ value });
};
render() {
const { classes } = this.props;
const { value } = this.state;
return (
<div className={classes.root}>
<Typography id="label">Slider label</Typography>
<Slider
classes={{ container: classes.slider }}
value={value}
aria-labelledby="label"
onChange={this.handleChange}
/>
</div>
);
}
Run Code Online (Sandbox Code Playgroud)
这是从官方演示项目中获取的:
https://codesandbox.io/s/4j9l9xn1o4
任何帮助将不胜感激!
delphi ×7
rtti ×6
delphi-2010 ×3
delphi-xe2 ×2
accordion ×1
arrays ×1
boost ×1
boost-spirit ×1
c++ ×1
css ×1
dynamic ×1
generics ×1
interface ×1
javascript ×1
jquery ×1
material-ui ×1
parsing ×1
reactjs ×1
slider ×1