Thema: Delphi Aufbau Klassenstruktur

Einzelnen Beitrag anzeigen

Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#4

Re: Aufbau Klassenstruktur

  Alt 29. Mär 2009, 16:35
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.
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat