Zitat von
mkinzler:
Warum so kompliziert? Was bringt das mit den verschiedenen Typen für Jahr, Monat, ...?
ja garnichts ^^ deswegen auch mein Thread uum zu fragen wies besser geht.
Zitat von
Satty67:
Ich gehe mal von einem Übungs-Projekt aus...
Also Basis-Klasse
Delphi-Quellcode:
TTimeUnity = class
FChildUnitys : array of TTimeUnity; // forward-Deklaration nicht vergessen
FUnitySegemnt : Integer;
public
function Add(TimeLine : TypNachWunsch) : TTimeUnity
property UnitySegment : Integer read FUnitySegment
...um nur einen Teil der Idee zu visualisieren.
- Als Basis wird z.B. Kalender : TTimeUnity definiert.
- Ein Aufruf von Add lässt prüfen, ob der 1. Teil der TimeLine (hier 2009) schon eine ChildUnity hat (Timeline z.B. 2009;11;01;10;12;00)
- Nein anlegen (Child merkt sich seinen Wert in UnitySegment)
- Ja mit gekürzter TimeLine aufrufen.
Ein Prüfen/Aufruf erfolgt, bis Timeline leer ist. Rückgabe an Kalender sollte die kleinste angelegte TimeUnity sein.
Für die Timeline könnte man sich auch ein dyn. Array vorstellen oder die Fähigkeit der Klasse, die richtige Position aus dem datum selbst zu schneiden.
Ok so ähnlich hab ich es jetzt gelöst:
Delphi-Quellcode:
TTyp = (Kalender,Jahr,Monat,Tag,Stunde,Minute);
TZeitEinheit= class
private
FTyp: TTyp;
FIndex: Integer;
FItems: array of TZeitEinheit;
FPings: array of TPing; //Record der bei Minuten gespeichert werden soll
FCountPings:Integer;
FCountTimeOuts: Integer;
FGetLoss:Single;
public
function CountPings: integer;
function CountTimeouts: integer;
function GetLoss : Single;
procedure AddPing(APing: Tping);
procedure WriteTreeView(ATreeView:TTreeView;AParent:TTreeNode);
property PingCount: Integer read FCountPings;
property TimeOutsCount: Integer read FCountTimeouts;
property Loss: Single read FGetLoss;
constructor create(ATyp:TTyp; AIndex:Integer);
end;
Und dann beim AddPing:
Delphi-Quellcode:
begin
case FTyp of
Minute : begin
Setlength(FPings,length(FPings)+1);
FPings[High(Fpings)]:=APing;
end;
Stunde : Add(APing,MinuteOf(APing.datetime));
Tag : Add(APing,HourOf(APing.datetime));
Monat : Add(APing,DayOf(APing.datetime));
Jahr : Add(APing,MonthOf(APing.datetime));
Kalender: Add(APing,YearOf(Aping.datetime));
end;
end;
Ist halt nur nicht so schön das ich bei allen Objekten die nicht Minute sind auch das Array Fpings mitschleppe, dass eigtl nur Instanzen die Minuten darstellen brauchen. Ausserdem muss ich bei allen Funktionen immer gucken ob es der Ftyp der Instanz = Minute ist und dann anders reagieren, weil ich dann nichtmehr auf die Fitems zugreife, sondern auf die Fpings.
Aber als ich noch für jede Zeiteinheit ne eigene Klasse (Tjahr, TMonat usw) hatte musste ich quasi 6 mal die gleichen Funktionen implementieren, und nur den Array Namen anpassen, daher denke ich, dass diese Lösung schon eleganter ist.