Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Nochmal onMouseMove ??? (https://www.delphipraxis.net/10596-nochmal-onmousemove.html)

schniede 21. Okt 2003 21:57


Nochmal onMouseMove ???
 
Hab jetzt ein anderes problem wenn ich die Maus zu schnell
bewege ändert sich die farbe garnicht .
mit
Delphi-Quellcode:
(aRect.Left -1)
kann ich die empfindlichkeit steuern nur um so größer -1,-2,-3 u.s.w
umso wahrscheinlicher das mehr buttons gleichzeitig leuchten :roll:

(habe 5 Kleine Buttons mit high :=20 u. width:=130 dicht zusammen)


Code:
procedure TForm1.GroupBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
VAR
   aRect ,brect ,crect,drect,erect   : TRect;
BEGIN
   aRect :=bestell_btn.BoundsRect;                

   IF (x >= (aRect.Left -1)) AND
      (x <= (aRect.Right +1)) AND
      (y >= (aRect.Top -1)) AND
      (y <= (aRect.Bottom +1)) THEN

      bestell_btn.Font.color := clnavy
      ELSE
   bestell_btn.Font.color :=clblack ;

       bRect :=verkaufen_btn.BoundsRect;              
   IF (x >= (bRect.Left -1)) AND
      (x <= (bRect.Right +1)) AND
      (y >= (bRect.Top -1)) AND
      (y <= (bRect.Bottom +1)) THEN

     verkaufen_btn.Font.color := clnavy
      ELSE
   verkaufen_btn.Font.color :=clblack ;

       cRect :=termin_btn.BoundsRect;            
   IF (x >= (cRect.Left -1)) AND
      (x <= (cRect.Right +1)) AND
      (y >= (cRect.Top -1)) AND
      (y <= (cRect.Bottom +1)) THEN

     termin_btn.Font.color := clnavy
      ELSE
    termin_btn.Font.color :=clblack ;

       dRect :=notizbtn.BoundsRect;                
   IF (x >= (dRect.Left -1)) AND
      (x <= (dRect.Right +1)) AND
      (y >= (dRect.Top -1)) AND
      (y <= (dRect.Bottom +1)) THEN

     notizbtn.Font.color := clnavy
      ELSE
     notizbtn.Font.color :=clblack ;

       eRect :=bitbtn7.BoundsRect;                
   IF (x >= (eRect.Left -1)) AND
      (x <= (eRect.Right +1)) AND
      (y >= (eRect.Top -1)) AND
      (y <= (eRect.Bottom +1)) THEN

    bitbtn7.Font.color := clnavy
      ELSE
     bitbtn7.Font.color :=clblack ;

end;

vieleicht hat ja jemand ne bessere bzw. taugliche Idee.

mfg schniede

Sharky 22. Okt 2003 07:26

Re: Nochmal onMouseMove ???
 
Hai schniede,

hab das jetzt zum test mal so gelösste:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
  private
    { Private-Deklarationen }
  procedure CMMouseEnter(Var Message : TMessage); message CM_MOUSEENTER;
  procedure CMMouseLeave(Var Message : TMessage); message CM_MOUSELEAVE;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CMMouseEnter(var Message: TMessage);
var
  ptWork : TPoint;
begin
  GetCursorPos(ptWork);
  if (WindowFromPoint(ptWork) = BitBtn1.Handle) then BitBtn1.Font.Color := clred;
  if (WindowFromPoint(ptWork) = BitBtn2.Handle) then BitBtn2.Font.Color := clred;
  if (WindowFromPoint(ptWork) = BitBtn3.Handle) then BitBtn3.Font.Color := clred;
  Application.ProcessMessages;
end;

procedure TForm1.CMMouseLeave(var Message: TMessage);
var
  ptWork : TPoint;
begin
  GetCursorPos(ptWork);
  if (WindowFromPoint(ptWork) <> BitBtn1.Handle) then BitBtn1.Font.Color := clblack;
  if (WindowFromPoint(ptWork) <> BitBtn2.Handle) then BitBtn2.Font.Color := clblack;
  if (WindowFromPoint(ptWork) <> BitBtn3.Handle) then BitBtn3.Font.Color := clblack;
  Application.ProcessMessages;
end;
Wenn Du das ganze öfters brauchst wäre es sicher am besten sich eine eigene Classe von TBitBtn abzuleiten, die Eigenschaften dort reinpacken und das ganze in eine Komponente zu packen.

schniede 22. Okt 2003 16:18

Re: Nochmal onMouseMove ???
 
Danke sharky !

Werde das ganze mal testen und gebe bescheid.

Das dumme ist nur den code von mir (zum Teil) versteh ich ja, nur deinen ,na da hapert es doch ganz schön.

Bin halt ´n laie der versucht alles allein zu lernen ,aber hier wird einen immer super geholfen
und mann kann ne Menge lernen.

bis später tschau

schniede 22. Okt 2003 16:30

Re: Nochmal onMouseMove ???
 
Hai Sharky !

Muß sagen das klappt hervorragend. :dancer:

Nun muste mir nur noch verraten ob du das aus dem Ärmel geschüttelt hast oder ob das nicht alles auf dein mist gewachsen ist.

Wie gesagt hast mir ja schon öfter geholfen, find ich echt Klasse HUT AB. :thuimb:

Was meinst du den eigentlich was man so an Lektüre verzehren sollte? Aus der Hilfe werd ich immer nicht ganz so schlau wenn ich ein fertigen code seh, dann versteh ich das schon besser.

Gruß schniede!!!!!!!!!


P:S: Hatte ganz vergessen ,weißt du warum das andere nicht so gut läuft,ist die Rechenzeit zu hoch,
die maus zu schnell, oder OnMouseMove eh ungeeignet.

Sharky 23. Okt 2003 08:58

Re: Nochmal onMouseMove ???
 
Zitat:

Zitat von schniede
....Nun muste mir nur noch verraten ob du das aus dem Ärmel geschüttelt hast oder ob das nicht alles auf dein mist gewachsen ist.

Ehre wem Ehre gebürt! Ich habe das auf Grundlage von Christans Code aus diesem Thread gemacht.

Zitat:

Wie gesagt hast mir ja schon öfter geholfen, find ich echt Klasse HUT AB.
Dafür ist das Forum doch da. Damit jeder jedem hilft.

Zitat:

Was meinst du den eigentlich was man so an Lektüre verzehren sollte? Aus der Hilfe werd ich immer nicht ganz so schlau wenn ich ein fertigen code seh, dann versteh ich das schon besser.
Ich muss gestehen ich habe noch kein eiziges Buch über Delphi gelesen. Alles was ich weiss habe ich:

a) Aus der OnlineHilfe
b) Aus diesem Forum
c) Durch ausprobieren

Zitat:

P:S: Hatte ganz vergessen ,weißt du warum das andere nicht so gut läuft,ist die Rechenzeit zu hoch,
die maus zu schnell, oder OnMouseMove eh ungeeignet.
Naja, das OnMouseMove wird halt immer aufgerufen sobald Du die Maus bewegst.

Der Code ist eigentlich ganz einfach zu verstehen.

Delphi-Quellcode:
procedure TForm1.CMMouseEnter(var Message: TMessage);
var
  ptWork : TPoint;
begin
  GetCursorPos(ptWork);
  if (WindowFromPoint(ptWork) = BitBtn1.Handle) then BitBtn1.Font.Color := clred;
end;
Sobald der Cursor über einem Objekt ist wird diese Procedure aufgerufen.
Mit GetCursorPos wird die Position des Cursors ermittelt. Mit WindowFromPoint wir der Handel des Objektes unter dem Curser ermittelt und dann wird einfach geprüft ob dies der Handel eines der Buttons ist.

Bei OnMouseLeav wird einfach geprüft ob es nicht der Handel eines Buttons ist.

Ich hoffe die Erklärung ist halbwegs richtig und verständlich. Ansonsten kann Christian Seehase das sicher genaueres zu sagen.

Christian Seehase 23. Okt 2003 11:57

Re: Nochmal onMouseMove ???
 
Moin Sharky,

ich würd' nur noch an der Begrifflichkeit etwas ändern ;-)

Zitat:

Zitat von Sharky
Mit WindowFromPoint wir der Handel des Objektes unter dem Curser

Das könnte missverständlich sein.
Es wird das Handle des Fensters unter dem Cursor zurückgegeben (in diesem Zusammenhang sind auch Button, Editfelder usw. als Fenster zu begreifen).

Es gibt übrigens einen Ersatz für GetCursorPos, den uns Borland spendiert hat:
Mouse.Cursorpos.x/Mouse.CursorPos.y, so dass man sich die Deklaration der Variablen sparen und direkt diese Werte verwenden kann.

Die Verwendung der API GetCursorPos dürfte allerdings ein klitzekleines Bisschen schneller sein.

Sharky 23. Okt 2003 15:25

Re: Nochmal onMouseMove ???
 
Hai Christian,

Zitat:

Zitat von Sharky
Mit WindowFromPoint wir der Handel des Objektes unter dem Curser

Zitat:

Das könnte missverständlich sein.
Es wird das Handle des Fensters unter dem Cursor zurückgegeben (in diesem Zusammenhang sind auch Button, Editfelder usw. als Fenster zu begreifen).
Genau das meinte ich mit "Objekt". Dank euch habe ich "gelernt" das auch ein Button, Edit, usw., ein Fenster ist!.

Für genaue Informationen habe ich schniede eh an dich verwiesen!.
Frage: Habe ich es einigermassen richtig erklärt? (dann habe ich es nämlich auch verstanden).

Christian Seehase 23. Okt 2003 15:48

Re: Nochmal onMouseMove ???
 
Moin Sharky,

Zitat:

Zitat von Sharky
Für genaue Informationen habe ich schniede eh an dich verwiesen!.

ist mir nicht entgangen ;-)

Zitat:

Zitat von Sharky
Frage: Habe ich es einigermassen richtig erklärt? (dann habe ich es nämlich auch verstanden).

also mir, ausser dem schon beschriebenen, nichts aufgefallen.
Ich hätt' sonst schon was gesagt ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz