Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Strategie für Propertyvergleich verschiedener Objecte

  Alt 24. Apr 2017, 12:58
Ich gehe mal davon aus dass Json und Objektlisten damit an sich nichts zu tun haben. Du hast ein Objekt. Das Objekt hat Eigenschaften. Du möchtest mitbekommen wenn sich diese Eigenschaften ("Properties") ändern bzw. Werte aufweisen die aufgestellte Kriterien verletzen.

Verpasse doch den Property-Settern einfach das Prüfen auf ein Kriterium. Das Kriterium selbst ist ein Objekt bzw. Record. Hier einmal beispielhaft für Luftdruck und Temperatur, min und max.

Delphi-Quellcode:
uses
   System.SysUtils,
   System.Classes;

   TElementChangeCriteria = record
      /// <remarks>
      /// <c>NaN</c> für "nicht vorhanden"
      /// </remarks>
      minTemperature:   Single;
      /// <remarks>
      /// <c>NaN</c> für "nicht vorhanden"
      /// </remarks>
      maxTemperature:   Single;
      /// <remarks>
      /// <c>NaN</c> für "nicht vorhanden"
      /// </remarks>
      minLuftdruck: Single;
      /// <remarks>
      /// <c>NaN</c> für "nicht vorhanden"
      /// </remarks>
      maxLuftdruck: Single;

      public class function None(): TElementChangeCriteria; static;
   end;

   TElement = class
      private var
         FName:   String;
         FTemperatur: Single;
         FLuftdruck: Single;
      private
         procedure setTemperatur(const Value: Single);
         procedure setLuftdruck(const Value: Single);
      protected
         function criteriaMet(): Boolean; virtual;
         procedure checkEventCriteria();
      public var
         eventCriteria: TElementChangeCriteria;
         OnCriteriaEvent: TNotifyEvent;
      public
         property Name: String read FName;
         property Temperatur: Single read FTemperatur write setTemperatur;
         property Luftdruck: Single read FLuftdruck write setLuftdruck;
    end;

{ TElementChangeCriteria }

class function TElementChangeCriteria.None(): TElementChangeCriteria;
begin
   Result.minTemperature := Single.NaN;
   Result.maxTemperature := Single.NaN;
   Result.minLuftdruck := Single.NaN;
   Result.maxLuftdruck := Single.NaN;
end;

{ TElement }

procedure TElement.checkEventCriteria();
begin
   if criteriaMet() then
      if Assigned(OnCriteriaEvent) then OnCriteriaEvent(self);
end;

function TElement.criteriaMet(): Boolean;
begin
   if not eventCriteria.minTemperature.IsNan() then
      if (eventCriteria.minTemperature >= Temperatur) then Exit(True);
   if not eventCriteria.maxTemperature.IsNan() then
      if (eventCriteria.maxTemperature <= Temperatur) then Exit(True);

   if not eventCriteria.minLuftdruck.IsNan() then
      if (eventCriteria.minLuftdruck >= Luftdruck) then Exit(True);
   if not eventCriteria.maxLuftdruck.IsNan() then
      if (eventCriteria.maxTemperature <= Luftdruck) then Exit(True);

   Result := False;
end;

procedure TElement.setLuftdruck(const Value: Single);
begin
   FLuftdruck := Value;
   checkEventCriteria();
end;

procedure TElement.setTemperatur(const Value: Single);
begin
   FTemperatur := Value;
   checkEventCriteria();
end;
Ich persönlich finde dass gerade die Spring4D-Bibliothek viel mehr Spaß in die Sache bringt weil man hier vernünftige Multicast-Events hat und sich durch nullbare Datentypen dieses krumme "NaN" für die Fließkommazahlen sparen kann.


In Sachen Bedienung: Ich weiß nicht wie technik-affin deine Benutzer sind mit Querys wie "someCondition OR otherCondition AND finalCondition" kommen viele nicht gut zurecht. Ich würde einfach einen Frame mit Edit-Boxen und Text-Feldern machen der dann eine TElementChangeCriteria zurückgibt.
  Mit Zitat antworten Zitat