Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi TBooleanHelper (https://www.delphipraxis.net/207023-tbooleanhelper.html)

Willie1 17. Feb 2021 18:15

TBooleanHelper
 
Hallo,
ich habe mehrere Variablen vom Typ Boolean, die ich mit einem jeweils anderen Text versehen will.
FalseBoolStrs := ['Aus']; TrueBoolStrs:=['An'];
B1.ToString(TUseBoolStrs.true);
..
B2.ToString(TUseBoolStrs.true);
..
B3.ToString(TUseBoolStrs.true);
B1,B2,B3 kommen in mehreren Units vor und werden benutzt.

Meine Frage: Ich muss also jedes mal FalseBoolStr, .. neu definieren, wenn B?.ToString vorkommt? Dass FalseBoolStrs, .. ein Array sind, hilft mir hier nicht weiter?
Willie.

jfheins 17. Feb 2021 19:05

AW: TBooleanHelper
 
Ich denke, du kannst dir sicher eine globale Funktion schreiben, die einen Boolean in einen string passend konvertiert. Diese dann einfach in eine utils unit und überall einbinden. Fertig ;-)

Wenn die utils unit zu groß wird, aufteilen. Aber so eine Bool => String methode ist ja einfach zu testen, klein und pur => sollte kein Problem darstellen, wenn die global ist.

himitsu 17. Feb 2021 19:08

AW: TBooleanHelper
 
Erstmal: NIEMALS die Default aus diesen Variablen löschen, sondern Deines nur anhängen.
Jedes BoolToStr, StrToBool, Boolean.ToString usw. verwendet Dieses.

Aber am Besten du schreibst dir hierfür ein eingene Funktion, bzw. eigenen Helper,
oder wie wäre es mit
Delphi-Quellcode:
IfThen(B1, 'An', 'Aus')
?

Uwe Raabe 17. Feb 2021 21:32

AW: TBooleanHelper
 
Alternativ kann man auch eine globale Konstante erstellen:
Delphi-Quellcode:
const
  cBoolStr: array[Boolean] of string = ['aus', 'an'];

...
  cBoolStr[B1];
  cBoolStr[B2];
  cBoolStr[B3];
Von einem Überschreiben der Standard-Arrays würde ich auch abraten. Die werden auch an anderen Stellen benutzt.

Willie1 18. Feb 2021 10:15

AW: TBooleanHelper
 
Zitat:

Zitat von himitsu (Beitrag 1483232)
Erstmal: NIEMALS die Default aus diesen Variablen löschen, sondern Deines nur anhängen.
Jedes BoolToStr, StrToBool, Boolean.ToString usw. verwendet Dieses.

Ich habe verstanden. Aber wo soll ich das anhängen? Tue/FalseBoolStrs sind zu Beginn doch leer.
Delphi-Quellcode:
const
  cBoolStr: array[Boolean] of string = ['aus', 'an'];
Uwe Raabe, Globale Konstante: an diese Möglichkeit hatte ich gedacht aber ich wollte die Helferlein benutzen. Aber so könnte ich das Brett an der dünnsten Stelle bohren. Trotzdem effektiv!
Willie.

Uwe Raabe 18. Feb 2021 10:47

AW: TBooleanHelper
 
Zitat:

Zitat von Willie1 (Beitrag 1483269)
Tue/FalseBoolStrs sind zu Beginn doch leer.

Wenn sie leer sind, werden sie mit dem ersten Aufruf von BoolToStr oder TryStrToBool initialisiert (siehe VerifyBoolStrArray in System.SysUtils).

Willie1 18. Feb 2021 10:59

AW: TBooleanHelper
 
Das bedeutet, mit SetLength(True/FalseBoolStrs, 0) setze ich wieder auf die Defaultwerte zurück? Wi.

Uwe Raabe 18. Feb 2021 11:20

AW: TBooleanHelper
 
Zitat:

Zitat von Willie1 (Beitrag 1483274)
Das bedeutet, mit SetLength(True/FalseBoolStrs, 0) setze ich wieder auf die Defaultwerte zurück? Wi.

Genau.

himitsu 18. Feb 2021 12:19

AW: TBooleanHelper
 
oder
Delphi-Quellcode:
FalseBoolStrs := nil;
, was auch einem SetLength 0 entspricht.

Willie1 18. Feb 2021 18:37

AW: TBooleanHelper
 
Delphi-Quellcode:
function BoolToStrs(B: Boolean; const Falsestr, Truestr: string): string;
begin
  if (FalseStr <> '') and (Truestr <> '') then begin
    FalseBoolStrs := [Falsestr];
    TrueBoolStrs := [Truestr];;
  end;
  Result := B.ToString(TUseBoolStrs.True);
  FalseBoolStrs := nil; //zurück auf Defaultwerte.
  TrueBoolStrs := nil;
end;
Ich will es so machen und in einer Tool-Bibliothek ablegen. Geht das in Ordnung?
Willie.

himitsu 18. Feb 2021 18:50

AW: TBooleanHelper
 
Klar ginge es (meistens)

* spaßig wird es bei MultiThread, den diese Zugriffe sind nicht thread-save

* und warum die globalen variablen umschreiben, anschließend wieder löschen, wodurch sie von anderen wieder neu initialisiert werden müssen,
anstatt direkt nur was Eigenes zu nehmen?

Anstatt die globalen Variablen zu ändern, kannst auch nur deine Lokalen anpassen, wenn leer.
Delphi-Quellcode:
// zuerst B und dann die Strings

function BoolToStrs(B: Boolean; const FalseStr, TrueStr: string): string;
begin
  //VerifyBoolStrArray; // ich geh jetzt einfach mal davon aus das ist schon initialisert, vorallem da man von außen VerifyBoolStrArray nicht aufrufen kann
  if B then
    if TrueStr <> '' then
      Result := TrueStr
    else
      Result := TrueBoolStrs[0]
  else
    if FalseStr <> '' then
      Result := FalseStr
    else
      Result := FalseBoolStrs[0];
end;

function BoolToStrs(B: Boolean; const FalseStr, TrueStr: string): string;
begin
  //VerifyBoolStrArray;
  if B then
    Result := IfThen(TrueStr <> '', TrueStr, TrueBoolStrs[0]) // Result := Coalesce(TrueStr, TrueBoolStrs[0])
  else
    Result := IfThen(FalseStr <> '', FalseStr, FalseBoolStrs[0]); // Result := Coalesce(FalseStr, FalseBoolStrs[0]);

  //Result := IfThen(B, IfThen(TrueStr <> '', TrueStr, TrueBoolStrs[0]), IfThen(FalseStr <> '', FalseStr, FalseBoolStrs[0]));
  //Result := IfThen(B, Coalesce(TrueStr, TrueBoolStrs[0]), Coalesce(FalseStr, FalseBoolStrs[0]));
end;
// soein Coalesce, wie man es aus Datenbanken kenn, hatte ich mir für String/Integer einfach mal nachgebaut

// zuerst die Strings und dann B

function BoolToStrs(B: Boolean; FalseStr, TrueStr: string): string;
begin
  //VerifyBoolStrArray;
  if TrueStr = '' then TrueStr := TrueBoolStrs[0];
  if FalseStr = '' then FalseStr := FalseBoolStrs[0];
  if B then Result := TrueStr else Result := FalseStr;
end;
bzw. BoolToStr oder ToString anstatt TrueBoolStrs/FalseBoolStrs
Delphi-Quellcode:
function BoolToStrs(B: Boolean; const FalseStr, TrueStr: string): string;
begin
  if B and (TrueStr <> '') then
    Result := TrueStr
  else
  if not B and (FalseStr <> '') then
    Result := FalseStr
  else
    Result := B.ToString(TUseBoolStrs.true); // Result := BoolToStr(B, True);
end;
Und wer sich TUseBoolStrs.True ausgedacht hat, gehört ausgepeitscht.

Willie1 19. Feb 2021 15:54

AW: TBooleanHelper
 
Zitat:

Zitat von himitsu (Beitrag 1483313)
Und wer sich TUseBoolStrs.True ausgedacht hat, gehört ausgepeitscht.

Das möchte ich auch gerne wissen. Hier im Forum gibt es einen Bot, der einen Link enthält, wo das genau erklärt wird. Bot hin oder her, hier hilft er!
War ja gut, dass ich nachgefragt habe. Werde ich verarbeiten. Es soll für die Zukunft dann sicher funktionieren.
Gruß Willie.

Nachtrag: Funktioniert nicht, weil es True/FalseBoolStr[0] nicht gibt. Es kommt zu einer Zugriffsverletzung. W.


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