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.