Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Boolean.ToString geht nicht?! (https://www.delphipraxis.net/214802-boolean-tostring-geht-nicht.html)

Rolf Frei 12. Mär 2024 13:17

Delphi-Version: 11 Alexandria

Boolean.ToString geht nicht?!
 
Ich möchte gerne einen Boolean in Stringform anzeigen. Dazu wollte ich BoolVar.ToString nutzen. Leider btingt mir das immer den Zahlenwert, also 0 oder -1. Die Boolean.ToString Helperfunktionen scheinen nicht zu funktionieren. Da läuft irgendwas mit den Default Parametern der Helperklasse und ser Sysutils.BooToStr Funktion ziemlich falsch.

Delphi-Quellcode:
var
  b: Boolean;
  s: String;
begin
  b := True;
  s := b.ToString;  // liefert '-1'
  s := b.ToString(True); // Liefert '-1', müsste aber 'True' liefern

  b := False;
  s := b.ToString;  // liefert '0'
  s := b.ToString(True); // Liefert '-1' ?! Der True Parameter müsste steuern, ob die BooleStr verwendet werden sollen (UseBooleStrs)!

Der schöne Günther 12. Mär 2024 13:38

AW: Boolean.ToString geht nicht?!
 
Ich nehme immer
Delphi-Quellcode:
meinBoolean.ToInteger().ToString()
, damit bekommst du 0 für False und 1 für True ��

itsChris 12. Mär 2024 13:46

AW: Boolean.ToString geht nicht?!
 
Hi,

habe das gerade ausprobiert und das gleiche Verhalten wie Rolf. Irgendwie kommt der Compiler mit der überladenen Funktion vom Helper durcheinander. Wenn man der .ToString-Methode True übergibt (ruft BoolToStr auf), interpretiert das die aufgerufene BoolToStr-Methode komischerweise als False. Es funktioniert nur, wenn den gewünschten Parameter TUseBoolStrs.True benutzt wird, obwohl TUseBoolStrs ja auf True oder False verweist, was irgendwie komisch ist.
Delphi-Quellcode:
  var
    b: Boolean;
    s: string;
  begin
    b := True;
    s := b.ToString;                      //-1, richtig
    s := b.ToString(True);                //-1, obwohl 'True' erwartet, siehe Rolfs Kommentar
    s := b.ToString(TUseBoolStrs.True); //'True', richtig
    s := BoolToStr(b, True);              //'True', richtig
  end;
Die Rückgabe von 0 und -1 ist richtig, siehe Doku:
https://docwiki.embarcadero.com/Libr...tils.BoolToStr

Als Alternative kannst du einfach
Delphi-Quellcode:
s := BoolToStr(b, True);
benutzen.

BerndS 12. Mär 2024 13:52

AW: Boolean.ToString geht nicht?!
 
Was funktioniert ist:
Delphi-Quellcode:
 s := b.ToString(TUseBoolStrs.True);
hier wird im class helper nicht richtige Funktion verwendet. (zumindest in meinen Beispiel)
True <> TUseBoolStrs.True :gruebel:

Rolf Frei 12. Mär 2024 14:15

AW: Boolean.ToString geht nicht?!
 
Ja das mit dem TUseBoolStrs.True habe ich unterdessen auch rausgefunden. Bool.ToString(TUseBoolStrs.True) liefert "True", Bool.ToString(True) liefert "-1".

Hat da wer eine plausible Erklärung für dieses Verhalten und wieso man da unbedingt TUseBoolStrs.True nutzen muss?

Der schöne Günther 12. Mär 2024 14:18

AW: Boolean.ToString geht nicht?!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das siehst du doch eigentlich direkt auf den ersten Blick:
Anhang 56721

jaenicke 12. Mär 2024 14:21

AW: Boolean.ToString geht nicht?!
 
entfernt - habe mich geirrt

Uwe Raabe 12. Mär 2024 14:34

AW: Boolean.ToString geht nicht?!
 
Zitat:

Zitat von Rolf Frei (Beitrag 1534505)
Hat da wer eine plausible Erklärung für dieses Verhalten und wieso man da unbedingt TUseBoolStrs.True nutzen muss?

Na ja, in einem Fall wird halt die class function aufgerufen, deren erster Parameter der umzuwandelnde Boolean ist. Der optionale zweite Parameter gibt dann die Darstellung an.

Bei der regulären function gibt es nur den optionalen Parameter für die Darstellung.

Problematisch ist hier die Kombination von Overloads und optionalen Parametern gepaart mit der Kollision des zu bearbeitenden Typs (Boolean) und dem erwarteten Parameter für die Darstellung (ebenfalls Boolean). Diese Kollision wurde mit dem neuen Typ TUseBoolStrs umgangen. Leider passt das nicht mehr zur Erwartungshaltung des Entwicklers.

Es gibt aber auch Meinungen, dass ein Aufruf einer class function nur über die Angabe des Typs und nicht einer Variablen des Typs gehen dürfte. Ich fürchte nur, dass eine solche Einschränkungen eine Menge Code nicht mehr compilieren ließe.

Rolf Frei 12. Mär 2024 14:47

AW: Boolean.ToString geht nicht?!
 
Ok danke für die Erläuterung. Wenn ich da als Anwender den Defaultwert False in der Parmaterliste sehe, komme ich nicht dirket auf die Idee, da TUseBoolStrs.True zu verwenden. Wäre dort der Defaultwert mit TUseBoolStrs.False angezeigt worden, wäre es wohl deutlich klarer gewesen.

Der schöne Günther 12. Mär 2024 14:52

AW: Boolean.ToString geht nicht?!
 
Zitat:

Zitat von Rolf Frei (Beitrag 1534512)
Wäre dort der Defaultwert mit TUseBoolStrs.False angezeigt worden, wäre es wohl deutlich klarer gewesen.

Das stimmt allerdings.

Hätten wir einen funktionierenden Bugtracker oder Feedback-System bei Embarcadero, könnte man das sogar dort einreichen.

Uwe Raabe 12. Mär 2024 15:33

AW: Boolean.ToString geht nicht?!
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1534513)
Hätten wir einen funktionierenden Bugtracker oder Feedback-System bei Embarcadero, könnte man das sogar dort einreichen.

Man arbeitet daran...

himitsu 12. Mär 2024 15:35

AW: Boolean.ToString geht nicht?!
 
Ja, leider ist dieses ToString etwas pervers
und nicht mit
Delphi-Quellcode:
BoolToStr
vergleichbar.

Im Boolean-Helper gibt es auch zwei Versionen,
also einmal von der Variable aus
und dann nochmal als Class-Funktion.

Und das Gewollte bekommst du nur von der normalen Funktion, in Verbindung mit diesem TUseBoolStrs,
sonst springt es auf die Class-Function, bei deinem True,
wo die Lösung dann
Delphi-Quellcode:
Boolean.ToString(b, TUseBoolStrs.True)
wäre, oder eben
Delphi-Quellcode:
b.ToString(TUseBoolStrs.True)
:freak:

mytbo 12. Mär 2024 17:07

AW: Boolean.ToString geht nicht?!
 
Zitat:

Zitat von Rolf Frei (Beitrag 1534505)
Hat da wer eine plausible Erklärung für dieses Verhalten und wieso man da unbedingt TUseBoolStrs.True nutzen muss?

Von höchster Stelle.

Bis bald...
Thomas

himitsu 12. Mär 2024 17:19

AW: Boolean.ToString geht nicht?!
 
Jupp, weil es sonst die beiden gleichnamigen Funktionen / Class-Functions nicht unterscheiden kann, wenn sie den "selben" Parameter-Typ besitzen.

Dieser Scoped-Enum ist aber dahingehend pervers, weil man dessen Namen nicht kennt (ständig vergisst) und die Codevervollständigung ihn dir oft nicht sagen will.

Statt "diesem Parameter", entweder unterschiedliche Funktionsnamen für Funktion und Klassenfunktion
oder für Nummerisch (0 oder -1) und Namentlich (False oder True).


Wobei, wer um Himmels Willen nutzt überhaupt die Class-Functions .... weg mit dem Schrott. (Unterschied siehe #12)




Warum gegen eigentlich BoolToStr und ToString -1 aus, obwohl das True vom Delphi-"Boolean" eigentlich als +1 deklariert ist? (nur kleinstes Bit gesetzt)
Ja, das TRUE vom C++ im BOOL/LongBool, sowie ByteBool und WordBool, ist als -1 deklariert (alle Bits gesetzt)

Aber OK, von der Auswertung her ist es egal, da False = 0 und True = nicht 0.
(PS: drum ist
Delphi-Quellcode:
if B = True then
immer eine schlechte Idee)

QuickAndDirty 12. Mär 2024 23:29

AW: Boolean.ToString geht nicht?!
 
Delphi-Quellcode:
var b:Boolean = true;
Showmessage(ord(b).tostring);
Oder
Delphi-Quellcode:
//Evtl reihenfolge umtauschen...habe hier keine IDE zur Hand um das zu prüfen.
Const
B2I:Array [Boolean] of Integer = (0,1);
B2S:Array [Boolean] of String = ('False, True');
I2B:array [0..1] of Boolean (false, True);
Für so typumwandlungen von kleinen ordinalen Typen wie Boolean oder Enums sollten Konnstanten Array und Ord() doch gut sein .


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:15 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