Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
Delphi 2010 Architect
|
AW: konzeptionelle Gedanken optische Darstellung Stammbaum
5. Aug 2015, 17: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?
|
|
Zitat
|