AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ausdrücke vergleichen

Ein Thema von BMI · begonnen am 29. Dez 2012 · letzter Beitrag vom 30. Dez 2012
Antwort Antwort
Benutzerbild von BMI
BMI

Registriert seit: 16. Jul 2010
58 Beiträge
 
Delphi 2 Desktop
 
#1

Ausdrücke vergleichen

  Alt 29. Dez 2012, 23:38
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
eine Signatur? - in 2022? - WOZU ?!!!

Geändert von BMI (30. Dez 2012 um 10:21 Uhr) Grund: damit möglw. Anfänger mit selbem Problem nichts falsches lernen: bei pos()= -1 durch 0 ersetzt und == durch =
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Ausdrücke vergleichen

  Alt 29. Dez 2012, 23:51
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;
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<

Geändert von Helmi (30. Dez 2012 um 00:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Ausdrücke vergleichen

  Alt 29. Dez 2012, 23:54
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
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (29. Dez 2012 um 23:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Ausdrücke vergleichen

  Alt 30. Dez 2012, 00:05
Delphi-Quellcode:
function komischeBedingung(): Boolean;
var
  i: Integer;
  ABCD: Array[0..3] of Boolean;
dein Array muss vom Typ String sein, nicht Boolean
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

AW: Ausdrücke vergleichen

  Alt 30. Dez 2012, 02:04
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));

Geändert von Popov (30. Dez 2012 um 15:05 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#6

AW: Ausdrücke vergleichen

  Alt 30. Dez 2012, 08:58
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.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Ausdrücke vergleichen

  Alt 30. Dez 2012, 09:11
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
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von BMI
BMI

Registriert seit: 16. Jul 2010
58 Beiträge
 
Delphi 2 Desktop
 
#8

AW: Ausdrücke vergleichen

  Alt 30. Dez 2012, 10:36
danke Euch allen,

jo, ich denke die letzte von Furtbichler scheint mir am übersichtlichsten.
eine Signatur? - in 2022? - WOZU ?!!!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:29 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