![]() |
Viele OnMouseMove Proceduren | elegantere Lösung
Hay,
ich programmiere gerade eine Toolbar die sich öffnet, wenn der Mauszeiger ganz links am Rand ist. Wenn der Zeiger in der Form bleibt, soll das Fenster angezeigt bleiben. Wenn es aus dem Fenster raus geht, soll es *wusch* machen und das Fenster ist wech. Das funzt auch wunderbar. Mein Problem ist, wenn der User auf einen Button geht ist das Fenster auch wech. Dass soll ja nicht sein. Es ist auch ein bisschen unschön wenn ich zig- tausend OnMouseMove Proceduren stehen habe. Kann man das ein wenig eleganter lösen? ps: Mir ist kein besserer Titel eingefallen. mfG |
Re: Viele OnMouseMove Proceduren | elegantere Lösung
Du kannst doch eine einzige MouseMove-Methode schreiben und diese mehreren Komponenten zuordnen (entweder im OI oder per Code).
|
Re: Viele OnMouseMove Proceduren | elegantere Lösung
mmhm, nehmen wir mal an meine verstecken procedure ist so aufgebaut:
Delphi-Quellcode:
was muss ich dann im OI bzw. im code schreiben?#
Procedure WegDamit;
begin //bla bla blupp (code) end wenn ich im OI "WegDamit" schreibe passiert rein garnix. |
Re: Viele OnMouseMove Proceduren | elegantere Lösung
Ich sprach ja auch von Methoden. Methoden gehören zu einer Klasse (z.B. Deinem Hauptformular), so dass beispielsweise Folgendes ginge:
Delphi-Quellcode:
Diese Methode kannst Du im OI allen Komponenten im OnMouseMove zuweisen. Willst Du wissen, welche Komponente das Ereignis ausgelöst hat, musst Du dann den Sender-Parameter auswerten.
procedure TDeinForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin //Mausposition in einem Label anzeigen lblMousePos.Caption := Format('X: %d, Y: %d',[X,Y]); end; [edit] Ich kaufe ein "i" :mrgreen: [/edit] |
Re: Viele OnMouseMove Proceduren | elegantere Lösung
manchmal sehe ich den wald vor lauter bäumen nicht?!
aber zum nächsten problem --> wenn ich die maus auf ein label, wo die Uhrzeit angezeigt wird bewege, ist das fenster wieder weg. was läuft da schief? |
Re: Viele OnMouseMove Proceduren | elegantere Lösung
Ohne etwas Code kann ich Dir das auch nicht sagen, sondern könnte höchstens raten :glaskugel:
|
Re: Viele OnMouseMove Proceduren | elegantere Lösung
alles klar:
Delphi-Quellcode:
und:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, jpeg, ExtCtrls, ComCtrls; type TForm1 = class(TForm) Timer1: TTimer; Label1: TLabel; Shape1: TShape; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormMouseLeave(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure verstecken; begin SetWindowLong(Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW); end; procedure TForm1.FormCreate(Sender: TObject); begin verstecken; form1.Width := 1; end; procedure TForm1.FormMouseLeave(Sender: TObject); begin form1.AlphaBlendValue := 1; form1.Width := 1; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin form1.Width := 200; form1.AlphaBlendValue := 255; end; procedure TForm1.Timer1Timer(Sender: TObject); begin label1.Caption := TimeToStr(time); end; end.
Delphi-Quellcode:
program Project1;
uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. |
Re: Viele OnMouseMove Proceduren | elegantere Lösung
Wenn die Maus auf das Label kommt, wird MouseLeave des Formulars ausgeführt. Evtl. wäre es geschickter, die Screen-Koordinaten des Mauszeigers zu ermitteln und zu schauen, ob sich diese noch innerhalb Deines Formulars befinden.
|
Re: Viele OnMouseMove Proceduren | elegantere Lösung
mit
Delphi-Quellcode:
prüfe ich die koordinaten der maus. Wie muss ich das ergebnis jetzt in eine if abfrage einbinden?
procedure TForm1.Timer1Timer(Sender: TObject);
var point: TPoint; begin GetCursorPos(point); end; ich würde das jetzt so machen [pseudocode] if point.x <= //zahl else if point.y <= //zahl then fenster verstecken; else fenster anzeigen [/pseudocode] jetzt wäre es sehr nett, wenn es mir einer in delphi übersetzen würde. :roll: weil ich es einfach nicht gebacken bekomme :? mfg |
Re: Viele OnMouseMove Proceduren | elegantere Lösung
Den Punkt hast Du ja jetzt (das sollte btw. Mouse.CursorPos entsprechen), nun könntest Du mit PtInRect prüfen, ob sich dieser innerhalb Deines Formulars befindet. Beispiel:
Delphi-Quellcode:
procedure TfrmMain.Timer1Timer(Sender: TObject);
begin if PtInRect(BoundsRect{oder ClientRect, je nachdem},Mouse.CursorPos) then Color := clRed else Color := clBlue; end; |
Re: Viele OnMouseMove Proceduren | elegantere Lösung
:wall: ich habe jetzt dies dort stehen:
Delphi-Quellcode:
jetzt zickt der compiler :twisted: :
procedure TForm1.Timer2Timer(Sender: TObject);
var point: TPoint; begin GetCursorPos(point); if PtInRect(BoundsRect{oder ClientRect, je nachdem},Mouse.CursorPos) then form1.Width := 200; form1.AlphaBlendValue := 255 else form1.AlphaBlendValue := 1; form1.Width := 1; end; ![]() mfg |
Re: Viele OnMouseMove Proceduren | elegantere Lösung
Mehrere Anweisungen schließt man in begin-end ein ;) und GetCursorPos kannst Du Dir sparen.
[edit] Übrigens: wieso machst Du die Prüfung nicht einfach im OnMouseLeave des Formulars? [/edit] |
Re: Viele OnMouseMove Proceduren | elegantere Lösung
*duck* wie blöd von mir.
tja, alzheimer lässt grüssen :mrgreen: add: thanks for support!! |
Re: Viele OnMouseMove Proceduren | elegantere Lösung
Hallo,
wenn ich's richtig verstanden habe, liegt Dein Problem darin, dass die Behandlungsprozedur des Ereignisses MouseLeave auch dann ausgeführt wird, wenn Du z.B. innerhalb des Formulares mit der Mouse auf ein anderes Control kommst. Hierzu kann ich folgenden Lösungsansatz anbieten: Plaziere Deine Komponenten so, dass Links, Rechts, Oben und Unten ein Rand von jeweils (sagen wir mal) 8 Pixel frei bleibt. Im MouseLeave-Ereignis des Formulares prüfst Du nun, ob sich der Mousezeiger innerhalb dieses "Rahmens" befindet : wenn ja : Formular wieder auf 1 Pixel setzen, wenn nein, dann ... nichts... |
Re: Viele OnMouseMove Proceduren | elegantere Lösung
@ markus5766h: danke für die antwort! aber hat sich erledigt, funzt jetzt einwandfrei.
jetzt geht es um die funktionen meiner toolbar. also: rann an den speck! mfg |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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