Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Ausdrücke vergleichen (https://www.delphipraxis.net/172377-ausdruecke-vergleichen.html)

BMI 29. Dez 2012 22:38

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
  • mindestens 1 Teilstring sollte aber nicht leer sein (macht sonst keinen Sinn);
  • ob die 3 anderen etwas enthalten ist optional (sind alles Strings aus den Edit.text)
  • Aber wenn sie nicht leer sind - müssen sie alle im Hauptstring enthalten sein, damit es gültig wird.

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

Helmi 29. Dez 2012 22:51

AW: Ausdrücke vergleichen
 
hallo,

vielleicht so:

Delphi-Quellcode:
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;
Sobald ein Text vorhanden ist wird count1 hochgezählt
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;

Aphton 29. Dez 2012 22:54

AW: Ausdrücke vergleichen
 
Delphi-Quellcode:
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;
Btw. kleine Anmerkung zu deiner Programmiersyntax-rechtschreibung:
== existiert in Delphi nicht
Pos liefert 0 zurück, falls substring nicht gefunden werden konnte und nicht -1

Helmi 29. Dez 2012 23:05

AW: Ausdrücke vergleichen
 
Zitat:

Zitat von Aphton (Beitrag 1197108)
Delphi-Quellcode:
function komischeBedingung(): Boolean;
var
  i: Integer;
  ABCD: Array[0..3] of Boolean;

dein Array muss vom Typ String sein, nicht Boolean

Popov 30. Dez 2012 01:04

AW: Ausdrücke vergleichen
 
Weil es lustig aussieht und ich zu so späten Stunde noch logische Gedanken fassen kann:

Delphi-Quellcode:
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));
Edit:

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));

Furtbichler 30. Dez 2012 07:58

AW: Ausdrücke vergleichen
 
Delphi-Quellcode:
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;
Das finde ich am lesbarsten, denn es entspricht 1:1 deiner Vorgabe. Kein Zählen, keine Zwischenvariablen, keine Tricks.

Hinweis:Man könnte die Funktion 'AtLeastOnePatternIsNotEmpty' performancetechnisch optimieren.

Aphton 30. Dez 2012 08:11

AW: Ausdrücke vergleichen
 
Zitat:

Zitat von Helmi (Beitrag 1197109)
Zitat:

Zitat von Aphton (Beitrag 1197108)
Delphi-Quellcode:
function komischeBedingung(): Boolean;
var
  i: Integer;
  ABCD: Array[0..3] of Boolean;

dein Array muss vom Typ String sein, nicht Boolean

Jo stimmt, sry

BMI 30. Dez 2012 09:36

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 05:35 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