Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Überprüfen, ob drei Vergleiche gleich sind (https://www.delphipraxis.net/138606-ueberpruefen-ob-drei-vergleiche-gleich-sind.html)

xZise 13. Aug 2009 13:09


Überprüfen, ob drei Vergleiche gleich sind
 
Hallo ihr,

wie kann ich einfach überprüfen, ob in drei Strings kein Leerstring oder ein Leerstring steht?

Also wenn ich drei Strings (S1, S2, S3) habe soll folgendes bei dem Vergleich herauskommen:
  • Alle Strings sind leer (S1 = S2 = S3 = '') -> True
  • Alle Strings sind befüllt (S1 <> '' und S2 <> '' und S3 <>''), aber nicht zwingend gleich -> True
  • Ansonsten -> False

Ich möchte aber dabei das möglichst einfach halten, also ohne doppelte Zugriffe.

MfG
xZise

mkinzler 13. Aug 2009 13:12

Re: Überprüfen, ob drei Vergleiche gleich sind
 
Kännen Leerzeichen in den Strings vorkommen?

himitsu 13. Aug 2009 13:18

Re: Überprüfen, ob drei Vergleiche gleich sind
 
hmmmm?
Delphi-Quellcode:
if (S1 = '') xor (S2 = '') xor (S3 = '') then
// oder
if ((S1 = '') xor (S2 = '')) xor ((S1 = '') xor (S3 = '')) then
kann grad nicht so überlegen :oops:

ansonsten der einfache Weg ... so wie du es ja schon definiert hast :angel2:
Delphi-Quellcode:
if ((S1 = '') and (S2 = '') and (S3 = '')) or (S1 <> '') and (S2 <> '') and (S3 <> '') then

alzaimar 13. Aug 2009 13:19

Re: Überprüfen, ob drei Vergleiche gleich sind
 
Delphi-Quellcode:
Function XZiseSeinVergleich (const S1,S2,S3 : String) : Boolean;
Var
  b : Boolean;

Begin
  b := (S2 = '');
  Result := ((S1 = '') = b) And (b = (S3 = ''))
End;

xZise 13. Aug 2009 13:25

Re: Überprüfen, ob drei Vergleiche gleich sind
 
Hmmm, weiß ich nicht, also du willst wissen, ob Trim(SX) = '' wie SX = '' zu behandeln ist?

Nun ich weiß nicht wie ich das behandeln muss, aber auf was zielt die Frage ab? Wie wäre die Antwort wenn es erlaubt ist, und wie wenn es nicht erlaubt ist?

Also ich möchte damit testen, ob es sich um eine gültige Exceltabelle handelt. Und wahrscheinlich sind Leerzeichenfelder ein Fehlerkriterium (also wie False).

Zitat:

Zitat von himitsu
hmmmm?
Delphi-Quellcode:
if (S1 = '') xor (S2 = '') xor (S3 = '') then
// oder
if ((S1 = '') xor (S2 = '')) xor ((S1 = '') xor (S3 = '')) then
kann grad nicht so überlegen :oops:

ansonsten der einfache Weg ... so wie du es ja schon definiert hast :angel2:
Delphi-Quellcode:
if ((S1 = '') and (S2 = '') and (S3 = '')) or (S1 <> '') and (S2 <> '') and (S3 <> '') then

Naja oberes geht nicht (ich dachte auch an sowas), aber sobald zwei Strings True zurückgegeben, gibt er dennoch True zurück, dabei sollte er ja nur True zurückgegeben, wenn alle drei Leer oder nicht Leer sind.
Und der zweite Vergleich greift zweimal auf eine Variable zu und der dritte (so ist es gerade implementiert), greift auf jede zweimal zu und ich so ist es gerade bei mir, aber ich habe die Befürchtung, dass der doppelte Zugriff in die Zeit geht. (Kann es leider auch nicht testen, da ich hier kein Excel habe :D )

Zitat:

Zitat von alzaimar
Delphi-Quellcode:
Function XZiseSeinVergleich (const S1,S2,S3 : String) : Boolean;
Var
  b : Boolean;

Begin
  b := (S2 = '');
  Result := ((S1 = '') = b) And (b = (S3 = ''))
End;

Hmmm das ist ja himitsus erste Variante ohne doppelten Zugriff auf den String.

MfG
xZise

himitsu 13. Aug 2009 13:31

Re: Überprüfen, ob drei Vergleiche gleich sind
 
den "doppelten Zugriff hab ich mal ignoriert, da Delphi ja sowas braus machen

Delphi-Quellcode:
if S = '' then                if S <> '' then
if Pointer(S) = nil then      if Pointer(S) <> nil then
if not LongBool(S) then       if LongBool(S) then
also so Schlimm ist dann ein Vergleich via = oder <> garnicht :angel:

jfheins 13. Aug 2009 13:40

Re: Überprüfen, ob drei Vergleiche gleich sind
 
Da ja bereits simple Lösungen vorgeschlagen wurden:
Delphi-Quellcode:
if (((S1 = '') + (S2 = '') + (S3 = '')) mod 3) = 0 then
Da True einen Ordinalwert von 1 hat, kommt entweder 3 raus (alle string leer => Alle Vergleiche liefern True) oder 0 (Alle String befüllt => Alle Vergleiche False=0)
Das dann modulo 3 und du hast deinen Vergleich :mrgreen:

Evtl. sind noch casts notwendig, aber die Idee sollte deutlich werden :P

alzaimar 13. Aug 2009 13:42

Re: Überprüfen, ob drei Vergleiche gleich sind
 
Zitat:

Zitat von xZise
Hmmm das ist ja himitsus erste Variante ohne doppelten Zugriff auf den String.

Nee, korrekte Logik. Ich verwende '=', himitsu dagegen '<>'.
Außerdem hab ich das wirklich ehrlich unabhängig von himitsu ganz alleine hinbekommen. Und auußerdem bin ich in der Türkei, hier ist eine Stunde später, also hab ich das ja wohl eine Stunde früher gepostet und es ist wegen der Zeitverschiebung erst jetzt angekommen :freak: :wall:

xZise 13. Aug 2009 13:57

Re: Überprüfen, ob drei Vergleiche gleich sind
 
OOps, das sollte nicht so rüber kommen, als würdest du Code "stehlen", sondern mir ging es nur darum, da himitsus erste Variante ja geht, auch deine Variante geht :mrgreen:

Zitat:

Zitat von jfheins
Da ja bereits simple Lösungen vorgeschlagen wurden:
Delphi-Quellcode:
if (((S1 = '') + (S2 = '') + (S3 = '')) mod 3) = 0 then
Da True einen Ordinalwert von 1 hat, kommt entweder 3 raus (alle string leer => Alle Vergleiche liefern True) oder 0 (Alle String befüllt =&gt; Alle Vergleiche False=0)
Das dann modulo 3 und du hast deinen Vergleich :mrgreen:

Evtl. sind noch casts notwendig, aber die Idee sollte deutlich werden :P

Hmmm aber "BoolToStr" liefert für True "-1"?

Aber ich glaube so geht das dann auch, wenn True != 1 ist:
Delphi-Quellcode:
if (((S1 = '') + (S2 = '') + (S3 = '')) mod (3*True)) = 0 then
MfG
xZise

himitsu 13. Aug 2009 14:04

Re: Überprüfen, ob drei Vergleiche gleich sind
 
da muß man aufpassen

True (die Konstante):
BOOL (c) = LongBool (delphi) = -1 = $FFFFFFFF
WordBool (delphi) = -1 = $FFFF
bool (c) = ByteBool (delphi): -1 = $FF
Boolean (Delphi): 1 = $01

True (bei booleanischen Vergleichen):
alles: b<>0

True (bei binärischen Vergleichen):
alles: b=Wert

darum ist auch b=True so fartal, da dort wirklich geprüft wird, ob b genau dem True entspricht

False (die Konstante und bei Vergleichen):
alles: b=0


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 Uhr.
Seite 1 von 2  1 2      

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