AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Warum gibt es hier einen VarCastError?
Thema durchsuchen
Ansicht
Themen-Optionen

Warum gibt es hier einen VarCastError?

Ein Thema von BlueStarHH · begonnen am 20. Mai 2022 · letzter Beitrag vom 21. Mai 2022
 
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#4

AW: Warum gibt es hier einen VarCastError?

  Alt 21. Mai 2022, 12:21
Sagen wir es mal so: Ich fand in den anderen Funktionen (noch) nichts, was für diesen Fehler verantwortlich sein könnte, also blieb erstmal nur noch das übrig.



PS: Unassigned = Clear
und Empty ist auch im Clear mit enthalten

Entsprechend bleibt funktionell kaum noch etwas übrig.
Delphi-Quellcode:
function VarToIntDef(const V: Variant; const ADefault: Integer): Integer;
begin
  if VarIsOrdinal(V) {and not VarIsEmptyOrNull(V)} then // ist es Ordinal, ist es gleichzeitig niemals das Andere
    Result := V //:= _VarToInteger(V) // größer signed 32-Bit knallt es
  else
    Result := ADefault;
end;

{function VarIsEmptyOrNull(const Value: Variant): Boolean;
begin
  Result := VarIsClear(Value) or VarIsNull(Value);
  if not Result and VarIsStr(Value) then
    Result := Value = '';
end;}
VarIsEmptyOrNull hat auf's Ergebnis keinen Einfluss,
aber es wird dennoch ausgeführt, wenn VarIsOrdinal zutrifft, wobei es dann immer False lieft.
(und and not False , bzw. and True ändert dann nichts mehr)

VarCompareValue und VarIsEmpty werden immer nur sinnlos ausgeführt.
Sie liefern immer nur True, wenn das VarIsClear bereits gemacht hatte und dann werden sie vom OR nicht mehr ausgeführt.
Alles in VarIsEmptyOrNull wird auch nur ausgefüjrt, wenn VarIsOrdinal True sagte, wo dann alles im VarIsEmptyOrNull nur noch False liefern kann.
(es wird also alles zwar ausgeführt, aber sinnlos, da es das Endergebnis nicht beeinflussen kann, weil es ja immer and True sein wird, sobald es ausgeführt wird)

Was am Ende übrig bleibt, kann eigentlich keinen CastError auslösen (abgesehn von eventuell dem, was sinnlos enthalten war)
und übrig bleibt noch ein Fehler, wenn es größer als 32 Bit wird. (ERangeError)

Du hast also viel Code, der eigentlich nichts macht, da er keine Auswirkung auf's Ergebnis hat, außer eventuell Fehler zu verursachen.

Lösung:
Delphi-Quellcode:
function VarToIntDef(const V: Variant; const ADefault: Integer): Integer;
begin
  if VarIsType(V, [varSmallInt, varInteger, varBoolean, varShortInt, varByte, varWord]) then // entspricht VarIsOrdinal bis Int32 (signed 32-Bit)
    Result := V
  {else if VarIsStr(V) then
    Result := StrToIntDef(V, ADefault)}

  else
    Result := ADefault;
end;
Allerdings fehlt bei deinem Code, z.B. die Behandlung von nummerischen Strings, welche ich oben noch heimlich mit eingefügt hab.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (21. Mai 2022 um 12:59 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 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 by Thomas Breitkreuz