![]() |
Transparente Clicks
Ich habe ein TImage auf dem ein TLabel liegt.
Gibt es eine Einstellung um den Click auf das Label zu ignorieren, so dass immer das OnClick des darunter liegenden Images ausgelöst wird? |
AW: Transparente Clicks
ist mir jetzt nicht bekannt,
Du könntest aber im onClick des Tlabels das onClick des TImage aufrufen. Grüße Klaus |
AW: Transparente Clicks
Ich würde es exakt so machen wie Klaus es schrieb.
Dem Label im Onclick das Onclick des TImage eintragen und der Effekt ist 1:1 das Gleiche, so lange du darin nicht die angeklickte Komponente abfragst/benötigst. Ansonsten müsstest du im Onclick des Labels folgendes eintragen wenn ich mich nicht irre:
Delphi-Quellcode:
also z.B.
ImageClick(Imagename);
Delphi-Quellcode:
Image1Click(Image1);
|
AW: Transparente Clicks
Das hab ich befürchtet.
Das Problem ist, dass es ca. 2 Dutzend dieser Kombinationen gibt und ich wissen muss, welches Image angeklickt wurde. Schöner Code wird das dann nicht. :? |
AW: Transparente Clicks
Also letztens hatte ich eine ähnliche Situation und da hat es geholfen im WndProc der Komponente für die WM_NCHITTEST Message HTTRANSPARENT zurückzugeben.
Ich hab das allerdings grad für ein Label getestet und da kommt scheinbar diese Message überhaupt nicht an. Wenn du alle Labels in TStaticText änderst/ändern kannst funktioniert es aber:
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls; type TStaticText = class(Vcl.StdCtrls.TStaticText) protected procedure WndProc(var Message: TMessage); override; end; TForm1 = class(TForm) StaticText1: TStaticText; Image1: TImage; procedure StaticText1Click(Sender: TObject); procedure Image1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Image1Click(Sender: TObject); begin ShowMessage('Image'); end; procedure TForm1.StaticText1Click(Sender: TObject); begin ShowMessage('Label'); // Wird so nie aufgerufen, stattdessen wird der Klick an das Image weitergeleitet end; { TStaticText } procedure TStaticText.WndProc(var Message: TMessage); begin if Message.Msg = WM_NCHITTEST then Message.Result := HTTRANSPARENT else inherited; end; end. |
AW: Transparente Clicks
@shebang: Gibt es für diese Kombination keine Logik mit der du es ansonsten herleiten könntest? Also mit FindComponent etc.
Hat jedes Image eine eigene OnClick Prozedur oder alle die Gleiche? |
AW: Transparente Clicks
Folgender Code im OnClick-Event der Labels sollte gehen. Dabei wird angenommen, daß die Labels und die darunter liegenden Images denselben Parent haben.
Delphi-Quellcode:
type
TImageHack = class(TImage); procedure TForm487.Label1Click(Sender: TObject); var ctrl: TControl; lbl: TLabel; begin lbl := Sender as TLabel; lbl.Enabled := False; // damit es bei ControlAtPos nicht gefunden wird try ctrl := lbl.Parent.ControlAtPos(lbl.ClientRect.CenterPoint, False, False, False); if ctrl is TImage then TImageHack(ctrl).Click; finally lbl.Enabled := True; end; end; |
AW: Transparente Clicks
Danke für die Antworten.
Die Images benutzen alle das gleiche OnClick, insofern sollte die Variante meines Vorposters funktionieren. Ich teste das sofort. Edit: Klappt einwandfrei, nur das ClientRect.CenterPoint hab ich durch BoundsRect.CenterPoint ersetzt, damit wir im richtigen Referenzsystem arbeiten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 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