Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [Variants] 0 = Unassigned, wieso das denn? (https://www.delphipraxis.net/116901-%5Bvariants%5D-0-%3D-unassigned-wieso-das-denn.html)

alzaimar 8. Jul 2008 13:13


[Variants] 0 = Unassigned, wieso das denn?
 
Hi,

ich arbeite mal wieder mit Variants und dabei kriege ich wegen folgendem Bug ne Krise:

Delphi-Quellcode:
Var
  v : Variant;

begin
  v := 0;
  if v = Unassigned then ShowMessage('Delphi ist (Del)phies');
end;
Was glaubt Ihr, zeigt mein Delphi? Genau! angeblich ist "0 = Unassigned". Kann mir mal einer den Müll erklären?

Klappt mit D6E und BDS2006, ich könnte :kotz:

Christian Seehase 8. Jul 2008 13:54

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.

iKilledKenny 8. Jul 2008 13:58

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;

alzaimar 8. Jul 2008 14:44

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).

iKilledKenny 8. Jul 2008 14:52

Re: [Variants] 0 = Unassigned, wieso das denn?
 
Der Workaround klappt sehr wohl.

VarIsEmpty == (v = Unassigned)
VarIsNull == (v = NULL)

gammatester 8. Jul 2008 15:02

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

Christian Seehase 8. Jul 2008 15:13

Re: [Variants] 0 = Unassigned, wieso das denn?
 
Moin Alzaimar,

Zitat:

Zitat von alzaimar
nur ist der Bug schon seit 317 Jahren im System.

vielleicht hat ihn ja bislang noch niemand gemeldet... ;-)

alzaimar 8. Jul 2008 17:48

Re: [Variants] 0 = Unassigned, wieso das denn?
 
Zitat:

Zitat von gammatester
Hatten wir nicht neulich schon mal was ähnliches? Mit Delphi 6 Update Pack 2 tritt das Problem interessanterweise nicht auf (zumindest unter Win98).

Äh, ich habe UP2 bei mir drauf, dachte ich zumindest ... Ach egal, der Workaround von iKilledKenny funktioniert.

Guido Eisenbeis 8. Jul 2008 19:33

Re: [Variants] 0 = Unassigned, wieso das denn?
 
Hallo alzaimar, ich verstehe dein Problem nicht wirklich. :gruebel:

Zitat:

Zitat von alzaimar
ich arbeite mal wieder mit Variants und dabei kriege ich wegen folgendem Bug ne Krise:

Wie kommst du darauf, dass das ein Bug ist?

Zitat:

Zitat von alzaimar
Hi,
Delphi-Quellcode:
Var
  v : Variant;

begin
  v := 0;
  if v = Unassigned then ShowMessage('Delphi ist (Del)phies');
end;

Was ist denn deine Absicht? Willst du prüfen, ob die Variant v leer ist (sprich kein Wert zugewiesen wurde)?

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:
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;
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)

Ich hoffe, ich hab das nicht falsch verstanden.

Guido.

Guido Eisenbeis 8. Jul 2008 19:40

Re: [Variants] 0 = Unassigned, wieso das denn?
 
.
Hier noch schnell die Deklarationen nachgeschoben. Vielleicht hilfts! :-D

Delphi-Quellcode:
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;
Guido.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 Uhr.
Seite 1 von 2  1 2      

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