Einzelnen Beitrag anzeigen

norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
504 Beiträge
 
Delphi 12 Athens
 
#1

Anzeigen wenn sich in TObjectList ein Eintrag geändert hat

  Alt 3. Apr 2021, 09:18
Delphi-Version: XE
Hallo zusammen,

ich möchte in einer TObjectList erkennen, wenn sich ein Object in der Liste geändert hat. Dazu habe ich folgendes (vereinfachtes) Konstrukt angedacht:
Delphi-Quellcode:
  // ***************************************************************************************************************************************
  // Die Basisliste mit dem Property Changed
  TBaseObjectList<T: class> = class(TObjectList<T>)
  private
    FChanged: Boolean;
  public
    constructor Create(AOwnsObjects: Boolean = True); overload;
    property Changed: TClass read FChanged write FChanged;
  end;

  // ***************************************************************************************************************************************
  // Die Basisklasse mit den zwei fixen Propteries
  TBase = class
  private
    FChanged: Boolean;
    FParentObject: TObject;
    procedure SetNr(Value: Integer);
    procedure SetChanged(const Value: Boolean);
  public
    property Changed: Boolean read FChanged write SetChanged;
    property ParentObject: TObject read FParentObject write FParentObject;

    constructor Create;
    destructor Destroy; override;
  end;

  // ***************************************************************************************************************************************
  // Als Beispiel eine auf ein eigenes Property abgespeckte Klasse
  TNamen = class(TBase)
  private
    FNamen: String;
    procedure SetNamen(const Value: String);
  public
    property Namen: String read FNamen write SetNamen;

    constructor Create;
    destructor Destroy; override;
  end;

  // ***************************************************************************************************************************************
  // Und die zu diesem Beispiel passende ObjectList
  TNamenList = TBaseObjectList<TNamen>;
Bei der Beschriftung der Eigenschaft Namen wird automatisch das Chanded-Property gesetzt
Delphi-Quellcode:
procedure TNamen.SetNamen(const Value: String);
begin
  if FNamen <> Value then
  begin
    FNamen := Value;
    Changed := True;
  end;
end;
Und jetzt soll über die Änderung des Changed-Property auch das Changed-Flag der entsprechenden Liste gesetzt werden. (Falls die Klasse einer Liste angehört), Dazu wurde dem Object bei der Erstellung die Liste als ParentObject mit gegeben
Delphi-Quellcode:
procedure TBase.SetChanged(const Value: Boolean);
begin
  if FChanged <> Value then
  begin
    FChanged := Value;
    if (FParentObject is TBaseObjectList) then // Prüfen, ob der Parent des Wertes eine TBaseObjectList ist Das geht so aber leider nicht
      TBaseObjectList(FParentObject).Changed := true; // Und wenn ja, die Liste auch auf Changed setzen
  end;
end;
Das Einlesen der Daten in die Liste würde so aussehen
Delphi-Quellcode:
procedure TForm15.btCreateListClick(Sender: TObject);
var
  i:Integer;
  lNamen:TNamen;
begin
  lNamenList := TNamenList.Create;
  for i:=0 to 5 do
  begin
    lNamen.Create;
    lNamenList.Add(lNamen);
    lNamen.ParentObject := lNamenList;
    lNamen.Namen := Format('Name%d', [i]);
    lNamen.Changed := False;
  end;
  lNamenList.Changed:=False;
end;
Jetzt stehen alle Werte und die Liste auf Changed = False

Und wenn ich so den Werte eines Eintrags ändere, steht dieser Wert auf Changed und es sollte auch die Liste auf Changed = True stehen
Delphi-Quellcode:
procedure TForm15.btChangeNameClick(Sender: TObject);
begin
  lNamenList[3].Namen := 'Neuer Name'; // Jetzt ist lNamenList[3].Changed = True und jetzt soll auch lNamenList.Changed = True sein
end;
Aktuell gehe ich bei jedem Save-Vorgang durch die verschiedenen Listen, aber es wäre eben resourcenschonender wenn ich gleich an der Liste selber sehen würde, ob ein Wert geändert wurde.

Gibte es eine Möglichkeit das zu realisiseren

Vielen Dank
Gerd

Geändert von norwegen60 ( 3. Apr 2021 um 09:21 Uhr)
  Mit Zitat antworten Zitat