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