AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kreis/Linie zwischen 2 TButtons

Ein Thema von Schwedenbitter · begonnen am 5. Okt 2020 · letzter Beitrag vom 7. Okt 2020
Antwort Antwort
Benutzerbild von stahli
stahli

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

AW: Kreis/Linie zwischen 2 TButtons

  Alt 6. Okt 2020, 07: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.879 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Kreis/Linie zwischen 2 TButtons

  Alt 6. Okt 2020, 08: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
 
#3

AW: Kreis/Linie zwischen 2 TButtons

  Alt 6. Okt 2020, 10: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.356 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Kreis/Linie zwischen 2 TButtons

  Alt 6. Okt 2020, 13: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
 
#5

AW: Kreis/Linie zwischen 2 TButtons

  Alt 6. Okt 2020, 13: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;
Angehängte Grafiken
Dateityp: png Screenshot_01.png (4,1 KB, 32x aufgerufen)
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
3.076 Beiträge
 
Delphi 12 Athens
 
#6

AW: Kreis/Linie zwischen 2 TButtons

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

Image1.Picture.Bitmap.TransparentColor := clWhite;
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

AW: Kreis/Linie zwischen 2 TButtons

  Alt 6. Okt 2020, 20:52
Willst Du die Linien irgendwie mit der Maus beeinflussen können?

Wie viele Möglichkeiten der Verbindungen gibt es?
- LinieLinksUntenNachRechtsOben
- LinieRechtsUntenNachLinksOben
- Vollkreis
- LeererKreis

Wenn Du eine begrenzte Anzahl hast, könnte man mit einer Image überlegen.
Dann kannst Du den Status (Linienart) zuweisen, die Größe festlegen und die Linien werden passend gezeichnet.

Wenn die Anzahl der Linien oder Figuren sehr groß werden kann oder die Linien nicht auf die Maus reagieren müssen, dann würde ich eher die Buttons anordnen, die Linien in ein Bitmap zeichnen und dieses auf den Canvas des Formulars kopieren.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
v2afrank

Registriert seit: 9. Mai 2005
Ort: Bocholt
575 Beiträge
 
Delphi XE2 Professional
 
#8

AW: Kreis/Linie zwischen 2 TButtons

  Alt 7. Okt 2020, 05:54
Auch wenn es wahrscheinlich nicht hilft möchte ich die Jedis mit Ihren Diagramshapes nicht unerwähnt lassen. Schau Dir mal die Demos an.
Damit habe ich das folgende Bild realisiert
Angehängte Grafiken
Dateityp: jpg jedis.jpg (23,0 KB, 28x aufgerufen)
  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 7. Okt 2020, 07:15
Willst Du die Linien irgendwie mit der Maus beeinflussen können?
Nein - wird vermutlich auch nie nötig werden.

Wie viele Möglichkeiten der Verbindungen gibt es?
- LinieLinksUntenNachRechtsOben
- LinieRechtsUntenNachLinksOben
Ich habe mal weiter probiert. Vom Grundsatz her scheine ich mit den Linien klarzukommen (Screenshot). Da ein Kind i.d.R. nicht von mehr als 2 Eltern abstammt, sind es maximal 2 Verbindungen; eher nur eine.

DENN:
- Vollkreis
- LeererKreis
Der Kreis steht als Symbol für eine Ehe/Beziehung etc. Daher eben nur eine Verbindung des Kindes zu diesem Kreis (Screenshot - wo ich gern hin will). Beim Kreis komme ich wohl an einem anderen TObject nicht vorbei. Sonst wird wohl die Rechnerei zwischen Kreis und Linien zu umfangreich.

...
Dann kannst Du den Status (Linienart) zuweisen, die Größe festlegen und die Linien werden passend gezeichnet.
Verstehe ich das richtig, dass die Linien dann "automatisch" angepasst/gezeichnet werden
Falls ja, gibt es da irgendwo Beispiele zu finden?

Wenn die Anzahl der Linien oder Figuren sehr groß werden kann oder die Linien nicht auf die Maus reagieren müssen, dann würde ich eher die Buttons anordnen, die Linien in ein Bitmap zeichnen und dieses auf den Canvas des Formulars kopieren.
Was spricht dagegen, wenn man die Linien gleich auf das Canvas malt, außer vielleicht, dass sie dann beim Verschieben mal kurz verschwinden?

P.S. Zu meinem 2. Screenshot mal die (Zusatz)Frage:
Wieso erscheinen die Linien nicht beim Programmstart? Meine Malroutine lasse ich jetzt sowohl bei FormCreate (da gibt es vermutlich die Buttons noch nicht) als auch bei FormShow aufrufen. Die Linien sehe ich aber immer erst, wenn ich einen Button bewege.
Angehängte Grafiken
Dateityp: png Screenshot_02.png (5,2 KB, 23x aufgerufen)
Dateityp: png Screenshot_03.png (18,9 KB, 28x aufgerufen)
Angehängte Dateien
Dateityp: zip _move_mit_Linie_2.zip (1,8 KB, 1x aufgerufen)
Alex Winzer
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:11 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-2025 by Thomas Breitkreuz