AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Strategie für Propertyvergleich verschiedener Objecte
Thema durchsuchen
Ansicht
Themen-Optionen

Strategie für Propertyvergleich verschiedener Objecte

Ein Thema von Hobbycoder · begonnen am 24. Apr 2017 · letzter Beitrag vom 3. Mai 2017
 
Der schöne Günther

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

AW: Strategie für Propertyvergleich verschiedener Objecte

  Alt 24. Apr 2017, 11: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
 


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 15:03 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