小编con*_*tor的帖子

Delphi:RTTI和TObjectList <TObject>

根据之前一篇文章的一个答案,我正在研究以下设计的可能性

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!

delphi generics rtti delphi-2010

4
推荐指数
1
解决办法
3427
查看次数

Delphi RTTI无法找到界面

我正在尝试使用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)

delphi interface rtti

4
推荐指数
2
解决办法
2028
查看次数

Delphi:invoke构造函数引发EInvalidCast

我正在尝试调用通过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)

delphi rtti delphi-2010

4
推荐指数
1
解决办法
695
查看次数

Delphi:重写方法没有调用使用RTTI实例化的对象

我正试图在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)

delphi rtti delphi-2010

4
推荐指数
1
解决办法
801
查看次数

如何使用boost :: spirit验证代数语句?

我正在尝试扩展计算器示例,以便解析器将确定代数语句是否为真,而不是解析和评估代数表达式.我的意思是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)

c++ parsing boost boost-spirit boost-spirit-qi

4
推荐指数
1
解决办法
522
查看次数

Delphi:如何使用DynArraySetLength设置RTTI访问的动态数组的长度?

我想设置动态数组的长度,如本文所述.我有两个类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)

arrays delphi dynamic rtti

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

当GetType成功时,为什么FindType无法获得RTTI?

我正试图抓住一个物体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?

delphi rtti delphi-xe2

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

Bootstrap嵌套式手风琴,内部div不是面板

我一直在尝试使用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)

css jquery accordion twitter-bootstrap

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

Delphi XE2不会将字符串列表标记为已排序

我在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?

delphi delphi-xe2

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

如何识别反应中的材料用户界面滑块?

我希望在一个 React 组件中共享一个公共事件处理程序的多个 material-ui 滑块。但是,要完成这项工作,我需要确定原始滑块。从API 文档中我看不出这是如何实现的。我已经尝试对-component应用idname属性<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

任何帮助将不胜感激!

javascript slider reactjs material-ui

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