AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Eigene Komponente X-beliebiges Aussehen
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Komponente X-beliebiges Aussehen

Ein Thema von MarcRB75 · begonnen am 26. Jun 2022 · letzter Beitrag vom 28. Jun 2022
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von stahli
stahli

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

AW: Eigene Komponente X-beliebiges Aussehen

  Alt 27. Jun 2022, 10:17
Erst mal Respekt. Das sieht schon nicht schlecht aus.

Ich gehe davon aus, dass Du Deine "COntrols" somit nur auf einer speziellen Zeichenfläche darstellen willst und nicht mit VCL-Controls zusammen in einem beliebigen Formular.

Dann finde ich Deinen Ansatz schon geeignet. Du kannst das etwa so sehen, wie im Delphi-Designer. Du hast hier im Delphi einen Button auf ein Formular gezogen.
Wenn Du ihn in der Größe ändern willst, musst Du ihn focussieren und erhältst "Anfasser", die Du dann ziehen kannst.
Die sind aber nicht Teil der Komponente sondern werden als Werkzeug von der IDE über dem Button selbst platziert.

Das entspricht Deiner Lösung und ist so auch sehr sinnvoll. Ich würde also grundsätzlich bei Deiner Lösung bleiben und die ggf. nur noch etwas an den Bedarf anpassen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (27. Jun 2022 um 10:41 Uhr)
  Mit Zitat antworten Zitat
MarcRB75

Registriert seit: 31. Mai 2018
Ort: Hof/Saale
51 Beiträge
 
Delphi XE2 Starter
 
#12

AW: Eigene Komponente X-beliebiges Aussehen

  Alt 27. Jun 2022, 15:02
Ohhh das freut mich, dass es Dir gefällt.

Ich möchte jedoch statt des Image eine Paintbox verwenden, geht auch, weil diese durchsichtig ist und ich dadurch ggf. andere Linien durchsehen kann.
Denn wenn ich z.B. 2 Images überlagere, ist nur das ganze Front-Image zu sehen, das hintere nicht. Mit Transparent ect ... das funktioniert leider nicht.

Wenn ich Dich richtig verstehe:
Das Ganze (Bogen, alle Punkte) plaziere ich auf einem Image/Paintbox, die ich vorher als neue Komponente mache.
Gut, das geht, das bekomme ich hin.

Ja die Punkte selbst, möchte ich aber auch als "Werkzeug" benutzen, zur Komponente selbst (Bogen mit Anfangs+Endpunkt), wenn diese auf ein Formular gezogen wird. Das bekomme ich auch hin, ist kein Problem.

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?
Marc
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#13

AW: Eigene Komponente X-beliebiges Aussehen

  Alt 27. Jun 2022, 15:12
Durchsichtig ist sie nicht wirklich.
Aber, die PaintBox ist keine eigeneständiges WinControl, sondern hackt sich in den Parent rein und mals sich auf dessen Desktop ... daher kann der Desktop vorher noch seinen Inhalt da hinmalen, wo sich die PaintBox anschließend hinmalt.

Ebenso machen es TLabel und TBevel. (das "echte" Windows-Label, ist TStaticText ... weil zufällig die "Label"-Klasse "STATIC" heißt)
$2B or not $2B
  Mit Zitat antworten Zitat
MarcRB75

Registriert seit: 31. Mai 2018
Ort: Hof/Saale
51 Beiträge
 
Delphi XE2 Starter
 
#14

AW: Eigene Komponente X-beliebiges Aussehen

  Alt 27. Jun 2022, 15:18
also das mit der Paintbox funktioniert sehr gut. Alle Zeichnungen oder sonstiges "schimmert durch"
Marc

Geändert von MarcRB75 (27. Jun 2022 um 15:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

AW: Eigene Komponente X-beliebiges Aussehen

  Alt 27. Jun 2022, 15: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
MarcRB75

Registriert seit: 31. Mai 2018
Ort: Hof/Saale
51 Beiträge
 
Delphi XE2 Starter
 
#16

AW: Eigene Komponente X-beliebiges Aussehen

  Alt 28. Jun 2022, 10:13
Vielen Dank für Deine Antwort.

Ich verstehe das jetzt, mit dem Ausstanzen und dem "Anfasser". Dann ist das wohl doch keine so gute Idee.

Ich werde, wenn ich auf einen "Button" drücke, mir den Bogen und die Punkte erzeugen lassen. Das geht auch.
Naja... ich wollte das zwar "eleganter" lösen ... aber vielleicht kann man doch nicht alles so umsetzen, auch wenn man
es noch so gerne möchte.

Das mit der Transparenz spielt ja dann in diesem Fall auch keine Rolle mehr, weil der Bogen direkt erzeugt und sofort sichtbar ist.

Nochmal vielen Dank an Dich und die anderen, dass Ihr Euch solche Mühe für Eure Antworten gegeben habt.
Marc
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

AW: Eigene Komponente X-beliebiges Aussehen

  Alt 28. Jun 2022, 10:37
Gerne.

Eine andere Lösung könnte noch sein, dass Du einen Bogen mit einem Mausklick darauf selektieren kannst (wie in anderen Grafikprogrammen).
Das wäre intuitiv aber Du musst den Pfad für jeden Bogen in einer eigenen Region verwalten.

Quasi genau das, was Du mit dem Ausstanzen erreichen wolltest, aber "virtuell". Du merkst Dir verschiedene Regionen für Deine Bögen und prüfst bei einem Klick auf die Zeichenfläche, ob dabei eine Bogenregion erwischt wird. Die Regionen könntest Du sogar stapeln (die neueste immer zuerst prüfen und die älteste zuletzt), dann kannst Du sie sogar übereinander legen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

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 20:02 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