Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   TImage.Parent.Perform sendet Message unterschiedlich (https://www.delphipraxis.net/176347-timage-parent-perform-sendet-message-unterschiedlich.html)

KiDn 29. Aug 2013 08:40

TImage.Parent.Perform sendet Message unterschiedlich
 
(Delphi Version XE3)


Hallo Delphigemeinde,

mir ist ein komisches Verhalten der TImage-komponente aufgefallen. Und zwar wollte ich in den Events OnClick, OnMouseDown und OnMouseUp eine Message an das übergeordnete Formular senden via TImage(Sender).Perform. Doch leider wird nur im OnClick die Message an das übergeordnete Formular gesendet. In den anderen beiden Prozeduren zu den Ereignissen wird lediglich eine Message an das Objekt von TImage selbst gesendet.

Hier mein Beispielquellcode:

Delphi-Quellcode:
procedure TFormTest.OnClick_Handle(Sender: TObject);
begin
  if Sender is TForm then
  begin
    if Sender = self then
      Beep;
  end;
  if Sender is TImage then
  begin
    if Sender = Image then
    begin
      // Bei den folgenden beiden Aufrufen wird die Message vom Formular entgegengenommen, wie ich es wollte.
      // Es werden das OnMouseDown, OnClick, und OnMouseUp-Ereignis des Formulares aufgerufen.
      TImage(Sender).Parent.Perform(WM_LBUTTONDOWN,MK_LBUTTON,0);
      TImage(Sender).Parent.Perform(WM_LBUTTONUP,MK_LBUTTON,0);
    end;
  end;
end;

procedure TFormTest.OnMouseDown_Handle(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Sender is TForm then
  begin
    if Sender = self then
      Beep;
  end;
  if Sender is TImage then
  begin
    if Sender = Image then
    begin
      // Bei dem folgenden Aufruf wird die Message vom Image entgegengenommen.
      // Es entsteht eine Endlosschleife.
      Image.Parent.Perform(WM_LBUTTONDOWN,MK_LBUTTON,0);
    end;
  end;
end;

procedure TFormTest.OnMouseUp_Handle(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Sender is TForm then
  begin
    if Sender = self then
      Beep;
  end;
  if Sender is TImage then
  begin
    if Sender = Image then
    begin
      // Bei dem folgenden Aufruf wird die Message vom Image entgegengenommen.
      // Es entsteht eine Endlosschleife.
      Image.Parent.Perform(WM_LBUTTONUP,MK_LBUTTON,0);
    end;
  end;
end;

Ich habe einmal das TImage gegen einen Button ausgetausch. Dieser funktioniert einwandfrei. Wisst ihr, wieso dieses Verhalten auftritt?


MfG,
KiDn

KiDn 30. Aug 2013 09:30

AW: TImage.Parent.Perform sendet Message unterschiedlich
 
Crosspost : http://forum.delphi-treff.de/index.p...threadID=59090

Blup 30. Aug 2013 12:05

AW: TImage.Parent.Perform sendet Message unterschiedlich
 
Nur Steuerelemente die von TWinControl abgeleitet sind, besitzen ein eigenes Fenster(Handle) und können direkt Nachrichten empfangen.
Fenster leiten deshalb Mausnachrichten an ihre Steuerelemente weiter (CM-Botschaften).
In diesem Fall an das Image...

KiDn 2. Sep 2013 07:29

AW: TImage.Parent.Perform sendet Message unterschiedlich
 
Die Frage die dann trotzdem noch im Raum steht ist dann aber: Warum liefern die identischen Aufrufe unterschiedliche Ergebnisse?
Die Aufrufe in der OnClick_Handle-Methode senden die Message schließlich an das Fenster. Die Aufrufe in den anderen beiden Methoden senden die Message an das Image.

SirThornberry 2. Sep 2013 12:23

AW: TImage.Parent.Perform sendet Message unterschiedlich
 
Ich vermute die Unterschiede entstehen dadurch das vor dem DoMouseDown noch bestimmte Werte gesetzt werden.
Der Unterschied warum es mit einem Button funktioniert ist, das der Button ein eigenes Handle hat. Beim Image ist es jedoch so das es sich auf die Oberfläche der Form zeichnet und somit Klicks die auf dem Formular an der Stelle des TImages ausgeführt werden, auf Grund ihrer Position an das TImage weiter geleitet werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 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