![]() |
AW: konzeptionelle Gedanken optische Darstellung Stammbaum
Ich betreibe Ahnenforschung seit 2013 und verstehe also das, was du da machen willst.
Mal abgesehen von der Datenstruktur, die mit dem beispielhaften TFamilyTree und TPerson erstmal völlig ausreichend ist (Adoptivkinder und andere Spezialfälle würde ich mir wirklich für später aufsparen), was genau bereitet dir Kopfzerbrechen? Das reine Zeichnen an und für sich, also Kästchen in der und der Farbe mit Schrift können wir dir anhand von Delphi-Code zeigen, aber wahrscheinlich nicht anhand von Bespielen mit Xojo (wenn du damit noch entwickelst). Wie man etwas anordnen und zeichen kann - also die Frage nach dem Konzept - wäre es gut sich Inspiration bei Ahnenblatt, MyHeritage, Ancestry oder eine der 13264 anderen Stammbaumprogrammen zu holen und das einfach mal nachzuzeichnen. |
AW: konzeptionelle Gedanken optische Darstellung Stammbaum
Diese TFamilyTree Klasse soll vor der grafischen Ausgabe automatisch die benötigte Breite und Höhe des Baums anhand seiner Graphen (Partner, Geschwister, Kinder) und die Anzahl der Generationen in ein Bitmap zeichnen. Anhand der Größe des Bitmap kann man ja dann auch die Größe des Canvas einstellen. Was mich interessiert ist also, wie man das ganze ohne viel manuelles Zutun mathematisch arrangiert.
Delphi-Code geht in Ordnung für mich, die Syntax kann ich lesen und verstehen. Und wie ich mir das optisch vorstelle, davon habe ich im ersten Beitrag auf Seite 2 ein Bild gepostet. |
AW: konzeptionelle Gedanken optische Darstellung Stammbaum
Die Struktur von SirRufo scheint sehr gut. Vielleicht kann man anhand derer die dynamische Berechnung der Positionen der einzelnen Elemente und der sich daraus ergebenden Gesamtbreite und -höhe erklären.
Was mir dort aber noch etwas Kopfzerbrechen bereitet, wie kann man dann mit dieser Struktur mittels MouseMove Event die aktuelle Person abfragen? Denn es gibt ja nicht nur reine TPerson, sondern in anderen Klassen enthaltene TPerson. |
AW: konzeptionelle Gedanken optische Darstellung Stammbaum
Ich möchte dir nicht zu Nahe treten, aber vielleicht ist das Vorhaben auch etwas über deinen Möglichkeiten.
Fang mal ganz klein an. Du brauchst eine Datenstruktur, die erstmal Eltern und Kinder aufnehmen kann. Die haben wir gegeben. Diese füllst du erstmal mit Daten und dann machen wir den allereinfachsten Fall: Wir haben zwei Elternteile und meinetwegen vier Kinder. Schreibe auf den Canvas oben zentriert die Namen der Eltern (Erst Vater, dann Mutter) und in der nächsten "Zeile" (ich nenne es mal so) die Namen der Kinder. Reine Textausgabe. Kästchen, Verbindungslinien und Anfassen und Verschieben heben wir uns mal für später auf. Wenn du das hast, melde dich wieder. |
AW: konzeptionelle Gedanken optische Darstellung Stammbaum
Vielleicht noch als Hinweis:
Weder die verknüpfende Baumstruktur, noch die einzelnen Personen-Klassen sollten irgendwelche Methoden haben die was grafisches machen, wie Draw zum Beispiel. Stattdessen baue dir eine weitere Klasse, z.B. namens TGraphBuilder, der du einen Canvas/Bitmap gibst und dazu die Personenliste, die du darstellen möchtest. Schon wird vieles klarer und einfacher. |
AW: konzeptionelle Gedanken optische Darstellung Stammbaum
Zitat:
Delphi-Quellcode:
Und die Test-Daten:
unit Test;
interface uses System.Generics.Collections; type TPerson = class public Name: String; X, Y: Integer; constructor Create(name: String); procedure SetKoordinaten(x, y: Integer); end; TFamilie = class public Vater: TPerson; Mutter: TPerson; Kinder: TList<TPerson>; constructor Create(vater: TPerson, mutter: TPerson); end; TGraphBuilder = class public Familie: TFamilie; Picture: TCanvas; constructor Create(familie: TFamilie) procedure Draw; end; Const Abstand: Integer = 50; Breite: Integer = 100; Hoehe: Integer = 40; implementation // TPerson constructor TPerson.Create(name: String); begin inherited; Name = name; end; procedure SetKoordinaten(x, y: Integer); begin X = x; Y = y; end; // TFamilie constructor TFamilie.Create(vater: TPerson, mutter: TPerson); begin inherited; Vater = vater; Mutter = mutter; Kinder = TList.Create; end; // TGraphBuilder constructor TGraphBuilder.Create(familie: TFamilie); begin inherited; Familie = familie; end; procedure TGraphBuilder.Draw; var i: Integer; begin Familie.Vater.SetKoordinaten(0, 0); Familie.Mutter.SetKoordinaten(Vater.X + Breite + Abstand, 0); // Vater/Mutter zeichnen Picture.Rectangle(Vater.X, Vater.Y, Vater.X + Breite, Vater.Y + Hoehe); Picture.Rectangle(Mutter.X, Vater.Y, Mutter.X + Breite, Mutter.Y + Hoehe); // Kinder for i:= Low(Familie.Kinder) To High(Familie.Kinder) do begin if i = 0 then Kinder(i).SetKoordinaten(i * Breite, Vater.Y + Hoehe + Abstand); else Kinder(i).SetKoordinaten(i * Breite + Abstand, Vater.Y + Hoehe + Abstand); end; Picture.Rectangle(Kinder(i).X, Kinder(i).Y, Kinder(i).X + Breite, Kinder(i).Y + Hoehe); Picture.Textout(Kinder(i).X, Kinder(i).Y, Kinder(i).Name); end; end; end.
Delphi-Quellcode:
procedure GeneriereTestDaten;
var familie: TFamilie; vater, mutter, proband, kind2, kind3, kind4: TPerson graph: TGraphBuilder; begin // Eltern vater = TPerson.Create('Vater Mustermann'); mutter = TPerson.Create('Mutter Musterfrau'); // Proband proband = TPerson.Create('Max Mustermann'); // Geschwister kind2 = TPerson.Create('Heidi Mustermann') kind3 = TPerson.Create('Friedrich Mustermann') kind4 = TPerson.Create('Jonas Mustermann') // Familie familie = TFamilie.Create(vater, mutter) familie.Kinder.Add(proband) familie.Kinder.Add(kind2) familie.Kinder.Add(kind3) familie.Kinder.Add(kind4) // Familie zeichnen graph = TGraphBuilder.Create(familie); graph.Picture = Canvas1; graph.Draw; end; |
AW: konzeptionelle Gedanken optische Darstellung Stammbaum
Der Code compiliert sicher nicht.
|
AW: konzeptionelle Gedanken optische Darstellung Stammbaum
Zitat:
|
AW: konzeptionelle Gedanken optische Darstellung Stammbaum
Hm, ich sehe jetzt nicht warum mein Beitrag wertvoller werden würde wenn ich angebe warum er nicht compiliert. Der Poster kann es ja selber versuchen und stellt es so schneller fest.
Wie dem auch sei - ich sah nur das "TCanvas", das nirgendwo definiert wurde. |
AW: konzeptionelle Gedanken optische Darstellung Stammbaum
Zitat:
Canvas1 ist ein Canvas auf einer TForm. Vielen Dank. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz