![]() |
Form schliessen wenn die Maus das Form verlässt.
Hallo Zusammen,
ich erzeuge zur Laufzeit eine Forminstanz und plaziere den Mauszeiger in der Mitte des Forms. Sobald nun der Mauszeiger das Form verläst soll das Form geschlossen werden. Das Form wird übrigens nicht Modal erzeugt sondern einfach mit Show. Hat jemand eine Idee? Gruß Kostas |
Re: Form schliessen wenn die Maus das Form verlässt.
Hallo,
du könntest mit getcursorpos() die aktuelle mausposition ermitteln und prüfen, ob sich das Ergebniss noch auf dem Formular befindet. Oder du fängst die WM_MouseMove (hieß die so?) ab, deren Parameter 0 ist, wenn sich der Cursor nicht auf dem Formular befindet. Florian |
Re: Form schliessen wenn die Maus das Form verlässt.
Moin!
Reagiere auf WM_MouseLeave bzw. CM_MouseLeave. MfG Muetze1 |
Re: Form schliessen wenn die Maus das Form verlässt.
Danke für die schnelle Antwort Muetze1 und Florian Bernd.
ich habe leider keine Ahnung wie ich ein Event erzeugen kann welches WM_Mouse... Botschaften des Forms behandelt. Ich habe es mit OnMouseMove probiert doch leider funkt es nicht wenn ich zu schnell die maus aus dem Form bewege. Die Koordinaten werde dann nicht aktualisiert. Könnte Ihr mir bitte verraten wie man so ein Event registriert? Herzlichen Dank nochmals Gruß Kostas |
Re: Form schliessen wenn die Maus das Form verlässt.
Ich glaub ungefähr so:
Delphi-Quellcode:
type
TForm1 = class(TForm) //Prozeduren und Objekte private { Private-Deklarationen } public { Public-Deklarationen } procedure WndProc(var Msg: TMessage); override; //... procedure TForm1.WndProc(var Msg: TMessage); var Point: TPoint; begin if Msg.Msg = WM_USER + 20 then begin if Msg.1Param = WM_MOUSELEAVE then FormX.Close; end; inherited; end; |
Re: Form schliessen wenn die Maus das Form verlässt.
Moin!
Delphi-Quellcode:
MfG
type
TForm1 = class(TForm) //Prozeduren und Objekte private { Private-Deklarationen } Procedure WMMouseLeave(Var Msg: TMessage); Message WM_MOUSELEAVE; public { Public-Deklarationen } //... procedure TForm1.WMMouseLeave(var Msg: TMessage); begin // Whatever you like to do... end; Muetze1 |
Re: Form schliessen wenn die Maus das Form verlässt.
sorry, aber so geht es nicht.
WMMouseLeave wird einfach nicht ausgeführt. Irgend eine Idee warum?
Delphi-Quellcode:
type
TForm1 = class(TForm) //Prozeduren und Objekte private { Private-Deklarationen } Procedure WMMouseLeave(Var Msg: TMessage); Message WM_MOUSELEAVE; public { Public-Deklarationen } //... procedure TForm1.WMMouseLeave(var Msg: TMessage); begin Form1.close; end; |
Re: Form schliessen wenn die Maus das Form verlässt.
Hi,
ändere
Delphi-Quellcode:
zu
Procedure WMMouseLeave(Var Msg: TMessage); Message WM_MOUSELEAVE;
Delphi-Quellcode:
Win32.API
Procedure WMMouseLeave(Var Msg: TMessage); Message CM_MOUSELEAVE;
|
Re: Form schliessen wenn die Maus das Form verlässt.
Moin!
CM_MOUSELEAVE wird von der Form selbst verschickt - und dann natürlich nicht an sich selber. Ich habe mit beiden Botschaften daneben gelegen, ich schau mal wodran es hapert... WM_MOUSELEAVE springt erst an, wenn ein anderes Fenster aktiviert wird... MfG Muetze1 |
Re: Form schliessen wenn die Maus das Form verlässt.
CM_MOUSELEAVE; funkt fast einwandfrei.
Wenn das Form leer ist funkt es einwandfrei mit CM_MOUSELEAVE. Fahre ich jedoch über ein Form1.label drüber, wird das form geschlossen. Ist es möglich das dieser event nur gefeuert wird wenn die Maus die Formgrenzen verlassen hat? Gruß Kostas |
Re: Form schliessen wenn die Maus das Form verlässt.
Zitat:
Delphi-Quellcode:
if (not MousePoint.X in [Form1.Left..Form1.Left+Form1.Width]) and (not MousePoint.Y in [Form1.Top..Form1.Top+Form1.Height]) Then
Form1.Close; |
Re: Form schliessen wenn die Maus das Form verlässt.
Moin!
Kurzform:
Delphi-Quellcode:
MfG
If Not PtInRect(Mouse.CursorPos, BoundsRect) Then
Close; Muetze1 |
Re: Form schliessen wenn die Maus das Form verlässt.
Funkt schon, wenn ich langsam aus dem Form fahre.
ich habe es in FormCloseQuery und in WMMouseLeave probiert. Das gleiche verhalten. In diesem Form habe ich nur ein TLaben. Wäre es nicht besser in WMMouseLeave das TLabel abzufangen? Irgend eine Idee wie das gehen könnte? procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := not PtInRect(BoundsRect, Mouse.CursorPos); end; procedure TForm1.WMMouseLeave(var Msg: TMessage); begin if not PtInRect(BoundsRect, Mouse.CursorPos) then frBlase.close; end; |
Re: Form schliessen wenn die Maus das Form verlässt.
Hallo Kostas,
du musst noch einen Timer in dein Programm einbauen, dann sollte es mit meinem Code funktionieren.
Delphi-Quellcode:
unit Main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} Procedure AutoOff; var p : TPoint; wc : TWinControl; begin GetCursorPos(p); begin wc:=FindVCLWindow(p); if wc <> nil then // Maus befindet sich im Programmfenster begin end else // Maus befindet sich außerhalb des Programmfenster begin Form1.Close; //Fenster schließen end; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin AutoOff; end; end. |
Re: Form schliessen wenn die Maus das Form verlässt.
unglaublich, aber so funkt es leider auch nicht.
Das Form wird geschlossen sobalt ich z.b. auf Die Taskleiste fahre und somit die App verlasse. In meinem Fall habe ich ein Form offen und instanziere ein weiteres Form mit einer TLabel so wie ein ShowMessage Dialog. Wenn nun der Mauszeiger die Grenzen des Form verläst soll das Form automatisch geschlossen werden. So eine winzige Anforderung macht so eine menge Erger. Echt unglaublich. :-) Zitat:
|
Re: Form schliessen wenn die Maus das Form verlässt.
Zitat:
Du hast eine Form offen, nennen wir sie MainForm. Du erzeugst eine weitere Form (SecondForm). SecondForm enthält ein Label und öffnet einen ShowMessage Dialog. Nun meine Frage, von welcher Form fährst du mit der Maus runter und was genau soll nun geschlossen werden? |
Re: Form schliessen wenn die Maus das Form verlässt.
sorry, ich erkläre es gerne.
Meine Anwendung besteht aus einem MainForm. Das MainForm erzeugt ein SecondForm und setzt zugleich den Mauscursor in der Mitte von SecondForm. Das SecondForm beinhaltett nur ein TLabel. Wenn die Maus die Form-Grenzen das SecondForm verläst, soll das SecondForm geschlossen werden. CM_MOUSELEAVE (siehe unten) feuert leider auch wenn der Mauscursor über das SecondForm.Label1 fährt. Wenn ich das Label umfahre und danach die Formgrenzen verlasse wird das SecondForm ganz zuverlässig geschlossen. Ich müsste also herausfinden wodurch WMMouseLeave gefeuert wurde. Steht möglicherweise eine Information in der TMessage Struktur die dafür verwendbar währe?
Delphi-Quellcode:
Ich hoffe es ist jetzt klar geworden was ich meine.
private
{ Private declarations } Procedure WMMouseLeave(Var Msg: TMessage); Message CM_MOUSELEAVE; end; var frSecondForm: TSecondForm; implementation {$R *.dfm} procedure TSecondForm.WMMouseLeave(var Msg: TMessage); begin SecondForm.close; //funkt einwandfrei {funkt leider nicht zuverlässig} // if not PtInRect(SecondForm.BoundsRect, Mouse.CursorPos) // then SecondForm.close; end; Ansonsten kann ich gerne eine Mini-APP erzeuge. Gruß Kostas |
Re: Form schliessen wenn die Maus das Form verlässt.
Jetzt funkts endlich. !!!!!
Ich muss nur einfach den Rahmen um zwei Pixel umlaufend kleiner machen. Und die Welt ist wieder in Ordnung. So einfach ist das, und hat drei Tage Arbeit gemacht. Herzlichen Dank an Alle und bitte sogleich um Verzeihung. Gruß Kostas
Delphi-Quellcode:
private
{ Private declarations } Procedure WMMouseLeave(Var Msg: TMessage); Message CM_MOUSELEAVE; end; var frSecondForm: TSecondForm; implementation {$R *.dfm} procedure TSecondForm.WMMouseLeave(var Msg: TMessage); var fb:TRect; mp:TPoint; begin mp := Mouse.CursorPos; fb := SecondForm.BoundsRect; fb.left := fb.left + 2; fb.Right := fb.Right - 2; fb.Top := fb.Top + 2; fb.Bottom := fb.Bottom - 2; if not PtInRect(fb, mp) then SecondForm.close; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 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