Einzelnen Beitrag anzeigen

hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#13

AW: konzeptionelle Gedanken optische Darstellung Stammbaum

  Alt 5. Aug 2015, 16:34
Meine Gedanken (der Einfachheit halber mal eingedeutscht):
Delphi-Quellcode:
// es gibt mehrere Möglichkeiten der Darstellung, die mir vorschweben
//
// 1. der Proband ist eine Partnerschaft
// 2. der Proband ist eine einzelne Person

// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// zu 1. (Nachteil hier, es werden keine weiteren Partner & Geschwister angezeigt)
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

TPerson = class
  const
    Width: 200;
    Height: 75;
  public
    Name: String;
    Vater: TPerson;
    Mutter: TPerson;
    procedure Draw(Canvas, TCanvas; x, y: Integer);
end;

TPartnerschaft = class // im Falle 1. wäre Partnerschaft dann der "Proband"
  public
    PartnerA: TPerson; // Mann oder Frau bei gleichgeschlechtlichen Partnerschaften
    PartnerB: TPerson; // Frau "
    Kinder: TList<TPerson>; // Reihenfolge der Kinder kann schon bei der SQL-Abfrage erfolgen
    procedure Draw(Canvas: TCanvas);
end;

procedure TPerson.Draw(Canvas: TCanvas; x, y: Integer);
begin
  Canvas.DrawRectangle(x, y, Width, Height);
  // später kann hier noch der Name der Person ausgegeben werden

  if Vater <> nil and Mother <> nil then begin
    // Eltern zeichnen dementsprechend versetzt über dem Probanden (x, y müssen angepasst werden)
  end else
  if Vater <> nil and Mother = nil then begin
    // nur Vater zeichnen
  end else
  if Vater = nil and Mother <> Nil then begin
    // nur Mutter zeichnen
  end;
end;

procedure TPartnerschaft.Draw(Canvas: TCanvas);
begin
  // hier wird es nun kompliziert, da zunächst alle Kinder gezählt werden müssen, um den Probanden oberhalb zu zentrieren, ABER
  // sollte die Breite der Elterngenerationen (Eltern, Großeltern) breiter sein, als die der Kinder, so orientiert sich die Ausrichtung an diesen

  if PartnerA <> nil and PartnerB <> nil then begin
    // iterativ alle Elterngenerationen zeichnen, aber wie finde ich heraus, wieviele das sind, also durch Iteration?
    PartnerA.Draw(Canvas, x, y); // ???????
  end else
  if PartnerA <> nil and PartnerB = nil then begin
    // nur PartnerA zeichnen
  end else
  if PartnerA = nil and PartnerB <> Nil then begin
    // nur PartnerB zeichnen
  end;

  for i as Integer = 0 to Kinder.Count do begin
    // auch hier müssen Koordinaten ausfindig gemacht werden, damit die Kinder unter dem Probanden und jeweils nebeneinander gezeichnet werden können
  end;
end;

// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// zu 2. (Partner & Geschwister können angezeigt werden)
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

// um diesen soll sich dann alles drehen, also der Stammbaum aufbauen
TProband = class(TPerson)
  public
    Geschwister: TList<TPerson>;
    Partner: TList<TPerson>;
    Kinder: TList<TPerson>;
    // Draw-Methoden müssten analog zu oben sein
end;

TStammbaum = class(TCanvas)
  puclic
    Proband: TProband; // oder eben TPartnerschaft
    // Draw-Methoden müssten analog zu oben sein
end;
Ist das ein prinzipiell falscher Ansatz?
  Mit Zitat antworten Zitat