![]() |
Maus beschränken
Hi
Habe ein Problem und zwar beschränke ich meine Maus auf 3 Formblätter mi folgenden Code
Delphi-Quellcode:
da die Formblätter auf einen Externen Monitor angezeigt werden, wenn ich mir jetzt die Maus auf meinen internen Monitor wieder holen will schalte ich mir die Maus so wieder frei und ziehe sie mir auf meinen Monitor
procedure TForm8.FormShow(Sender: TObject);
Var maus :tRect; begin maus.Left:= Left; maus.Top:= Top; maus.Right:= Left + Width; maus.Bottom:= Top + Height; ClipCursor(@maus);
Delphi-Quellcode:
Mein Problem ist jetzt wie bekomm ich die Maus wieder zurück auf die 3 Formblätter
procedure TForm8.Button2Click(Sender: TObject);
begin ClipCursor(nil); end; Danke sascha |
Re: Maus beschränken
Indem du den Bereich wieder setzt?
Also ClipCursor erneut setzen:
Delphi-Quellcode:
Wenn du keinen doppelten Code haben willst, dann entweder dieses in eine Prozedur auslagern,
maus.Left:= Left;
... ClipCursor(@maus); oder falls sonst nichts Weiters in FormShow drin ist, dann kannst du dieses auch direkt aufrufen:
Delphi-Quellcode:
Die Maus wird dann ja auch wieder in diesen Bereich reingezungen.
FormShow(Sender);
|
Re: Maus beschränken
Ich muss dies aber von einer anderen Form machen und das geht so glaube ich nicht
|
Re: Maus beschränken
Wenn du die Unit dieser Form (von TForm8) in die andere einbindest, dann hast du dort auch Zugriff auf die andere Form (TForm8).
In der Unit existiert doch eine gloale Variable (Form8) ... über diese bekommst du Zugriff auf die öffentlichen Funktionen der Form (TForm8). z.B.:
Delphi-Quellcode:
Uses ..., Unit8;
Form8.FormShow(Sender); |
Re: Maus beschränken
Ich glaube ich stehe auf dem Schlauch weis leider nicht was du mir damit sagen willst
|
Re: Maus beschränken
Wenn du die Unit des Formulars in eine andere Unit einbindest, dann hast du von dort aus zugriff auf die öffentlichen Deklarationen der eingebundenen Unit.
Du kannst also ganz leicht auf auf eine andere Form zugreifen, solange du deren Unit da einbindest, von wo aus du darauf zugreifen willst. Daran ist doch wohl nichts schwer zu verstehen, oder? Weiterhin weißt du doch schon wie du die Maus auf deinen Forularen einsperrst? Das freigeben bekommst du ja auch schon hin. Und wie du die Maus danach wieder zurück auf die/das Formular(e) bekommst ist doch auch einfach ... du setzt einfach nochmal die entsprechende Beschränkung. Wenn du das nun mal gründlich durch deinen Kopf gehen läßt, dann sollten dir doch mindestens 2 Lösungen einfallen? :gruebel: 1: du rufst ClipCursor da auf, wo du grad im QuellCode bist und holst dir die Position der gewünschten Form,
Delphi-Quellcode:
2: oder du definierst dir in der Form eine Prozedur, welche den Bereich setzt und rufst diese dann einfach auf.
Uses ... Unit8;
maus.Left := Form8.Left; maus.Top := Form8.Top; maus.Right := Form8.Left + Form8.Width; maus.Bottom := Form8.Top + Form8.Height; ClipCursor(@maus);
Delphi-Quellcode:
Type TForm1 = Class(TForm)
... Public Procedure EinName; End; Procedure TForm8.EinName; Var maus: TRect; Begin maus.Left := Left; maus.Top := Top; maus.Right := Left + Width; maus.Bottom := Top + Height; ClipCursor(@maus); End;
Delphi-Quellcode:
//andere Unit
Uses ... Unit8; Form8.EinName; |
Re: Maus beschränken
Achso hast du das gemeint habe es nicht ganz verstanden.
Das sind ja Basics hab mal wieder zu kompliziert gedacht Dank dir aber trotzdem :-D |
Re: Maus beschränken
Tja, manchma isses halt einfacher, als man denkt.
Schlimmer isses nur, wenn man denkt es sei einfach und nachher fällt einem der Himmel auf'm Kopf :? |
Re: Maus beschränken
woran du denken solltest: Wenn man Strg + Alt + Entf drückt wird der gefangene Cursor auch wieder frei gelassen. Je nachdem was du mit dem einfangen des Cursors bezweckst gibt es eventuell andere Möglichkeiten dein Vorhaben zu realisieren.
|
Re: Maus beschränken
Kann es sein das es nicht funktioniert wenn die Eigenschaft Borderstyle der Form auf bsNone steht.
Zwar geht es beim ersten mal wenn die Form aufgerufen wird aber wenn ich die Beschränkung weg nehme und will sie dann wieder setzen geht es nicht. Bei anderen FormBlätter die bsSizeable sind funktioniert es aber dann auch. Gibt es vielleicht noch eine andere altenative die maus zu beschränken, die nicht soviel ärger macht |
Re: Maus beschränken
Nee, eigentlich ist es egal welchen Style die Form hat
denn die Beschränkung hat ja nichts mit der Form selber zu tun. Es wird ja schließlich nur die Position der Form und sonst nichts weiter davon verwendet. Wie genau hast du es denn aktuell gelöst? |
Re: Maus beschränken
Hab es erstmal test weise über ein Button auf der Ersten Form realiesiert.
Soll aber eigentlich so funktionieren das wenn ich die Form2 Schließe das die Maus wieder auf Form8,Form9 und Form10 beschränkt ist. Könnte das ja über das OnClose Ereignis der Form2 machen aber wie gesagt habe da einwenig probleme. Ich glaube das Problem ist das die Form8,Form9 und Form10 immer zu sehen sind die Laufen Extern auf einen LCD Monitor den man interaktiv bedienen kann. Das heist mein Monitor ist eigentlich erweitert um den LCD Monitor jetzt kann man aber immoment die Maus vom LCD auf den Normal Monitor ziehen und etwas bedienen was aber nicht sein soll. Erst wenn man auf das normale programm auf dem Monitor zugreift soll die Maus vom LCD verschwinden. nach der bedienung des Programms soll die Maus auf dem LCD wieder zu verfühgung stehen und auch nur da. das heist ich muss die Maus danach wieder beschränken und das Funktionier nicht Wenn iches so schreibe
Delphi-Quellcode:
ist die Maus auf Form1 beschränkt
procedure TForm1.MausbesClick(Sender: TObject);
var maus :tRect; begin maus.Left:= Form8.Left; maus.Top:= Form8.Top; maus.Right:= Form8.Left + Width; maus.Bottom:= Form8.Top + Height; ClipCursor(@maus); end; |
Re: Maus beschränken
hmmm, wenn das so ist, wie wäre es dann, wenn du die Maus nicht versuchst auf die verschiedenen Forms zu beschränken, sondern gleich auf das LCD?
Das würde dann vorallem die Verwaltung der Maus vereinfachen (statt auf mehrere Forms nur noch auf einen Monitor) Derzeit versuchst du ja sozusagen die Mausbeschränkung auf mehrere Positionen (Forms) abzugleichenund, wobei es dann doch auch mehrere Zustände gäbe, welche sich gegenseitig beeinflussen könnten. So gäbe es dann aber nur noch 2 Zustände ... Maus beshränkt, oder nicht. vermutlich etwa so
Delphi-Quellcode:
Über Screen und Screen.Monitors (Unit Forms) müsstest du dann vorher nur noch das LCD finden.
ClipCursor(@Screen.Monitors[1].WorkareaRect);
Delphi-Quellcode:
Dieses soll jetzt aber nicht bedeuten, daß sich dein Programm beendet?
nach der bedienung des Programms ...
Jedenfalls konnte ich feststellen, das die Beschränkung beim Beenden des Programms ebenfalls mit aufgehoben wird. |
Re: Maus beschränken
Zitat:
|
Re: Maus beschränken
Das hört sich ja ganz gut an habe auch schon in der Delphi Hilfe nachgeschaut, wie ermittel ich denn den Aktuellen Monitor und den LCD.
Noch eine Anmerkung, der LCD ist über eine 2 Grafikkarte angesteuert. |
Re: Maus beschränken
Liste der Anhänge anzeigen (Anzahl: 2)
Was die Monitore angeht, da kann ich nicht helfen ... hab ja nur einen Monitor ;(
Allerdings ist dieses ja schon 'ne neue Frage ... also in 'nem eigenem/neuen Thread nochmals nachfragen ... falls die Suche nicht schon irgendwo was dazu ausspuckt ^^ Ich denk mal mit Screen.MonitorFromWindow(Form1) sollte es gehn. Man könnte ja auch mal prüfen welchen Monitor man direkt über Screen (nicht Screen.Monitors) bekommt? Bei 2 Monitoren könnte es vermutlich aber auch schon ausreichen, wenn du den (sekundären) Monitor suchst.
Delphi-Quellcode:
Der "normale" Monitort wird ja bestimmt als Primärer eingerichtet sein. :stupid:
If not Screen.Monitors[...].Primary Then ...
@Luckie: Hmm, ich hätt jetzt zwar gedacht, daß es da auch so ist, da sich ja anscheinend Windows um das Freigeben kümmert ... schließlich wird doch nichts für's Freigeben im Programm registriert, aber Erstmal zu SirThornberry's "Strg + Alt + Entf"-Thease: anscheinend kommt es wohl nicht (unbedingt) auf's Drücken von "Strg + Alt + Entf" an, sondern der WindowsTaskManager gibt den Bereich immer frei, wenn er den Eingabefokus bekommt. :gruebel: Daher kann man das mit diesem TaskManager nicht versuchen. Also ein Versuch mit'm Process Explorer, welcher nicht von sich aus den Bereich freigibt. Und da war es genauso, sobald der Versuchsprozess abgeschoßen wurde war auch der Mauszeiger wieder frei. In der Konsole scheint es genauso, nur daß dort auch so schon recht schnell der Bereich wieder freigegeben wird ... z.B. auch dann wenn die Konsole "nur" den Eingabefokus zurückbekommt. Auf WinXP getestet. QuellCode zu den Anhängen: :angel:
Delphi-Quellcode:
// Project1
Procedure TForm1.Button1Click(Sender: TObject); // einsperren Var Maus: TRect; Begin Maus.Left := Left; Maus.Top := Top; Maus.Right := Left + Width; Maus.Bottom := Top + Height; ClipCursor(@Maus); End; Procedure TForm1.Button2Click(Sender: TObject); // freigeben Begin ClipCursor(nil); End;
Delphi-Quellcode:
Program Project2;
{$APPTYPE CONSOLE} Uses Windows; Var Maus: TRect; Begin Maus.Left := 100; Maus.Top := 100; Maus.Right := 500; Maus.Bottom := 400; ClipCursor(@Maus); ReadLn; WriteLn('end'); End. |
Re: Maus beschränken
Naja und sonnst gibt es keine einfacheren Lösungen :dance:
Das hört sich für mich eigentlich Kompliziert an. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 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