![]() |
[Variants] 0 = Unassigned, wieso das denn?
Hi,
ich arbeite mal wieder mit Variants und dabei kriege ich wegen folgendem Bug ne Krise:
Delphi-Quellcode:
Was glaubt Ihr, zeigt mein Delphi? Genau! angeblich ist "0 = Unassigned". Kann mir mal einer den Müll erklären?
Var
v : Variant; begin v := 0; if v = Unassigned then ShowMessage('Delphi ist (Del)phies'); end; Klappt mit D6E und BDS2006, ich könnte :kotz: |
Re: [Variants] 0 = Unassigned, wieso das denn?
Moin alzaimar,
das halte ich mal für einen Bug. Immerhin ist auch NULL <> unassigned ;-) Wenn Du mit NULL vergleichst klappt es. |
Re: [Variants] 0 = Unassigned, wieso das denn?
Ich prüfe das immer so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var v : Variant; i : Integer; begin i := 0; v := i; if VarIsNull (v) or VarIsEmpty (v) then ShowMessage ('Unassigned'); v := Unassigned; end; |
Re: [Variants] 0 = Unassigned, wieso das denn?
Ahoj,
so sehe ich das auch, nur ist der Bug schon seit 317 Jahren im System. Der Fehler liegt in der schlampigen Programmierung der VarCompareSimple: Dort wird aus Unassigned einfach der korrespondierende 0-Wert des zweiten Variants. Hier müsste man vorher prüfen, ob entweder die linke oder die rechte Seite 'UnAssigned' ist und dann sofort False liefern, denn ein Vergleich mit unassigned liefert immer False (außer mit Unassigned selbst). Na ja, Schlampen halt :mrgreen: iKilledKenny: Danke für den Workaround, nur ist nicht 100% korrekt, den Null != Unassigned, Du machst aber keinen Unterschied (ich denke aber, das Dir das egal ist). |
Re: [Variants] 0 = Unassigned, wieso das denn?
Der Workaround klappt sehr wohl.
VarIsEmpty == (v = Unassigned) VarIsNull == (v = NULL) |
Re: [Variants] 0 = Unassigned, wieso das denn?
Hatten wir nicht neulich schon mal was ähnliches? Mit Delphi 6 Update Pack 2 tritt das Problem interessanterweise nicht auf (zumindest unter Win98).
Gruß Gammatester |
Re: [Variants] 0 = Unassigned, wieso das denn?
Moin Alzaimar,
Zitat:
|
Re: [Variants] 0 = Unassigned, wieso das denn?
Zitat:
|
Re: [Variants] 0 = Unassigned, wieso das denn?
Hallo alzaimar, ich verstehe dein Problem nicht wirklich. :gruebel:
Zitat:
Zitat:
Nach meinem Verständnis geht das mit Unassigned nicht. Unassigned ist lediglich dazu da, um eine Variant auf leer zu setzen, nicht um zu prüfen. Was würde man denn da auch prüfen? Leer = Leer? Nicht leer = Leer? Sein oder nicht sein? Auszug aus der MSDN: Eine Varianten-Variable kann leer sein, d.h., dass noch kein Wert zugewiesen wurde. Die Funktion Unassigned gibt eine leere Variante zurück, die einer Varianten-Variable zugewiesen werden kann, um den Anfangsstatus der Variable wiederherzustellen. Verwenden Sie die Funktion VarIsEmpty , um zu prüfen, ob eine Variante leer ist. Bei einer leeren Variante gibt die Standardfunktion VarType den Wert varEmpty zurück. Zur Verdeutlichung:
Delphi-Quellcode:
Sieh dir mal die Ergebnisse an. Soweit ich das verstehe ist leer != 0 und 0 != Null (und für den Fall der Fälle Null != nil)
procedure TForm1.FormCreate(Sender: TObject);
Var g: Variant; v: Variant; begin if g = v then ShowMessage('Leere Variant = Leere Variant ???'); if VarIsNull(v) then ShowMessage('VarIsNull vorher'); if VarIsEmpty(v) then ShowMessage('VarIsEmpty vorher'); v := 0; // Wert wird zugewiesen, Variant ist also nicht mehr leer, // könnte aber mit Unassigned wieder leer gesetzt werden. // if v = Unassigned then ShowMessage('Delphi ist (Del)phies'); if VarIsNull(v) then ShowMessage('VarIsNull mittendrin'); if VarIsEmpty(v) then ShowMessage('VarIsEmpty mittendrin'); v := Null; if VarIsNull(v) then ShowMessage('VarIsNull nachher'); if VarIsEmpty(v) then ShowMessage('VarIsEmpty nachher'); end; Ich hoffe, ich hab das nicht falsch verstanden. Guido. |
Re: [Variants] 0 = Unassigned, wieso das denn?
.
Hier noch schnell die Deklarationen nachgeschoben. Vielleicht hilfts! :-D
Delphi-Quellcode:
Guido.
function Unassigned: Variant;
begin _VarClear(TVarData(Result)); end; procedure _VarClear(var V: TVarData); begin // byrefs and those inline data types are easy if (V.VType and varDeepData) = 0 then V.VType := varEmpty else VarClearDeep(V); end; -------------------------------------------- function Null: Variant; begin _VarNull(TVarData(Result)); end; procedure _VarNull(var V: TVarData); begin _VarClear(V); V.VType := varNull; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz