无效的变体类型错误Delphi 2010

Foc*_*ker 0 delphi generics variant delphi-2010

// interface

    iccItem =
        class
            ID   : String;
            DATA : Variant;
            constructor Create( _id : String; _data : Variant);
        end;

    iccDynamicObject =
        class
             private
                 FItems : TList;
                 function locate( _id : String) : iccItem;
             public
                 constructor Create();
                 destructor Destroy(); override;
             public
                 procedure define( _id : String; _dta : Variant);
                 //function get( _ndx : DWORD)  : Variant; overload;// link to original data
                 function get( _id  : String) : Variant; overload;
             public
                 property Items[_id : String] : Variant read get write define; default;
        end;


// implementation

{ iccDynamicObject }

constructor iccItem.Create( _id : String; _data : Variant);
begin
    ID   := _id;
    DATA := _data;
end;

function iccDynamicObject.locate( _id : String) : iccItem;
var ndx : integer;
    tmp : iccItem;
begin
    result := nil;

    for ndx := 0 to FItems.Count - 1 do
        begin
            tmp := iccItem( FItems[ndx]);
            if tmp.ID = _id
                then begin
                         result := tmp;
                         exit;
                     end;
        end;
end;

constructor iccDynamicObject.Create();
begin
    FItems := TList.Create();
end;

destructor iccDynamicObject.Destroy();
begin
    {$MESSAGE 'clear here'}

    FItems.Destroy();
    inherited;
end;

procedure iccDynamicObject.define( _id : String; _dta : Variant);
var tmp : iccItem;
begin
    tmp := locate( _id);
    if tmp = nil
        then FItems.Add( iccItem.Create( _id, _dta) )
        else tmp.DATA := _dta;
end;

//function iccDynamicObject.get( _ndx : DWORD) : Variant;
//begin
//    result.vPointer := nil;
//end;

function iccDynamicObject.get( _id : String) : Variant;
var tmp : iccItem;
begin
    tmp := locate( _id);
    if tmp = nil
        then result.vaNull := true
        else result := locate( _id).DATA;
end;


// using
procedure TForm1.FormCreate(Sender: TObject);
var c : iccDynamicObject;
begin
    c := iccDynamicObject.Create;

    c['asd'] := 123;

    c.Destroy;
end;
Run Code Online (Sandbox Code Playgroud)

在DELPHI 2010中设置断点iccDynamicObject.define() - > tmp:= locate(_id); 将导致@ Project Project1.exe引发异常类EVariantBadVarTypeError,并显示消息"Invalid variant type".@

代码在DELPHI 7中测试过,没遇到这个问题!

PS.代码是用delphi-7样式重写的,没有用于演示问题的类内类型...

求助 - >不要使用类内泛型类型,例如

classDef<_type> = 
    class
        type
            // this
            internalClass<_anotherType> =
                class
                    private
                        FSomething : _anotherType;
                end;
            // or this one
            internalClass2 =
                class
                    private
                        FSomething : _type;
                end;
        private
            FInternalClass  : internalClass<_type>;
            FInternalClass2 : internalClass;
    end;
Run Code Online (Sandbox Code Playgroud)

这样的事情将使调试器或编译器做出意想不到的事情!代码编译并正常工作.但在我的情况下,单位增长代码变得不稳定并强迫我进行一些代码重构,只是一点点,但不仅不方便......

你被注意到:)))

Dav*_*nan 5

这是D2010中的已知错误,已在QualityCentral中报告并在XE中修复.

  • 我不喜欢这样:你买D2010,它有一个bug,但它只在下一个你没有免费获得的版本中修复. (10认同)
  • @Remko这就是它的样子...... EMB并没有对它的顾客有所了解...... (4认同)
  • @Remko:我打算扮演魔鬼的拥护者.如果他们要修复所有的错误,比如版本latest-1或latest-2,这将涉及非常重要的工程工作.大量的开发和测试.就个人而言,就像我在2010年修复的错误一样,如果我能以合理的方式解决它们,我宁愿他们专注于改进主线产品(64位是我想看的东西).如果后端移植修复程序需要从64位开始,那么我不希望它完成. (2认同)