AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Durch ein Bild "hindurchklicken"? Darunterliegendes Bild erm
Thema durchsuchen
Ansicht
Themen-Optionen

Durch ein Bild "hindurchklicken"? Darunterliegendes Bild erm

Ein Thema von blackdrake · begonnen am 15. Mär 2009 · letzter Beitrag vom 24. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

Durch ein Bild "hindurchklicken"? Darunterliegende

  Alt 15. Mär 2009, 20:29
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
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#2

Re: Durch ein Bild "hindurchklicken"? Darunterlieg

  Alt 16. Mär 2009, 11:30
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
  Mit Zitat antworten Zitat
Hybrid666

Registriert seit: 15. Jul 2006
Ort: Erster Stock
250 Beiträge
 
Delphi 7 Personal
 
#3

Re: Durch ein Bild "hindurchklicken"? Darunterlieg

  Alt 16. Mär 2009, 11:34
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
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: Durch ein Bild "hindurchklicken"? Darunterlieg

  Alt 17. Mär 2009, 09:46
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
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#5

Re: Durch ein Bild "hindurchklicken"? Darunterlieg

  Alt 17. Mär 2009, 13:27
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
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Durch ein Bild "hindurchklicken"? Darunterlieg

  Alt 17. Mär 2009, 19:38
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
Daniel Marschall
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: Durch ein Bild "hindurchklicken"? Darunterlieg

  Alt 18. Mär 2009, 06:46
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
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#8

Re: Durch ein Bild "hindurchklicken"? Darunterlieg

  Alt 18. Mär 2009, 09:09
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
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: Durch ein Bild "hindurchklicken"? Darunterlieg

  Alt 20. Mär 2009, 07:34
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
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#10

Re: Durch ein Bild "hindurchklicken"? Darunterlieg

  Alt 20. Mär 2009, 15:13
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:51 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