|
Registriert seit: 14. Apr 2004 Ort: Karlsruhe 318 Beiträge Delphi 2010 Architect |
#13
So, ich stelle mal ein bisschen Source von der grafischen Ausgabe des Stammbaums rein. Vielleicht hilft das ja jmd. bei der Suche nach Lösungen weiter. Vielleicht ist mein Arbeitsansatz auch völlig falsch.
Gruße hansklok
Delphi-Quellcode:
type
TPerson = class(TCustomControl) private fTag: Integer; fID: Integer; // Verweis auf die ID der Person, sie wird später aus TStammbaum.fGenealogie... zugewiesen fTyp: String; fVorname: String; // holt den Vornamen der Person auf Grundlage von fID später aus TStammbaum.fGenealogie... fNachname: String; // holt den Nachnamen der Person auf Grundlage von fID später aus TStammbaum.fGenealogie... fMarkiert: Boolean; fMouseOver: Boolean; procedure SetTyp(Bezeichnung: String); public constructor Create(AOwner: TComponent; Oben: Integer); procedure Paint; override; procedure Click;override;//(Sender: TObject); //overload; procedure MouseEnter; override; procedure MouseLeave; override; //property _OnDblClickForFamilyTree: TNotifyEvent read OnDblClickForFamilyTree write OnDblClickForFamilyTree; //procedure DblClick; override; property Tag: Integer read fTag write fTag; property ID: Integer read fID write fID; property Typ: String read fTyp write fTyp; property Markiert: Boolean read fMarkiert write fMarkiert; property Vorname: String read fVorname write fVorname; property Nachname: String read fNachname write fNachname; published property OnClick; property OnMouseEnter; property OnMouseLeave; end; TStammbaum = class(TCustomControl) private fGenealogie: TGenealogie; // hier werden die Daten zu den Personen geholt fPerson: TObjectList; fProband: Integer; fGeneration: Integer; fMarkiert: Integer; procedure SetPersonen(Person, Y: Integer); procedure Markieren(Plus: Boolean; Person: Integer); public constructor Create(AOwner: TComponent); procedure Paint; override; procedure Click; override;//(Sender: TObject); overload; procedure MouseEnter; override; procedure PersonenUpdate(Proband_ID: Integer); property Genealogie: TGenealogie read fGenealogie write fGenealogie; property Person: TObjectList read fPerson write fPerson; property Proband: Integer read fProband write fProband; property Generation: Integer read fGeneration write fGeneration; property Markiert: Integer read fMarkiert write fMarkiert; published // property OnClick; property OnEnter; end; implementation constructor TPerson.Create(AOwner: TComponent; Oben: Integer); begin inherited Create(AOwner); Self.fID:= -1; // keine Person verknüpft Self.Top:= Oben; Self.Left:= 30; Self.Height:= 24; // 24 = einzeilig (nur Name), 36 = zweizeilig Textausgabe (Name & Geburts- & Todesdatum) Self.Width:= 200; end; procedure TPerson.SetTyp(Bezeichnung: String); begin Self.fTyp:= Bezeichnung; Self.Hint:= Bezeichnung; end; procedure TPerson.Paint; begin case Self.fMarkiert of True: begin Self.Canvas.Font.Color:= clWhite; Self.Canvas.GradientFill(Self.ClientRect, $00D5BCAD, $0091522B, gdVertical); end; False: begin Self.Canvas.Font.Color:= clBlack; case Self.fMouseOver of True: Self.Canvas.GradientFill(Self.ClientRect, $00F6F2EE, $00D9C2B5, gdVertical); False: Self.Canvas.GradientFill(Self.ClientRect, $00FAF8F6, $00E8DED6, gdVertical); end; end; end; Self.Canvas.TextRect(Self.ClientRect, 6, 5, IntToStr(Self.fTag) + ' ' + Self.fTyp); // hier soll später der Name der Person ausgegeben werden Self.Canvas.Pen.Color:= $00A09070; Self.Canvas.Brush.Style:= bsClear; Self.Canvas.Rectangle(Self.ClientRect); end; procedure TPerson.MouseEnter; begin Self.fMouseOver:= True; Self.Repaint; end; procedure TPerson.MouseLeave; begin Self.fMouseOver:= False; Self.Repaint; end; procedure TPerson.Click; begin inherited; Self.fMarkiert:= not Self.fMarkiert; Self.Repaint; end; constructor TStammbaum.Create(AOwner: TComponent); var i: Byte; Pers: TPerson; begin inherited Create(AOwner); fGeneration:= 4; // Darstellung von 4 Generationen fPerson:= TObjectList.Create; for i:= 0 to 14 do begin // Positionierung ist nicht angepasst, muss noch gemacht werden case i of 0: Pers:= TPerson.Create(AOwner, 0); // Proband 1: Pers:= TPerson.Create(AOwner, 170); // Vater 2: Pers:= TPerson.Create(AOwner, -170); // Mutter 3..6: Pers:= TPerson.Create(AOwner, 300); // Großeltern 7..14: Pers:= TPerson.Create(AOwner, 540); // Urgroßeltern end; Pers.Parent:= Self; Pers.Tag:= i; { if i = 0 then Pers.Top:= 10 else Pers.Top:= TPerson(Person.Items[i-1]).Top + TPerson(Person.Items[i-1]).Height + 5;} case i of 0: Pers.SetTyp('Proband'); 1: Pers.SetTyp('Vater'); 2: Pers.SetTyp('Mutter'); 3,5: Pers.SetTyp('Großvater'); 4,6: Pers.SetTyp('Großmutter'); 7,9,11,13: Pers.SetTyp('Urgroßvater'); 8,10,12,14: Pers.SetTyp('Urgroßmutter'); end; Person.Add(Pers); end; Self.Width:= 750; Self.Height:= 600; fGenealogie:= TGenealogie.Create; end; procedure TStammbaum.SetPersonen(Person, Y: Integer); begin case Person of 1: TPerson(Self.Person.Items[Person]).Left:= 176; 2: TPerson(Self.Person.Items[Person]).Left:= 176; 3: TPerson(Self.Person.Items[Person]).Left:= 176; 4: TPerson(Self.Person.Items[Person]).Left:= TPerson(Self.Person.Items[Person-3]).Left + Trunc(TPerson(Self.Person.Items[Person-3]).Width / 2) + 20; 5: TPerson(Self.Person.Items[Person]).Left:= TPerson(Self.Person.Items[Person-3]).Left + Trunc(TPerson(Self.Person.Items[Person-3]).Width / 2) + 20; 6: TPerson(Self.Person.Items[Person]).Left:= TPerson(Self.Person.Items[Person-4]).Left + Trunc(TPerson(Self.Person.Items[Person-4]).Width / 2) + 20; 7: TPerson(Self.Person.Items[Person]).Left:= TPerson(Self.Person.Items[Person-1]).Left + Trunc(TPerson(Self.Person.Items[Person-1]).Width) + 20; 8: TPerson(Self.Person.Items[Person]).Left:= TPerson(Self.Person.Items[Person-2]).Left + Trunc(TPerson(Self.Person.Items[Person-2]).Width) + 20; 9: TPerson(Self.Person.Items[Person]).Left:= TPerson(Self.Person.Items[Person-4]).Left + Trunc(TPerson(Self.Person.Items[Person-4]).Width) + 20; 10: TPerson(Self.Person.Items[Person]).Left:= TPerson(Self.Person.Items[Person-5]).Left + Trunc(TPerson(Self.Person.Items[Person-5]).Width) + 20; end; end; procedure TStammbaum.Paint; begin Self.Canvas.Pen.Color:= $00A09070; Self.Canvas.Brush.Style:= bsClear; Self.Canvas.Rectangle(Self.ClientRect); TPerson(Self.Person.Items[0]).Top:= Trunc((Self.Height - TPerson(Self.Person.Items[0]).Height) / 2); { Proband } SetPersonen(1, 110); { Vater } SetPersonen(2, 110); { Mutter } SetPersonen(3, 170); { Vater des Vaters } SetPersonen(4, -50); { Mutter des Vaters } SetPersonen(5, 50); { Vater der Mutter } SetPersonen(6, 170); { Mutter der Mutter } SetPersonen(7, 200); { Vater des Vaters } SetPersonen(8, -160); { Mutter des Vaters } SetPersonen(9, -160); { Vater des Vaters } SetPersonen(10, 200); { Mutter des Vaters } end; procedure TStammbaum.Click;//(Sender: TObject); var i: Integer; begin //TPerson(Self.Person.Items[1])._OnDblClickForFamilyTree:= PersonDblClicked; Self.Repaint; end; procedure TStammbaum.MouseEnter; begin Self.SetFocus; end; procedure TStammbaum.Markieren(Plus: Boolean; Person: Integer); begin case Plus of True: begin TPerson(Self.Person.Items[Self.fMarkiert]).fMarkiert:= False; TPerson(Self.Person.Items[Self.fMarkiert+Person]).fMarkiert:= True; Self.fMarkiert:= Self.fMarkiert+Person; end; False: begin TPerson(Self.Person.Items[Self.fMarkiert]).fMarkiert:= False; TPerson(Self.Person.Items[Self.fMarkiert-Person]).fMarkiert:= True; Self.fMarkiert:= Self.fMarkiert-Person; end; end; Self.Repaint; end; procedure TStammbaum.PersonenUpdate(Proband_ID: Integer); begin if Proband_ID > -1 then begin { Proband } if Proband_ID > -1 then begin Proband:= Proband_ID; TPerson(Person.Items[0]).ID:= Proband_ID; TPerson(Person.Items[0]).Vorname:= TINDI(Genealogie.INDI.Items[TPerson(Person.Items[0]).ID]).GIVN end else Exit; { Vater } if TINDI(Person.Items[0]).FATH >= 0 then begin TPerson(Person.Items[1]).ID:= TINDI(Person.Items[0]).FATH; TPerson(Person.Items[1]).Vorname:= TINDI(Genealogie.INDI.Items[TPerson(Person.Items[1]).ID]).GIVN; end else begin TPerson(Person.Items[1]).Vorname:= '(Vater)'; end; { Mutter } if TINDI(Person.Items[0]).MOTH > -1 then TPerson(Person.Items[2]).ID:= TINDI(Person.Items[0]).MOTH else Exit; { Großvater I - Vater des Vaters } if TINDI(Person.Items[1]).FATH > -1 then TPerson(Person.Items[3]).ID:= TINDI(Person.Items[1]).FATH else Exit; { Großmutter I - Mutter des Vaters } if TINDI(Person.Items[1]).MOTH > -1 then TPerson(Person.Items[4]).ID:= TINDI(Person.Items[1]).MOTH else Exit; { Großvater II - Vater der Mutter } if TINDI(Person.Items[2]).FATH > -1 then TPerson(Person.Items[5]).ID:= TINDI(Person.Items[2]).FATH else Exit; { Großmutter II - Mutter der Mutter } if TINDI(Person.Items[2]).MOTH > -1 then TPerson(Person.Items[6]).ID:= TINDI(Person.Items[2]).MOTH else Exit; end; end; end. Geändert von hansklok (31. Aug 2010 um 13:25 Uhr) |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |