Form automatisch ausblenden
-
http://www.ricosonntag.de/download_bcb.htm
Die Komponente RSColorButton zeigt intern, wie MouseLeave/ MouseEnter auch in BCB 5.0 / 5.0 geht
-
Toll.... Nachdem ich das eingebunden hatte, bekomme ich immer die Fehler meldung:
[Linker Fataler Fehler] Unable to open file 'VCLE50.LIB'Wie bekomme ich das wieder weg?
-
Ceene schrieb:
Toll.... Nachdem ich das eingebunden hatte, bekomme ich immer die Fehler meldung:
[Linker Fataler Fehler] Unable to open file 'VCLE50.LIB'Wie bekomme ich das wieder weg?
Gute Frage.
WAS hast Du "eingebunden" ?
-
Egal, ich mach es einfach nochmal neu
-
Ich habe das Projekt nun noch einmal neu gemacht und es geht wieder. Keine Ahnung wo der Fehler her kam.
Kennt jemand ein Seite wo das mit schönen Beispielen beschrieben ist? Das mit dem onMouseLeave für bcb 5? Ich bekomm das einfach nicht hin.
-
Das Problem mit MouseLeave ist, daß das Event auch für die Form ausgelöst wird, wenn der Mauszeiger auf eine darauf enthaltene Komponente (z.B. Button) bewegt wird.
Mein Vorschlag wäre, du nimmst einen Timer, der z.B. alle halbe Sekunde prüft, ob der Mauscursor noch über deinem Formular ist.
Mit "Mouse->CursorPos" kommst du an die aktuelle Mausposition (in Screenkoordinaten). Mit der Methode "ClientToScreen(...)" kannst du die Formularposition umrechnen.Soweit ich weiß, funktionieren so auch die ApplicationBars, da hier immer eine gewisse Verzögerung dabei ist (u. auch eine Aus/-Einblendfunktionalität).
-
Das ist eine gute Idee. Ich habe nun auch einen Timer eingebaut und hole mir alle halbe Sekunde die position der Mouse mit "Mouse->CursorPosition" und lese mir das in eine TPoint Variable.
Leider weiß ich nicht, wie ich nun prüfen kann ob ich mich über dem Formular befinde. Wie komme ich denn an die Koordinaten von dem Formular? ClientToScreen geht dafür nicht.
EDIT:
Ich hab das nun mal so getestet, aber es geht nicht wirklich, ich bekomme immer den Fehler "zeiger auf Struktur auf linker Seite von -> oder von ->*erforderlich"
Der Code sieht wie folgt aus
void __fastcall TMain::Timer1Timer(TObject *Sender) { TPoint form; TPoint mouse; form = TPoint(Main->Left,Main->Top + Main->Height); mouse = Mouse->CursorPos; if((mouse->x <= form->x)&&(mouse->y >= form->y)) { Main->FormShow(Main); } }
-
TPoint ist eine Struktur, also einfach den Punkt verwenden.
Außerdem mußt du je Richtung (x und y) jeweils eine Bereich abfragen:Hier mein ungetestetes Beispiel:
// in der Timer-Methode der MainForm TPoint mouse = Mouse->CursorPos; TPoint left_top = ClientToScreen(Point(0, 0)); TPoint right_bottom = ClientToScreen(Point(Width, Height)); if( mouse.x >= left_top.x && mouse.x < right_bottom.x && mouse.y >= left_top.y && mouse.y < right_bottom.y) { // Main->FormShow(Main); // <- was soll das denn?? Visible = true; } else { Visible = false; }
Das obere kann man auch noch kürzer schreiben (bzgl. Visible), aber vielleicht möchtest du ja noch bestimmte andere Aktionen ausführen.
In einer Event-Methode eines Formulars hast du implizit den Zeiger auf das Formular (this), so daß du nicht explizit mit Main->... zugreifen brauchst.
-
// Main->FormShow(Main); // <- was soll das denn??
In der FormShow richte ich nur die Dialogmaske aus.
-
Es geht sehr gut so, vielen Dank.
-
Bitte, gern geschehen -)