AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Kreis/Linie zwischen 2 TButtons

Ein Thema von Schwedenbitter · begonnen am 5. Okt 2020 · letzter Beitrag vom 7. Okt 2020
Antwort Antwort
Seite 1 von 2  1 2   
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

Kreis/Linie zwischen 2 TButtons

  Alt 5. Okt 2020, 14:10
Hallo,

ich brauche beruflich immer mal wieder Stammbäume.

Zu diesem Zweck habe ich mir ein Control TPerson gebastelt, abgeleitet von TBitBtn . Darin sind zur Laufzeit jeweils die Personendaten enthalten. Diese Personen/Buttons kann ich wiederum in einer TScrollBox mit der Maus frei verschieben. Vielleicht ginge das eleganter. Aber als Hobbyprogrammierer fiel mir nichts besseres ein.
Ich habe den Code nun nach Jahren mal wieder vorgekramt.

Mein Ziel wäre es jetzt, zwischen den Buttons in Abhängigkeit der Verwandtschaft Linien zu ziehen. Zwischen 2 Verheirateten TPersons hätte ich gern einen Kreis.

Jetzt haben ich schon folgenden Code entdeckt, womit das grundsätzlich klappt:
Delphi-Quellcode:
procedure TForm1.FormPaint(Sender: TObject);
begin
   Canvas.Pen.Style:= psSolid;
   Canvas.Pen.Color:= clBlue;
   Canvas.Pen.Width:= 1;

   Canvas.MoveTo(Button1.Left + (Button1.Width div 2),
                 Button1.Top + (Button1.Height div 2));
   Canvas.LineTo(Button2.Left + (Button2.Width div 2),
                 Button2.Top + (Button2.Height div 2));
end;
Allerdings muss ich auf Änderungen reagieren. Soll heißen:
Wenn eine TPerson verschoben wird, muss die alte Linie/der alte Kreis weg und eine neue gemalt werden (auch hier).

Gibt es da Möglichkeiten/Ideen, ohne dass ich meinen Code vollständig neu programmieren muss?

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
TiGü

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

AW: Kreis/Linie zwischen 2 TButtons

  Alt 5. Okt 2020, 17:07
Wenn du es beruflich brauchst, wäre hier die Wahl eines professionellen Familienforschungsprogramms nicht besser?

Beispiel:
https://www.ahnenblatt.de
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Kreis/Linie zwischen 2 TButtons

  Alt 6. Okt 2020, 07:41
Nein. Leider nicht.

Denn das Beispiel Ahnenblatt kann nicht "ahnnähernd" das, was ich brauche.
Auf der anderen Seite ist es viel zu umfangreich. Und die Bedienung ist viel zu kompliziert. Es geht z.B. grundsätzlich von einer Familie Mutter, Vater, Kinder aus. Wenn ich mehrere "Eltern" durch Scheidung/Heirat habe, gibt es schon Probleme. Der Baum ist - sowie ich das noch in Erinnerung habe - nicht frei drehbar. Er wird von unten nach oben aufgebaut - vom Kind zu den Eltern, es sollen ja die "Ahnen" erforscht werden. Ich brauche es genau umgekehrt.
etc. pp.

Ich würde mir nie die Mühe machen, etwas zu programmieren, wenn es das schon genau so gäbe, wie ich es brauche.

[edit]Ich habe mal angehängt, was ich schon habe.[/edit]
Angehängte Dateien
Dateityp: zip Stammbaum.zip (732,3 KB, 12x aufgerufen)
Alex Winzer

Geändert von Schwedenbitter ( 6. Okt 2020 um 07:44 Uhr) Grund: Datei angehängt.
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
664 Beiträge
 
Delphi 12 Athens
 
#4

AW: Kreis/Linie zwischen 2 TButtons

  Alt 6. Okt 2020, 07:51
Allerdings muss ich auf Änderungen reagieren. Soll heißen:
Wenn eine TPerson verschoben wird, muss die alte Linie/der alte Kreis weg und eine neue gemalt werden
Und wo ist jetzt genau das Problem? Soll die Verbindungslinie beim Verschieben ständig mitgeführt werden, oder reicht es, wenn sie nach dem Verschiebevorgang neu gezeichnet wird?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Kreis/Linie zwischen 2 TButtons

  Alt 6. Okt 2020, 08:43
Es gibt verschiedene Ansatzmöglichkeiten.

Was zu empfehlen ist hängt davon ab, wie erfahren Du in den einzelnen Themenbereichen bist.

Man könnte mit VCL-Controls arbeiten, diese anordnen und nur auf deren Canvas zeichnen.
Man könnte die Objekte als VCL-Controls aufbauen und die Verbindungen auf das Formular malen.
Oder man könnte alles auf einen Canvas malen und die Positionen virtuell merken und sozusagen bei einem Klick auf das Formular ermitteln, welches "virtuelle Control" wohl gemeint war.

Ich habe alles schon gemacht.

Wenn Du willst, schau mal meine Turniersoftware und dort das KO-System an. Da sind die Verbindungen mit Teil der Spiele.
Die Raster der Designer sind dagegen in den Hintergrund gemalt.

Den dritten Ansatz habe ich hier angewendet:
https://www.delphipraxis.net/175033-...chlecht-2.html (#59 und #60)
und hier: https://www.delphipraxis.net/185623-...-controls.html


Vielleicht hilft Dir das bei grundsätzlichen Überlegungen.
Im Detail bleibt da natürlich noch vieles zu überlegen...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Kreis/Linie zwischen 2 TButtons

  Alt 6. Okt 2020, 09:53
Oder man verwendetet Komponenten für Diagramme.
Markus Kinzler
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Kreis/Linie zwischen 2 TButtons

  Alt 6. Okt 2020, 11:45
Danke erstmal für die zahlreichen Tipps!

...
Man könnte mit VCL-Controls arbeiten, diese anordnen und nur auf deren Canvas zeichnen.
Wenn ich das richtig verstehe also zwischen meine Buttons z.B. ein TImage packen, was sich mit bewegt und dann die Linien darin zieht?

Man könnte die Objekte als VCL-Controls aufbauen und die Verbindungen auf das Formular malen.
Das war meine ursprüngliche(r) Idee/Plan. Aber da habe ich das Problem der Reaktion auf ein Verschieben des Buttons. Wenn ein Button die Position ändert, muss ja die alte Linie weg und eine neue Linie gezeichnet werden

Oder man könnte alles auf einen Canvas malen und die Positionen virtuell merken und sozusagen bei einem Klick auf das Formular ermitteln, welches "virtuelle Control" wohl gemeint war.
Das übersteigt mit Sicherheit meine Fähigkeiten. Außerdem müsste ich dann komplett neu anfangen, weil ich die frei verschiebbaren Buttons ja schon habe.
Für mich ist mein Programm an sich perfekt - nur die Linien fehlen.

Wenn Du willst, schau mal meine Turniersoftware und dort das KO-System an...
Die Raster der Designer sind dagegen in den Hintergrund gemalt.
Dieser Designer sieht ziemlich genau nach dem aus, was mir so vorschwebt.

Ich habe mir auch ein paar der verlinkten youtube-Videos angeschaut. Gibt es da irgendwo Code-Beispiele?
Das entspricht so ziemlich genau dem, was ich mir vorstelle. Die CPU-Last ist mir dabei nahezu egal. Selbst bei umfangreichen Bäumen komme ich so auf ca. 40 "Mitspieler". Und häufig wird das Bild nur einmal gebastelt und danach immer nur zum Anschauen/Drucken geladen.
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Kreis/Linie zwischen 2 TButtons

  Alt 6. Okt 2020, 14:14
Deine erste Frage zu den Images zwischen den Buttons: Ja.

Es ist halt die Frage, was Du anklicken, verschieben und in den Größen ändern willst.
Danach musst Du entscheiden, ob Du Controls brauchst, die auf Mausereignisse reagieren können oder nicht.

Dann ist auch die Frage, wie komplex die Linien, Kreise und andere Figuren so werden können.
Wenn Du z.B. einen Kreis hast und der sich neu zeichnet, wenn Du die Größe des Images änderst, ist das komfortabel.
In anderen Fällen, wenn Du z.B. eine längere Verbindungslinie über verschiedene Verwinkelungen zeichnen willst, ist ein Image vielleicht schlecht geeignet.

Wenn Du nur Deine Buttons anklicken und schieben willst, dann würde ich die Figuren drum herum auf den Hintergrund malen. Dann kannst Du den Canvas auch gleich nutzen, um ein Bitmap für die Wiederverwendung zu speichern.

Meinen Code könnte ich Dir geben aber das würde Dir wohl nicht viel helfen, fürchte ich. War ein ziemlich komplexes Projekt mit eigenem Framework usw.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: Kreis/Linie zwischen 2 TButtons

  Alt 6. Okt 2020, 14:32
Die Idee mit dem Code ist total nett, würde mich aber wohl wirklich überfordern.

Ich habe mal quick & dirty etwas zusammengebastelt. Daran kann man sehen, wo ich gern hin käme. Bevor ich mich z.B. um das weitere Problem Button2 vor/über Button1 kümmere, hätte ich dazu mal 2 Fragen:
  1. Wie bekomme ich das Bild - abgesehen von der Linie - transparent?
  2. Gibt es eine Möglichkeit, die Linie schon während des Verschiebens nachzeichnen zu lassen?

Für "Downloadmuffel" hier mal der Code:
Delphi-Quellcode:
Procedure TForm1.Button2MouseDown(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
Const
   SC_DRAGMOVE      = $F012;
Begin
   If (ssLeft in Shift) Then                        // nur bei linker Maustaste
   Begin
      ReleaseCapture;                              // Freigeben der Maus
      Button2.Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);   // Ziehen = Bewegen

      Image1.Picture.Assign(nil);                  // Bild löschen
      Image1.Transparent:= True;                  // ==> Funktioniert schon einmal NICHT!
      Image1.Left:= Button1.Left + (Button1.Width div 2);
      Image1.Top:= Button1.Top + (Button1.Height div 2);
      Image1.Width:= Button2.Left - Button1.Left;
      Image1.Height:= Button2.Top - Button1.Top;

      Image1.Canvas.Pen.Style:= psSolid;
      Image1.Canvas.Pen.Color:= clBlue;
      Image1.Canvas.Pen.Width:= 5;
      Image1.Canvas.MoveTo(0, 0);                     // wohin auch sonst
      Image1.Canvas.LineTo(Image1.Width, Image1.Height);
   End;
End;
Miniaturansicht angehängter Grafiken
screenshot_01.png  
Angehängte Dateien
Dateityp: zip move_mit_Linie.zip (1,8 KB, 4x aufgerufen)
Alex Winzer
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.772 Beiträge
 
Delphi 12 Athens
 
#10

AW: Kreis/Linie zwischen 2 TButtons

  Alt 6. Okt 2020, 18:31
Probier mal das:

Image1.Picture.Bitmap.TransparentColor := clWhite;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:26 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