![]() |
Ausdrücke vergleichen
Hallo,
eigentlich dachte ich, es wäre unnötig deswegen hier zu posten, aber langsam denk ich, das vielleicht einer von Euch das auf Anhieb einfacher hinkriegen würde. Seit heute Nachmittag fummel ich hier an den Vergleichen herum. Aber so richtig will das nicht. Es geht darum, daß vier Strings aus Editboxen in Variablen (a,b,c,d) gelesen werden und dann soll getestet werden, ob die Strings aller "gefüllten" Editfelder im Hauptstring vorkommen Bedingung ist erfüllt, wenn alle Teilstrings (a,b, c, d) in dem Hauptstring XSTRING vorhanden sind, sofern sie NICHT leer sind
Code (grob)
Delphi-Quellcode:
if A <> "" then
if pos( A , XSTRING, 1) <> 0 then if B <> "" then if pos( B , XSTRING, 1) <> 0 then if C <> "" then if pos( C , XSTRING, 1) <> 0 then if D <> "" then if pos( D , XSTRING, 1) <> 0 then Hatte das wie unten - erst mit 4 Zwischenvariablen, damit ich das mit dem AND vergleichen kann -aber dann ist ja noch nicht sicher, daßdie Editfelder nicht leer waren Hier mal mein Versuch: Vielleicht so ??? Aber dann ist immer noch nicht geklärt, ob die Teilstrings B, C, D (genaugenommen auch A) überhaupt NICHT "" Leer sind
Delphi-Quellcode:
// wenn alle Teilstrings in XSTRING vorhanden sind
if A <> "" then if pos( A , XSTRING, 1) <> 0 then Q := 1; if B <> "" then if pos( B , XSTRING, 1) <> 0 then W := 1; if C <> "" then if pos( C , XSTRING, 1) <> 0 then E := 1; if D <> "" then if pos( D , XSTRING, 1) <> 0 then // ========================= IF Q and W and E and R = 1 then OK ! R := 1; Danke für jede gute Idee. EDIT: Sorry, war so in den Browser getippt |
AW: Ausdrücke vergleichen
hallo,
vielleicht so:
Delphi-Quellcode:
Sobald ein Text vorhanden ist wird count1 hochgezählt
var
count1: Integer; count2: Integer; begin count1 := 0; count2 := 0; if A <> '' then begin inc(count1); If pos(A, XSTRING) > 0 then inc(count2); end; if B <> '' then begin inc(count1); If pos(B, XSTRING) > 0 then inc(count2); end; if C <> '' then begin inc(count1); If pos(C, XSTRING) > 0 then inc(count2); end; if D <> '' then begin inc(count1); If pos(D, XSTRING) > 0 then inc(count2); end; If count1 > 0 then begin If count1 = count2 then ShowMessage('yaba daba do') else ShowMessage('Mind. 1 Text ist nicht im XSTRING vorhanden!'); end else begin ShowMessage('Mindestens ein Text fehlt!'); end; end; Wenn dann der jeweilige Text vorhanden ist, dann wird count2 hochgezählt Ist count1 größer null wurde mind. in ein Edit etwas eingegeben. Sind beide Werte gleich, dann waren auch noch beide Edit-Texte im XString vorhandeng gewesen [Edit]
Delphi-Quellcode:
procedure check_Text(const S: String; const XString: String; var count1: Integer; count2: Integer);
begin If S <> '' then begin inc(count1); If Pos(S, XString) > 0 then inc(count2); end; end; {...} var count1: Integer; count2: Integer; begin count1 := 0; count2 := 0; check_Text(A, XSTRING, count1, count2); check_Text(B, XSTRING, count1, count2); check_Text(C, XSTRING, count1, count2); check_Text(D, XSTRING, count1, count2); If count1 > 0 then begin If count1 = count2 then ShowMessage('yaba daba do') else ShowMessage('Mind. 1 Text ist nicht im XSTRING vorhanden!'); end else begin ShowMessage('Mindestens ein Text fehlt!'); end; end; |
AW: Ausdrücke vergleichen
Delphi-Quellcode:
Btw. kleine Anmerkung zu deiner Programmiersyntax-rechtschreibung:
function komischeBedingung(): Boolean;
var i: Integer; ABCD: Array[0..3] of Boolean; begin ABCD[0] := Edit1.Text; ABCD[1] := Edit2.Text; ABCD[2] := Edit3.Text; ABCD[3] := Edit4.Text; Result := False; // annahme: min eins nicht enthalten oder alle leer for i := 0 to 3 do if ABCD[i] <> '' then begin Result := True; // min 1. if Pos(ABCD[i], XString) = 0 then begin Result := False; // nicht alle existierende enthalten break; end; end; end; == existiert in Delphi nicht Pos liefert 0 zurück, falls substring nicht gefunden werden konnte und nicht -1 |
AW: Ausdrücke vergleichen
Zitat:
|
AW: Ausdrücke vergleichen
Weil es lustig aussieht und ich zu so späten Stunde noch logische Gedanken fassen kann:
Delphi-Quellcode:
Edit:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer; a, b, c, d, x: string; r: Boolean; begin x := '1234'; a := '1'; b := '2'; c := '3'; d := '4'; r := True; r := r and ((Length(a) = 0) or ((Length(a) > 0) and (Pos(a, x) > 0))); r := r and ((Length(b) = 0) or ((Length(b) > 0) and (Pos(b, x) > 0))); r := r and ((Length(c) = 0) or ((Length(c) > 0) and (Pos(c, x) > 0))); r := r and ((Length(d) = 0) or ((Length(d) > 0) and (Pos(d, x) > 0))); i := 0; if Length(a) > 0 then Inc(i); if Length(b) > 0 then Inc(i); if Length(c) > 0 then Inc(i); if Length(d) > 0 then Inc(i); r := r and (i > 0); ShowMessage(BoolToStr(r)); Zwar nicht wichtig, aber da oben ist einiges doppelt gemoppelt. Geht auch kürzer:
Delphi-Quellcode:
r := True;
r := r and ((Length(a) = 0) or (Pos(a, x) > 0)); r := r and ((Length(b) = 0) or (Pos(b, x) > 0)); r := r and ((Length(c) = 0) or (Pos(c, x) > 0)); r := r and ((Length(d) = 0) or (Pos(d, x) > 0)); |
AW: Ausdrücke vergleichen
Delphi-Quellcode:
Das finde ich am lesbarsten, denn es entspricht 1:1 deiner Vorgabe. Kein Zählen, keine Zwischenvariablen, keine Tricks.
Function IsContainedOrEmpty(Const pattern, text : String) : Boolean;
Begin if pattern='' then result := True else result := Pos(pattern,text)<>0; End; Function AtLeastOnePatternIsNotEmpty (Const a,b,c,d : String) : Boolean; Begin result := (a+b+c+d<>'') End; Function TextContainsAtLeastOneOfThePatterns(Const text, a,b,c,d : String) : Boolean; Begin Result := AtLeastOnePatternIsNotEmpty(a,b,c,d) and ( IsContainedOrEmpty(a,text) or IsContainedOrEmpty(b,text) or IsContainedOrEmpty(c,text) or IsContainedOrEmpty(d,text) ); End; Hinweis:Man könnte die Funktion 'AtLeastOnePatternIsNotEmpty' performancetechnisch optimieren. |
AW: Ausdrücke vergleichen
Zitat:
|
AW: Ausdrücke vergleichen
danke Euch allen,
jo, ich denke die letzte von Furtbichler scheint mir am übersichtlichsten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 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