![]() |
Durch ein Bild "hindurchklicken"? Darunterliegende
Hallo.
Ich habe mehrere Images, die dynamisch angelegt wurden auf einem Form. Ich weiß nicht, welches der Images vorne und welches hinten liegt. Klickt der Benutzer ein Image an, soll ein Ereigniss statt finden, dass alle darunterliegende Images zusätzlich betrifft. Wie mache ich das? Alle Bilder haben natürlich das gleiche OnMouseDown(x, y) Ereigniss. Am schönsten wäre es, wenn ich herausfinden könnte, welche Bilder an der Position (x, y) zu finden seien. Wäre das gar nicht möglich, könnte ich alle Bilder in einen Array legen und diese dann alle nacheinander prüfen, ob diese die Koordinate beinhalten und dann ein künstliches OnMouseDown(x, y) erzeugen. Wäre aber nicht so eine dolle Lösung, oder? Gruß blackdrake |
Re: Durch ein Bild "hindurchklicken"? Darunterlieg
ich denke du wirst nicht drumherumkommen, ein array zu verwenden, wenn du unbedingt TImages verwenden willst. Du kannst natürlich die bilder auch selbst zu malen, die Abfrage wäre aber ähnlich...
Gruß Frank |
Re: Durch ein Bild "hindurchklicken"? Darunterlieg
also die unperformante variante (für die mich hier auch viele schlagen werden, weil FindComponent im Spiel ist ^^) wäre:
wenn ein OnClick auftritt, anfangen alle images nacheinander über findcomponent suchen und schaun über X und Y und GetCursorPos usw. ob das image darunter liegt...Dann das event für die auch auslösen...andere variante: array anlegen mit referenzen auf alle Images, dann kannst du statt findcomponent auch den array durchlaufen (imho besser). Hope that helps. MfG |
Re: Durch ein Bild "hindurchklicken"? Darunterlieg
Hallo.
Es ist scheinbar ein größeres Problem als ich dachte. Ich habe jetzt ersteinmal die unperformante Variante verwendet, aber statt den Array einfach mal Components[] auf alle TImages durchgeprüft. Doch nun habe ich ein weiteres Problem erkannt: Ich kann die Z-Reihenfolge zwar festlegen, aber nicht lesen. Wie kann ich es realisieren, dass der Klick durch ein Image hindurchgeht (das Event soll an das nächst Untere Element gelangen), wenn ein Kriterium nicht erfüllt ist? Kann ich da irgendwas mit einer eigenen Komponente bewirken? Gruß blackdrake |
Re: Durch ein Bild "hindurchklicken"? Darunterlieg
die z-ordner müsste die gleiche reihenfolge sein, wie es in dem Components-array steht...ich habs mal getested...die komponenten werden in dieser reihenfolge erstellt/gezeichnet. also das erste Element (Index 0) ist das unterste.
einfacher Test mit Panels und TImages...bei allen controls die obere Event-Methode...
Delphi-Quellcode:
zusätzlich ein button, welcher das Components-array anzeigt. die reihenfolge wird da drin auch geändert.
procedure TForm1.Panel1Click(Sender: TObject);
begin (Sender as TControl).BringtoFront; end; procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin memo1.clear; for i:=0 to ControlCount-1 do memo1.lines.Add(Controls[i].Name); end; HTH Frank |
Re: Durch ein Bild "hindurchklicken"? Darunterlieg
Hallo.
Vielen Dank für den Hinweis! Ich werde es nochmal testen, wie es sich bei dynamisch angelegten Komponenten verhält, aber es sieht ja so richtig gut aus. Hätte ich nicht gedacht, dass Delphi intern den Array nach der Z-Order neu berechnet. Gruß blackdrake |
Re: Durch ein Bild "hindurchklicken"? Darunterlieg
Hallo.
Ich habe gestern versucht, die Components[] Reihenfolge selbst zu testen. Leider repräsentiert Components[] nicht der Z-Order! Ändere ich die Z-Reihenfolge zur Entwurfszeit, ist Components[] geordnet. Ändere ich die Reihenfolge in der Laufzeit durch BringToFront, wird die Components[] nicht neu geordnet. Gruß blackdrake |
Re: Durch ein Bild "hindurchklicken"? Darunterlieg
nicht Components[i] sondern Controls[i].
sichtbare Komponenten sind TControls, von daher nimm mal das...siehe auch mein Beispiel oben. bei mir hats die Reihenfolge in der Liste beim ändern der Z-Order mit geändert. Gruß Frank |
Re: Durch ein Bild "hindurchklicken"? Darunterlieg
Hallo.
Entschuldige, ich hatte den Beitrag falsch im Gedächtnis, als ich getestet habe. Controls[] habe ich ausführlich getestet und es repräsentiert die Z-Order exakt. Ich bin derzeit dabei, eine VCL zu schreiben, die vom TImage abgeleitet ist und eine Klick-Maske darstellt (sichtbar oder unsichtbar). Klickt der Benutzer ins Transparente, wird der Klick/Drag/Drop automatisch an die unterliegenden Elemente weitergeleitet (ganz schön viel arbeit...). Dazu natürlich frei definierbare Curser (pl. Cursor), die natürlich ebenfalls nach oben hin durchgeleitet werden müssen. Ich bin bei ca. 80% angelangt. Nun habe ich ein etwas kleineres Problem: Ich fände es echt klasse, wenn ein Click-Ereigniss nicht nur an darunterliegende Click-Masken, sondern auch auf X-beliebige Controls durchgeleitet werden könnte. Das selbe für Drag/Drop-Ereignisse. Nun das Problem: "Click" ist zwar bereits im TControl, aber protected. Ohne Angabe eines konkreten Derivats, das "Click" freischaltet, kann ich nicht drauf zurückgreifen. Bedeutet: TControl(darunterliegend).Click; geht nicht. Habe ich damit keine Change, das zu realisieren? Gruß blackdrake |
Re: Durch ein Bild "hindurchklicken"? Darunterlieg
ich verstehe zwar nicht genau, was du realisieren willst, aber evtl ist es einfacher, mit regions zu arbeiten.
mittels regions kannst du controls ausschneiden. wenn du das z.b. auf TPanel anwendest, kannst du bestimmte bereiche des TPanels durchklickbar machen. schau dir z.b. mal den quellcode von TCoolform an, da wird ein TForm mittels Maskenbitmap zugeschnitten...das gleiche mit TPanels ist evtl das, was du suchst. HTH Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 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