AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

Ein Thema von alleinherrscher · begonnen am 30. Mai 2017 · letzter Beitrag vom 2. Jun 2017
Antwort Antwort
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#1

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 10:42
Moment ich glaube wir brauchen mal was mehr Code:

Delphi-Quellcode:
TSelection = class(TGraphicControl)
private
   //[...]
public
  constructor Create(AOwner: TComponent; X,Y:integer);
published
  property OnMouseMove;
protected
  procedure Paint; override;
  procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  procedure WndProc(var Message: TMessage); override;
end;


Tf2DData = class(TForm)
 imgData: TImage;
 //[...]
 procedure imgDataMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
 private
    { Private-Deklarationen }
     //[...]
     procedure SelectionBoxTest;
 public
    { Public-Deklarationen }

end;

procedure Tf2DData.SelectionBoxTest;
var test:TSelection;
begin
  test:=TSelection.Create(self,100,100);
  test.Parent:=PanImage;
end;
So, imgDataMouseMove wird logischerweise nicht mehr aufgerufen, wenn der Mauscursor oberhalb von TSelection ist. Die obigen Codes können das bisher nicht verhindern und wenn ich an ImgData eine WM_MOUSEMOVE Nachricht schicke, bekomme ich einen STACK Overflow, vermutlich weil ImgData die Nachricht dann wieder an TSelection weiterschickt ...

//edit: ich sehe gerade, dass du Recht hast: Ich habe das Panel, auf welchem ImgData liegt, als Parent angegeben und nicht das Image ImgData selbst. Mein Fehler... sorry!! Aber wie löse ich das generelle Problem? Eine Nachricht direkt an ImgData? Aber wie finde ich allgemein heraus, welches Objekt unterhalb meiner TSelectionBox liegt, an die ich die Nachricht schicken muss?
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS

Geändert von alleinherrscher (31. Mai 2017 um 10:47 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 10:47
Lade mal die Exe hoch wenn es geht muss die mal analysieren.
So bringt mir das nichts.

Zitat:
Aber wie finde ich allgemein heraus, welches Objekt unterhalb meiner TSelectionBox liegt, an die ich die Nachricht schicken muss?
Ein Spy Tool?

Zitat:
als Parent angegeben und nicht das Image ImgData selbst
TImage kann kein Parent sein. Es ist "STATIC"
Parent ist das Window auf dem das TImage als Child abgelegt wurde.

Versuche doch mal folgendes.
Erstelle eine Simple Form pack ein Image drauf und versuche dann einen Button in das Image zu setzen.

gruss

Geändert von EWeiss (31. Mai 2017 um 10:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#3

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 11:26
Ein Spy Tool?
Wie kommst du denn bitte darauf??? Es geht doch nur um 2 Controls, die beide in meiner Anwendung übereinander liegen und die beide ein Mousemove ausführen sollen. Ich will nichts an ein anderes Programm oder sonst was weiterleiten?! Nur an das Control, welches unter meinem TGraphicControl liegt und was in meinem Fall ein Image ist.

TImage kann kein Parent sein. Es ist "STATIC"
Richtig!

Parent ist das Window auf dem das TImage als Child abgelegt wurde.
Parent ist das Panel, auf dem auch das TImage als Child abgelegt wurde.

Lade mal die Exe hoch wenn es geht muss die mal analysieren.
Ich weiß nicht, ob mein Arbeitgeber das so toll fände

Versuche doch mal folgendes.
Erstelle eine Simple Form pack ein Image drauf und versuche dann einen Button in das Image zu setzen.
Ja, ist eine gute Idee. Anbei ein Testprojekt, was mein Problem 1:1 reproduziert. Bitte die Kommentarzeilen in den "OnMouseMove" procedures beachten.

Achja und: Vielen Dank für Deine Hilfe!!!!
Angehängte Dateien
Dateityp: zip testprojekt.zip (628,6 KB, 2x aufgerufen)
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS

Geändert von alleinherrscher (31. Mai 2017 um 11:29 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 11:37
[quote]
ein spy tool?
wie kommst du denn bitte darauf??? Es geht doch nur um 2 controls, die beide in meiner anwendung übereinander liegen und die beide ein mousemove ausführen sollen. Ich will nichts an ein anderes programm oder sonst was weiterleiten?! Nur an das control, welches unter meinem tgraphiccontrol liegt und was in meinem fall ein image ist.
Verstehe nicht was du möchtest.
Deine Frage!
Zitat:
Aber wie finde ich allgemein heraus, welches Objekt unterhalb meiner TSelectionBox liegt, an die ich die Nachricht schicken muss?
Meine korrekte Antwort.
Zitat:
ein spy tool?
Wenn ich wissen will welches Objekt unter meinem Control liegt kann ich das mit einem Spy Tool ermitteln anhand des Handle des Parent Fensters.
Alternativ innerhalb, einfach ein GetParent(SelectionBox.Handle) mit einbauen.
Zitat:
Ich weiß nicht, ob mein Arbeitgeber das so toll fände
Sorry dann weis ich auch nicht.

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 11:58
Zitat:
Versuche doch mal folgendes.
Erstelle eine Simple Form pack ein Image drauf und versuche dann einen Button in das Image zu setzen.
Ja, ist eine gute Idee. Anbei ein Testprojekt, was mein Problem 1:1 reproduziert. Bitte die Kommentarzeilen in den "OnMouseMove" procedures beachten.

Achja und: Vielen Dank für Deine Hilfe!!!!
Was soll ich jetzt mit deinem Test Tool machen?

Dieser Vorschlag war dazu gedacht um dir zu zeigen das TImage kein Parent von TGraphicControl ist.
Auch kein Child von TForm oder Child von TPanel. Nochmal es ist STATIC
Sorry ich möchte gerne helfen aber du verstehst es scheinbar nicht.

Siehe die Enumerierungen aller Childs von TForm auf dem dein Image liegt.
Ich denke deine Herangehensweise ist einfach falsch.
Nimm eine TPaintBox ohne irgendwelche Ableitungen und zeichne ausschließlich alles dort hinein.
Du willst zwischen verschiedenen Fenstern hin und her jonglieren.. Messagen senden, gut aber TImage hat kein Fenster-Handle "STATIC" und nun?

Um das zu analysieren habe ich dir gesagt verwende ein Spy Tool.
So wie du sehen kannst ist TPanel ein Kind Fenster von TForm und TButton ein Kind Fenster von TPanel.

Die MouseMove Messagen also in deinem Beispiel WM_SETCURSOR werden von der TForm ausgewertet und über Image.canvas.TextOut in das Image gezeichnet.
Die Frage ist was sagt dir das ?

gruss

Geändert von EWeiss (11. Jul 2019 um 15:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#6

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 12:36
Zitat:
Du willst zwischen verschiedenen Fenstern hin und her jonglieren.. Messagen senden, gut aber TImage hat kein Fenster-Handle "STATIC" und nun?
Nein, nein, nein. Alles viel zu kompliziert. Sorry! Sieh dir bitte nochmal das Testtool an: Ich möchte einfach nur, dass der Text "Image: x,y" sich immer noch ändert, wenn ich mit der Maus über den Button fahre, und das, ohne dass ich dafür das OnMouseMove des Buttons verwende. Das muss doch möglich sein?

Oder eben in kompletter Analogie: s. Anhang: Ich möchte, dass sich die mit roten Kreisen markierten Pfeilchen weiterbewegen, wenn ich mit der Maus über meinem TGraphicControl (das ist das gedrehte, gestrichelte Rechteck) fahre. Das muss doch irgendwie auf elegante Art und Weise gehen? Selbstverständlich kann ich einfach alles Zeichnen in einer Paintbox. Das habe ich in der bisherigen Version auch so gelöst. Ich dachte, wenn ich ein eigenes Control erstelle, ist das vielleicht etwas professioneller, da diese Auswahlbox (also das Rechteck) auf Mausevents reagieren soll und auch Callback Procedures bekommen soll, und es beliebig viele Instanzen davon zur gleichen Zeit geben können soll. etc.
Angehängte Grafiken
Dateityp: png Clipboard02.png (52,0 KB, 13x aufgerufen)
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS

Geändert von alleinherrscher (31. Mai 2017 um 12:43 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 12:43
Zitat:
Das muss doch irgendwie auf elegante Art und Weise gehen?
Wie schon gesagt du musst mit dem MouseMove Ereignis von TForm arbeiten.

Zitat:
Die MouseMove Messagen also in deinem Beispiel WM_SETCURSOR werden von der TForm ausgewertet und über Image.canvas.TextOut in das Image gezeichnet.
Die Frage ist was sagt dir das ?
Zitat:
wenn ich mit der Maus über den Button fahre, und das, ohne dass ich dafür das OnMouseMove des Buttons verwende. Das muss doch möglich sein?
Ok werde mir das nochmal anschauen.

gruss

Geändert von EWeiss (31. Mai 2017 um 12:47 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:16 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