Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TValue.AsVariant und Boolean - Fehler? (https://www.delphipraxis.net/197230-tvalue-asvariant-und-boolean-fehler.html)

Neutral General 23. Jul 2018 11:03

Delphi-Version: 10 Seattle

TValue.AsVariant und Boolean - Fehler?
 
Hallo,

Mir ist gerade aufgefallen, dass die Umwandlung eines Boolean-TValues in ein Variant nicht funktioniert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var val: TValue;
    bVar: Variant;
begin
  val := true;
  bVar := val.AsVariant;
  ShowMessage(VarToStr(bVar) + ' - ' + IntToStr(VarType(bVar)));
end;
Angezeigt wird "1 - 20". Und VarType 20 ist varInt64.

Das Problem liegt in der System.RTTI:
Delphi-Quellcode:
function Conv2Variant(const ASource: TValue; ATarget: PTypeInfo; out AResult: TValue): Boolean;
var v: Variant;
begin
  // ..
  case ASource.Kind of
    // ..
    tkEnumeration:
      v := ASource.AsOrdinal;
    // ..
  end;
  // ..
end;
In meinen Augen sollte da der Spezialfall
Delphi-Quellcode:
(ASource.Kind = tkEnumeration) and (ASource.TypeInfo = TypeInfo(Boolean))
behandelt werden, damit bei der Umwandlung von einem Boolean-TValue auch ein Variant mit dem Typ varBoolean rauskommt.

In meinen Augen ist das ein Fehler, oder sehe ich das falsch?

Uwe Raabe 23. Jul 2018 11:06

AW: TValue.AsVariant und Boolean - Fehler?
 
In Tokyo sieht das mittlerweile so aus:
Delphi-Quellcode:
    tkEnumeration:
        if ASource.IsType<Boolean> then
          v := ASource.AsBoolean
        else
          v := ASource.AsOrdinal;

Neutral General 23. Jul 2018 11:43

AW: TValue.AsVariant und Boolean - Fehler?
 
Sehr gut!
Dann hat sich das erledigt :)

Stevie 23. Jul 2018 16:16

AW: TValue.AsVariant und Boolean - Fehler?
 
Wusste doch, dass ich das schonmal gesehen habe - nur der Vollständigkeit halber: https://quality.embarcadero.com/browse/RSP-12449

In die andere Richtung ist übrigens noch fehlerhaft: https://quality.embarcadero.com/browse/RSP-20160 :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz