Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Durch ein Bild "hindurchklicken"? Darunterliegendes Bild erm (https://www.delphipraxis.net/130918-durch-ein-bild-hindurchklicken-darunterliegendes-bild-erm.html)

blackdrake 15. Mär 2009 20:29


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

_frank_ 16. Mär 2009 11:30

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

Hybrid666 16. Mär 2009 11:34

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

blackdrake 17. Mär 2009 09:46

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

_frank_ 17. Mär 2009 13:27

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:
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;
zusätzlich ein button, welcher das Components-array anzeigt. die reihenfolge wird da drin auch geändert.

HTH Frank

blackdrake 17. Mär 2009 19:38

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

blackdrake 18. Mär 2009 06:46

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

_frank_ 18. Mär 2009 09:09

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

blackdrake 20. Mär 2009 07:34

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

_frank_ 20. Mär 2009 15:13

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 12:46 Uhr.
Seite 1 von 2  1 2      

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