Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

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

AW: Eigene Komponente X-beliebiges Aussehen

  Alt 27. Jun 2022, 14:54
Aber wie kann ich dann, wie Du mir zuvor geschrieben hast, die Linien/Punkte "Ausstanzen", so dass kein viereckiger Rahmen entsteht, wenn ich
die "Bogen-Komponte" auf ein Formular lege?

Könntest Du mir bitte sagen, wie das geht oder wie ich das machen muss?

Angenommen ich habe alle Punkte des Bogens und die der Punkte ermittelt, wie kann ich dann n diese Form "Ausstanzen", so dass ein schöner Rahmen drumherum entsteht? Könntest Du mir das bitte sagen?

1) Ausstanzen

Da ist m.E. genau die Frage. Du sagst, Du willst die Bogenkomponente "auf ein Formular legen". Bedeutet das, Du willst sie benutzen wie und neben einem Edit, Panel oder Button?
Oder willst Du sie nur auf der Fläche eines anderen Controls darstellen und benutzbar machen?

Wenn Du sie z.B. wie ein nicht-rechteckiges Panel benutzen willst, dann kannst Du Dir meinen zweiten Link im Beitrag #2 nochmal anschauen. Da werden dann einfach Teile des rechteckigen Controls weggeschnitten bzw. ausgestanzt.
Das Problem ist, dass Du "innerhalb" des Controls keine "Anfasser" positionieren kannst, bzw. damit dann nur eine Verkleinerung machbar wäre. Wenn Du die Anfasser weiter nach außen ziehen willst, wäre das nicht möglich, da das Control ja dort keinen Zugriff mehr auf sein Umfeld hat.
Das heißt, die Anfasser müssen dann immer von einer höheren Ebene (Designer oder Formular) bereitgestellt werden. In dessen Bereich kannst Du dann die Anfasser bewegen - auch außerhalb der Bogenkomponente.

Wenn Du keine Vermischung deiner Bogenkomponente mit anderen VCL-Controls brauchst und Du Dich auf eine individuelle Zeichenfläche beschränken kannst, dann kannst Du Dir das Beschneiden von VCL-Controls ersparen und einfach Deine Bogencontrols auf eine beliebige Zeichenfläche malen.


2) Transparenz

Die VCL unterstützt keine wirkliche Transparenz. Wie himitsu beschrieben hat malt ein Label z.B. einfach seinen Text auf die Zeichenfläche seines Parent. Also malt zuerst der Parent seine Zeichenfläche fertig (z.B. weiße Füllung) und dann malt das Label noch seinen Text darauf. Dadurch scheint das Label transparent zu sein.
Wenn der Parent sich aber neu malt (z.B. wegen einer Größenänderung) ist die Fläche wieder weiß und das Label muss seinen Text erneut zeichnen um wieder sichtbar zu sein.
Ein Label über die gesamte Formularbreite zu setzen und dabei andere Controls zu überdecken ist nicht möglich.
Mit einem Panel geht das, da ist dann aber keine echte Transparenz möglich.
Die VCL ist da also etwas eingeschränkt.

Diese "Pseudotransparenz" kannst Du für Dich natürlich nachbilden.
Du könntest Dein Hintergrundbild auf Deine Zeichenfläche kopieren und dann darauf Deine Bogencontrols zeichnen. Bei jeder Änderung musst Du dann natürlich wieder beides machen.
Je nachdem wie aufwändig diese Aktionen sind, könnte es sinnvoll sein, die neue "Gesamtbildberechnung" (Hintergrund + Bögen) in einen Thread auszulagern und erst das Ergebnis dann tatsächlich auf der Zeichenfläche darzustellen.
Das kann Flackern und/oder ein hängen der Anwendung vermeiden helfen.


Wenn Du ein wenig zu dem Thema stöbern willst, kannst Du Dich hier mal umschauen:
https://www.delphipraxis.net/175033-...-schlecht.html


3) VCL-Control oder eigenständige Zeichenfläche

Also die wichtigste Entscheidung ist wohl zunächst, ob Du mit einer bestimmten Zeichenfläche klar kommst, auf denen alle Deine Figuren bearbeitet und genutzt werden oder ob Du Deine Controls wie ein Edit oder Panel überall in einer Anwendung einsetzen willst...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat