Mir stellt sich gerade eine Frage was mein Klassendesign und das meiner Property Setter angeht.
Ich versorge mein VirtualStringTree so wie das sein soll mit einer ObjectList und die hat wieder Klasseninstanzen intern gespeichert.
Meine Klasse hat ein Property namens IconIndex. Bis vor etwa 2 Stunden habe ich das IconIndex in etwa so gesetzt
Delphi-Quellcode:
procedure TKSTDataFunctions.SetIcon(const DataIndex, IconIndex: Integer);
begin
TKSTData.KSTData[DataIndex].IconIndex := IconIndex;
end;
Natürlich mit Überprüfungen, ob DataIndex existiert usw.
Jeder KSTData-Instanz, also eigentlich der VST Node im Endeffekt, konnte einen von mehreren
Status haben. Das Icon signalisiert den Status.
Meine alte Methode hat funktioniert.
Ich habe eben aber ein weiteres Property FStatus in KSTData eingebaut. Der Typ ist ein Enum
TStatus = (tsCalculating, tsError);
Setze ich jetzt mein Property, setze ich im Setter des Properties gleichzeitig den IconIndex
IconIndex := Ord(TStatus(Ord(Value)));
Im Setter von IconIndex invalidiere ich das VST
TKSTForm.VST.Invalidate;
Ich brauche also nur noch den Status (Enum) zu setzen, und der Rest passiert quasi automatisch in den Settern statt umständlich vorher mit manuellem Setzen des IconIndex.
Das Setzen des Enums hat meiner Meinung nach den Vorteil, dass ich später prüfen kann, welchen Status ein Node und dessen Daten haben. Das über einen Integer-Index abzufragen stelle ich mir schlecht vor.
Meine Frage
Darf man das? Oder gilt das als unsauberer Code,
in den Settern von Properties andere Properties zu setzen?
Wenn ich beispielsweise im Setter von Status, also
SetStatus, je nachdem welcher Status gesetzt werden soll, in einem Case-Block den IconIndex (ohne F, sonst gehts nicht in den Setter von IconIndex) setze - ist sowas in Ordnung?
Ich würde meine Änderung schon gerne behalten, da ich so mit nur einer Zeile Code gleich mehrere Änderungen vollziehe und keine weiteren Units mehr brauche, die mir den IconIndex von Außen setzen.
So arbeite ich objekt-orientiert, direkt am Objekt, und ändere seine Daten.
Wenn ich nicht das Objekt direkt zur Verfügung habe, dafür aber einen Index oder einen Namen kann ich das hier aufrufen
Delphi-Quellcode:
procedure TKSTDataFunctions.SetKSTState(const DataIndex: Integer; Status: TStatus);
begin
if (DataIndex> -1) and (DataIndex < TKSTData.KSTData.Count) then
TKSTData.KSTData[DataIndex].KSTStatus := Status;
end;
procedure TKSTDataFunctions.SetKSTState(const KSTDataName: string; Status: TStatus);
begin
SetKSTState(TKSTDataFunctions.FindIDByName(KSTDataName), Status);
end;
Oft werde ich die beiden Helferfunktionen da oben nicht brauchen, da ich immer das Objekt habe. Aber besser sie liegen ungenutzt rum und wenn ich sie irgendwann brauche, sind sie da.