![]() |
Form schließen wenn Mauszeiger d.Form verläßt ?
hallo,
ich möchte gerne das die form geschlossen wird wenn ich mit dem mauszeiger die form verlasse. wie geht das ?? mfg vader |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
du benutzt eine komponente die dir systemweit die mauszeiger position zurückgiebt
und dann schaust halt bei jedem mouse move ob der zeiger innerhalb deines fensters ist komponente z.b.: "Phantom" |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Hallo,
was ist denn mit dem event onMouseExit? damit sollte es doch auch gehen... Gruß Ken |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Die position bekommt man auch über:
Code:
Da brauchste doch keine Komponente!
var MausPos: TPoint;
Pos1, Pos2 : integer; begin GetCursorPos(MausPos); Pos1 := MausPos.x; Pos2 := MausPos.y; end; |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Moin!
Oder auf die WM_MOUSELEAVE Message reagieren... MfG Muetze1 |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
oder prüfen ob die mouse auf dem form ist (mouse.x < form1.left...)
|
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hallo,
das hift mir aber nicht sehr weiter :? onmouseexit finde ich in d6 nicht, und wie ich zur mausposition komme hilft mir auch nicht viel weiter, gibts da keinen codeschnipsel wenn die maus aus der form ist,dann wird die form geschlossen mfg vader |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hmm ich schau nochmal :?
|
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hallo
hab folgenden code probiert aber mit einer bauchlandung
Code:
was ist da falsch
procedure TForm2.FormCreate(Sender: TObject);
var MausPos: TPoint; Pos1, Pos2 : integer; begin GetCursorPos(MausPos); Pos1 := MausPos.x; Pos2 := MausPos.y; if pos1 and pos2 < form2.left then form2.Close; end; mfg vader |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
na das kann ja nicht gehn :lol: .. x udn y sind ja breiten udn längen punkte beide sind nicht so einfach imemr gleicher ^^ aber wenn ichs hab schick ichs heir!
|
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Der Fehler liegt hier:
Zitat:
Ein OnMouseMove wird dir auch nichts bringen, da diese Message schon nicht mehr bei dir ankommt, sobald die Maus eben dein Fenster verlassen hat (Wie passend :)). Also bleiben dir 2 Möglichkeiten: a) Du implementierst die Behandlung der Message WM_MOUSELEAVE b) Ein Timer der alle n Millisekunden die Position der Maus überprüft:
Delphi-Quellcode:
Lösung b) erscheint einfacher, ist aber deutlich "unsauberer". Hinter die Umsetzung der Variante a) muss man erst durchsteigen, aber die ist dann solide. Aber b) reicht prinzipiell aus ;)
procedure TForm1.Timer1Timer(Sender: TObject);
var mouseCoords: TPoint; begin GetCursorPos(mouseCoords); if (mouseCoords.x < Form1.Left) or (mouseCoords.y < Form1.Top) or (mouseCoords.x > Form1.Left+Form1.Width) or (mouseCoords.y > Form1.Top+Form1.Height) then Form1.Close; end; n8i, dizzy |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hallo dizzy,
super danke es funzt lösung b ist ausreichend :lol: mfg vader |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hallo,
nur ein problem noch durch den timer flackert jetzt die form solange sich der mauszeiger drauf ist mfg vader |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Zitat:
Delphi-Quellcode:
P.S.: Das WMMouseLeave-Event wird auch gefeuert, wenn die über ein Control auf dem Form zeigt... :oops:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private { Private-Deklarationen } protected procedure WMMouseLeave(var Message: TWMMouse); message WM_MOUSELEAVE; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.WMMouseLeave(var Message: TWMMouse); begin Close; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var EventTrack: TTrackMouseEvent; begin EventTrack.dwFlags := TME_LEAVE; EventTrack.hwndTrack := Handle; EventTrack.cbSize := SizeOf(EventTrack); TrackMouseEvent(EventTrack); end; end. |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Zitat:
wenn sich völlig unerwartet ein Fenster schliesst. :-D |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hallo
hab das falsch beschrieben: hab einen button mit dem ereigniss onmousemove > code: form2.show, also wenn ich auf den button zeige kommt die form2 und dann flackert die form2 durch den timer.
Delphi-Quellcode:
mfg vader
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); begin form2.Show; //// form2 anzeigen end; procedure TForm2.Timer1Timer(Sender: TObject); //// form2 schließen var mouseCoords: TPoint; begin GetCursorPos(mouseCoords); if (mouseCoords.x < Form2.Left) or (mouseCoords.y < Form2.Top) or (mouseCoords.x > Form2.Left+Form2.Width) or (mouseCoords.y > Form2.Top+Form2.Height) then Form2.Close; end; [edit=sakura] [delphi]Tags Mfg, sakura[/edit] |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Moin!
Tipp: Diese grosse If Abfrage kann man aber leicht verkleinern, wenn man PtInRect() nutzt... MfG Muetze1 |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Hai Vader,
hier meine Methode durch zusammenfassung aller Codes aus diesem Thread ;-)
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) private { Private-Deklarationen } procedure WMMouseLeave(var Message: TWMMouse); message cm_MOUSELEAVE; public { Public-Deklarationen } end; var Form1: TForm1; implementation uses Types; {$R *.dfm} procedure TForm1.WMMouseLeave(var Message: TWMMouse); var mouseCoords: TPoint; formrect : TRect; begin GetCursorPos(mouseCoords); formrect.Left := Left; formrect.top := Top; formrect.Bottom := Top + Height; formrect.Right := Left + Width; if not PtInRect(formrect,mouseCoords) then begin Close; end; end; end. |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Ok, aber das Event feuert jetzt nicht mehr, wenn die Maus das Form verlässt.
Btw. das ist auch besser so, denn WM_MOUSELEAVE feuert schon, wenn der Clientbereich verlassen wird (Maus auf dem Rahmen) oder wenn ich über die Titelleiste komme. :x |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hallo
das mit "WMMouseLeave" funzt super aber das beispiel von stevie bezieht sich nur auf form1 bei meinem proggi schaut das so aus, auf der form1 ist ein button wenn ich mit dem mauszeiger drauffahre öffnet sich die form2, und wenn ich mit dem mauszeiger den button verlasse schließt sich die form2. wie soll ich jetzt die beiden codes aufteilen auf uni1 und uni2
Code:
private
{ Private-Deklarationen } protected procedure WMMouseLeave(var Message: TWMMouse); message WM_MOUSELEAVE; procedure TForm1.WMMouseLeave(var Message: TWMMouse); begin Close; end;
Code:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); var EventTrack: TTrackMouseEvent; begin EventTrack.dwFlags := TME_LEAVE; EventTrack.hwndTrack := Handle; EventTrack.cbSize := SizeOf(EventTrack); TrackMouseEvent(EventTrack); end; mfg vader |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Moin!
@Sharky: Zu deiner Code Zusammenfassung: Du könntest doch auch einfach ClientRect/BoundsRect (je nachdem) direkt benutzen der Form, dann brauchst du nicht extra ein Rectangle für die Form zusammenbauen. MfG Muetze1 |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
das flackern von Form2 verhinderst du indem du aus
Delphi-Quellcode:
,
form2.Show;
Delphi-Quellcode:
machst.
if not form2.visible then form2.show;
Worauf willst du nun eigentlich reagieren? auf das verlassen des Buttons mit der Maus, auf das verlassen von form1 oder von form2? |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Ich hab mal etwas rumgebastelt:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation uses Unit2; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var Point: TPoint; begin with TForm2.Create(Self) do begin Point.X := Button1.Left; Point.Y := Button1.Top + Button1.Height; Point := Self.ClientToScreen(Point); Left := Point.X; Top := Point.Y; Show; end; end; end.
Delphi-Quellcode:
BorderStyle hab ich auf bsNone gesetzt, weil es dann korrekt funktioniert... :roll:
unit Unit5;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm2 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } procedure WMMouseLeave(var Message: TWMMouse); message WM_MOUSELEAVE; procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE; end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.WMMouseLeave(var Message: TWMMouse); var Point: TPoint; begin GetCursorPos(Point); if not PtInRect(BoundsRect, Point) then Close; end; procedure TForm2.WMMouseMove(var Message: TWMMouseMove); var EventTrack: TTrackMouseEvent; begin EventTrack.dwFlags := TME_LEAVE; EventTrack.hwndTrack := Handle; EventTrack.cbSize := SizeOf(EventTrack); TrackMouseEvent(EventTrack); inherited; end; procedure TForm2.FormCreate(Sender: TObject); begin BorderStyle := bsNone; end; end. |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hallo sir thornberry
reagiere auf verlassen des button's mit if not form2.visible then form2.show; flackert die form noch immer mfg vader |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hallo stevie,
dein code ist interresant, aber funzt nicht wenn ich mit der maus auf den button komme wird die form2 hinter der form1 erzeugt und ohne fenstertitelleiste und wenn ich von den button runterfahre bleibt die form2. mfg vader |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Zitat:
Klick auf dem Button --> Form2 geht unter dem Button auf und schließt sich erst wieder, wenn man drauf war und es wieder verlassen hat... Zitat:
|
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hallo stevie;
ich will ja nicht auf den button klicken,sonder ich mache es mit onmousemove , und ich will nicht auf form2 mit der maus,weil form2 nur ein infofenster mit label's ist. mfg vader |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Ok, ich dachte, weil...
Zitat:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private { Private-Deklarationen } PopupForm: TForm; public { Public-Deklarationen } procedure WndProc(var Message: TMessage); override; end; var Form1: TForm1; implementation uses Unit2; {$R *.dfm} procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var Point: TPoint; begin if not Assigned(PopupForm) then PopupForm := TForm2.Create(Self); with PopupForm do begin Point.X := Button1.Left; Point.Y := Button1.Top + Button1.Height; Point := Self.ClientToScreen(Point); Left := Point.X; Top := Point.Y; Show; end; end; procedure TForm1.WndProc(var Message: TMessage); begin if Message.Msg = CM_MOUSELEAVE then if Assigned(PopupForm) then if (Message.LParam = Longint(Button1)) then FreeAndNil(PopupForm); inherited; end; end. |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hallo stevie,
ersten danke für deine einsatz, aber es funzt nicht, 1. die popupform kommt auf andererposition auf dem bildschirm 2. wenn ich mit der maus auf das popupfenster komme gibts eine exception !!! sonst gehts maus auf button >>> popupfenster kommt maus weg vom button popupfenster <<<<weg. mfg vader |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Liste der Anhänge anzeigen (Anzahl: 1)
Hai Vader,
ich habe mal ein Testprojekt angehängt. Evntuell ist es ja so wie Du möchtest |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hallo sharky,
danke für den proggi, aber du hast mich falsch verstanden, 1. das passt, maus auf button, popupfenster kommt. aber ich möchte das so haben,und das ist der springende punkt: wenn ich mit der maus dann von dem button fahre dann soll das popupfenster wieder verschwinde. mfg vader |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Zitat:
|
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hallo,
hier mein ganzer code:
Code:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation uses Unit2, {$R *.dfm} procedure TForm1.Button8MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin form2.Show; end; end.
Code:
unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm2 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.Timer1Timer(Sender: TObject); var mouseCoords: TPoint; begin GetCursorPos(mouseCoords); if (mouseCoords.x < Form2.Left) or (mouseCoords.y < Form2.Top) or (mouseCoords.x > Form2.Left+Form2.Width) or (mouseCoords.y > Form2.Top+Form2.Height) then Form2.Close; end; end. mfg vader |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Liste der Anhänge anzeigen (Anzahl: 1)
Ich häng dir jetzt einfach mal das, was ich oben geschrieben habe als Projekt an, vielleicht geht's ja dann!? :roll:
|
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Hm, warum einfach, wenn es auch kompliziert geht, nicht wahr? :zwinker:
Ich hab einfach ein Panel genommen, ein Label drauf und dann folgendes geschrieben:
Delphi-Quellcode:
Und das funktioniert wunderbar, man muss nur noch ein bisschen an der Optik feilen....
procedure TForm1.FormCreate(Sender: TObject);
begin Label1.width := Panel1.width; Label1.height := Panel1.Height; Label1.Top := 0; Label1.left := 0; end; procedure TForm1.Label1MouseEnter(Sender: TObject); begin Form2.show; end; procedure TForm1.Label1MouseLeave(Sender: TObject); begin Form2.close; end; MfG Lefko :stupid: |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hallo
danke für alle dir mir geholfen haben, aber die einfachste lösung ist die beste lösung von lefko werd das von stevie auch noch probieren. mfg vader |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hallo stevie,
cool dein code funzt auch , aber die popupform klebt immer unter dem button fest, wie kann man das verändern das die form dort erscheint wo man sie vor dem kompilieren erstellt hat. mfg vader |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Zitat:
Zitat:
Aber Vorsicht, wenn das Formular sich über dem Button öffnet, weiß ich nicht, was dann passiert... |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
Schön, dass meine Lösung in 2 Minuten genutzt wird ;)
Wie gesagt, ein bisschen an der Optik feilen (Label im Panel zentrieren z.B.) oder die Position der 2. Form setzen, dann sollte das genau das bringen, was gewünscht wird. MfG Lefko :) |
Re: Form schließen wenn Mauszeiger d.Form verläßt ?
hallo stevie,
hab die position vom popupfenster jetzt vom button weggenommen, kann sie jetzt so definieren wie ich will, und auch dein weg führt nach rom,sozusagen. mfg vader |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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 by Thomas Breitkreuz