Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Umsetzungsproblem Filterklasse (https://www.delphipraxis.net/52779-umsetzungsproblem-filterklasse.html)

CalganX 3. Sep 2005 15:33


Umsetzungsproblem Filterklasse
 
Hi,
ich habe mir für ein Projekt eine Klasse geschrieben, die eine TIdMessage auf einige Dinge überprüfen soll. Genau gekommen ist es eine Filterklasse. Das Problem ist nun, dass ich verschiedene Kriterien in Form eines Sets habe und ich jetzt irgendwie bei der Ergebnis Berechnung dieses Set einbeziehen muss.
Derzeit sieht das ganze so aus:
Delphi-Quellcode:
function TFilterClass.Match(aMessage: TIdMessage): boolean;
var
  Result1, Result2, Result3, Result4: boolean;
begin
  Result := false;

  // Einzelne Such-Felder überprüfen
  if ([sSubject] in FSearchIn) then begin // Betreff
    Result1 := { Überprüfe... };
  end;
  if ([sFrom] in FSearchIn) then begin // Absender
    Result2 := { Überprüfe... };
  end;
  if ([sTo] in FSearchIn) then begin // Empfänger
    Result3 := { Überprüfe... };
  end;
  if ([sBody] in FSearchIn) then begin // Nachrichteninhalt
    Resul4 := { Überprüfe... };
  end;

  Result := { ENDGÜLTIGES ERGEBNIS }
end;
Mein Problem ist beim endgültigen Ergebnis. Denn ich kann nicht einfach die ganzen einzelnen Results mit and verknüpfen, da ich ja dann z.B. haben (true, true, false, false), obwohl die letzten beiden Results nicht berücksichtigt werden können, da sie nicht in dem FSearchIn-Set vorhanden sind. D.h. die Nachricht würde rausfallen, obwohl eigentlich die Nachricht auf den Filter zutrifft. :?

Kann mir da jemand einen Vorschlag machen bzw. die Erleuchtung bringen? :( :coder2:

Chris

Basilikum 3. Sep 2005 15:57

Re: Umsetzungsproblem Filterklasse
 
Delphi-Quellcode:
function TFilterClass.Match(aMessage: TIdMessage): boolean;
begin
  Result := true; // initialisieren

  // Einzelne Such-Felder überprüfen
  if ([sSubject] in FSearchIn) then begin // Betreff
    Result := Result and { Überprüfe... };
  end;
  if ([sFrom] in FSearchIn) then begin // Absender
    Result := Result and { Überprüfe... };
  end;
  if ([sTo] in FSearchIn) then begin // Empfänger
    Result := Result and { Überprüfe... };
  end;
  if ([sBody] in FSearchIn) then begin // Nachrichteninhalt
    Result := Result and { Überprüfe... };
  end;
end;
oder
Delphi-Quellcode:
function TFilterClass.Match(aMessage: TIdMessage): boolean;
begin
  Result := false;

  // Einzelne Such-Felder überprüfen
  if ([sSubject] in FSearchIn) then begin // Betreff
    if not { Überprüfe... } then Exit;
  end;
  if ([sFrom] in FSearchIn) then begin // Absender
    if not { Überprüfe... } then Exit;
  end;
  if ([sTo] in FSearchIn) then begin // Empfänger
    if not { Überprüfe... } then Exit;
  end;
  if ([sBody] in FSearchIn) then begin // Nachrichteninhalt
    if not { Überprüfe... } then Exit;
  end;

  Result := true;
end;

CalganX 3. Sep 2005 17:29

Re: Umsetzungsproblem Filterklasse
 
Hi,
ja, danke. Das ist genau das was ich gesucht habe (auch wenn ich deine zweite Lösung genau anders rum verwendet habe :zwinker:).

Chris

SirThornberry 3. Sep 2005 17:43

Re: Umsetzungsproblem Filterklasse
 
du kannst auch die ergebnisse zusammennehmen und mit and verknüpfen und darin mit or
Zitat:

z.B. haben (true, true, false, false), obwohl die letzten beiden Results nicht berücksichtigt werden können, da sie nicht in dem FSearchIn-Set vorhanden sind
dann gehts doch so
Delphi-Quellcode:
result := (not([sSubject] in FSearchIn) or true) and
          (not([sFrom] in FSearchIn) or true) and
          (not([sTo] in FSearchIn) or false) and
          (not([sBody] in FSearchIn) or false);
(anstelle von den constanten true bzw. false musst du dort natürlich die andere Bedingungen einsetzen)


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