AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign konzeptionelle Gedanken optische Darstellung Stammbaum
Thema durchsuchen
Ansicht
Themen-Optionen

konzeptionelle Gedanken optische Darstellung Stammbaum

Ein Thema von hansklok · begonnen am 5. Aug 2015 · letzter Beitrag vom 14. Mai 2018
Antwort Antwort
Seite 4 von 4   « Erste     234   
freimatz

Registriert seit: 20. Mai 2010
1.380 Beiträge
 
Delphi 11 Alexandria
 
#31

AW: konzeptionelle Gedanken optische Darstellung Stammbaum

  Alt 14. Mai 2018, 14:56
Ach so, tut mir leid. Dass Sie noch nicht mit Delphi entwickelt haben habe ich zwar gelesen, bin dabei aber ausgegangen dass Sie es dann aaber jetzt tun werden. Bei den Inhalten mit "unit", "interface", "uses" und "end." bin ich davon ausgegangen, dass es sich um eine fertige Datei handeln soll.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#32

AW: konzeptionelle Gedanken optische Darstellung Stammbaum

  Alt 14. Mai 2018, 15:08
Um mal wieder produktiv zu werden, folgender Code für ein leeres Formular als Ausgangsbasis. Damit können wir grundlegende Sachen klären und uns dann später darum kümmern, wie man die gezeichneten Objekte anfassen und verschieben kann. Dazu noch die obligatorischen Verbindungslinien. Vielleicht das als erstes. Wer will, wer hat Ideen?

Delphi-Quellcode:
unit StammbaumFrm;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Generics.Collections;

type
  TPerson = class
  public
    Name: string;
    X, Y: Integer;
    constructor Create(const AName: string);
    procedure SetKoordinaten(AX, AY: Integer);
  end;

  TFamilie = class
  public
    Vater: TPerson;
    Mutter: TPerson;
    Kinder: TList<TPerson>;
    constructor Create(AVater: TPerson; AMutter: TPerson);
  end;

  TGraphBuilder = class
  public
    Familie: TFamilie;
    Picture: TCanvas;
    constructor Create(AFamilie: TFamilie);
    procedure Draw;
  end;

const
  Abstand: Integer = 50;
  Breite: Integer = 100;
  Hoehe: Integer = 40;

type
  TForm2 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    Familie: TFamilie;
    graph: TGraphBuilder;
    FBitmap: TBitmap;
  public

  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

// TPerson
constructor TPerson.Create(const AName: string);
begin
  inherited Create;
  name := AName;
end;

procedure TPerson.SetKoordinaten(AX, AY: Integer);
begin
  X := AX;
  Y := AY;
end;

// TFamilie
constructor TFamilie.Create(AVater: TPerson; AMutter: TPerson);
begin
  inherited Create;
  Vater := AVater;
  Mutter := AMutter;
  Kinder := TList<TPerson>.Create;
end;

// TGraphBuilder
constructor TGraphBuilder.Create(AFamilie: TFamilie);
begin
  inherited Create;
  Familie := AFamilie;
end;

procedure TGraphBuilder.Draw;
var
  i: Integer;
  TextSize: TSize;
  Vater, Mutter, Kind: TPerson;
  X, Y, W, H: Integer;
  PersonName: string;
begin
  Vater := Familie.Vater;
  Mutter := Familie.Mutter;

  Familie.Vater.SetKoordinaten(0, 0);
  X := Vater.X + Breite + Abstand;
  Familie.Mutter.SetKoordinaten(X, 0);

  // Picture.Font.Name := 'Tahoma';
  // Picture.Font.Size := 12;
  // Picture.Font.Color := clBlack;

  // Vater/Mutter zeichnen
  PersonName := Vater.Name;
  TextSize := Picture.TextExtent(PersonName);
  X := Vater.X;
  Y := Vater.Y;
  W := X + Breite;
  H := Y + Hoehe;

  Picture.Rectangle(X, Y, W + TextSize.cx div 2, H);
  X := X + 5;
  Y := Y + TextSize.cy div 2;
  Picture.Textout(X, Y, PersonName);

  PersonName := Mutter.Name;
  TextSize := Picture.TextExtent(PersonName);
  X := Mutter.X + TextSize.cx div 2;
  Y := Mutter.Y;
  W := X + Breite;
  H := Y + Hoehe;

  Picture.Rectangle(X, Y, W + TextSize.cx div 2, H);
  X := X + 5;
  Y := Y + TextSize.cy div 2;
  Picture.Textout(X, Y, PersonName);

  // Kinder
  for i := 0 to Familie.Kinder.Count - 1 do
  begin
    Kind := Familie.Kinder[i];
    PersonName := Kind.Name;
    TextSize := Picture.TextExtent(PersonName);

    if i = 0 then
    begin
      X := i * Breite;
      Y := Vater.Y + Hoehe + Abstand;
      Kind.SetKoordinaten(X, Y);
    end
    else
    begin
      X := i * (Breite + (2 * Abstand));
      Y := Vater.Y + Hoehe + Abstand;
      Kind.SetKoordinaten(X, Y);
    end;

    Y := Kind.Y;
    W := X + TextSize.cx + 10;
    H := Y + Hoehe;

    Picture.Rectangle(X, Y, W, H);
    X := X + 5;
    Y := Y + TextSize.cy div 2;
    Picture.Textout(X, Y, PersonName);
  end;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
  Vater, Mutter, proband, kind2, kind3, kind4: TPerson;
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);

  FBitmap := TBitmap.Create;

  // Familie zeichnen
  graph := TGraphBuilder.Create(Familie);
end;

procedure TForm2.FormPaint(Sender: TObject);
begin
  graph.Picture := FBitmap.Canvas; // Canvas1;
  graph.Draw;

  Self.Canvas.Draw(0, 0, FBitmap);
end;

procedure TForm2.FormResize(Sender: TObject);
begin
  FBitmap.SetSize(Self.ClientWidth, Self.ClientHeight);
end;

end.

Geändert von TiGü (14. Mai 2018 um 15:10 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz