Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern (https://www.delphipraxis.net/118553-problem-mit-buttons-onmouseenter-alle-buttons-glaentzern.html)

Praxist 10. Aug 2008 11:07


Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Hallo

by speedbuttons und Bitbtn Buttons leuchten alle Buttons zusamen, wenn ich den Mousezeiger
auf ein Button oder auf ein Control in Form bewege
Onmouse Enter bekommt das Button ein neues Icon und auch beim OnMouseleave :
Delphi-Quellcode:
procedure TForm1.ButtonsCMMouseEnter(var Message: TMessage);
begin
if WindowFromPoint(ptWork) = BitBtn2.Handle then
ImageList1.GetBitmap(2, BitBtn2.Glyph);
//...
procedure TForm1.ButtonsCMMouseleave(var Message: TMessage);
begin
if WindowFromPoint(ptWork) <> BitBtn2.Handle then
ImageList1.GetBitmap(3, BitBtn2.Glyph);
gibt es eine Lösung für das Problem
Ich weiß nicht, warum alle Buttons glitzern, wenn der Mausezeiger auf ein Control in Form bewegt :(

TonyR 10. Aug 2008 14:32

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Ich versteh nicht ganz, möchtest du bei allen BitButtons diesen Effekt haben, oder nur bei einem?

Bei letzterem würde ich folgene Anweisung nicht verstehen
Delphi-Quellcode:
if WindowFromPoint(ptWork) = BitBtn2.Handle then
Und bei Ersterem nicht, warum du nicht ganz normal über die OnEnter Prozedur des Bitbtn zugreifst!?

Praxist 10. Aug 2008 15:17

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von TonyR
Ich versteh nicht ganz, möchtest du bei allen BitButtons diesen Effekt haben, oder nur bei einem?

Bei letzterem würde ich folgene Anweisung nicht verstehen
Delphi-Quellcode:
if WindowFromPoint(ptWork) = BitBtn2.Handle then
Und bei Ersterem nicht, warum du nicht ganz normal über die OnEnter Prozedur des Bitbtn zugreifst!?

ich möchte diesen Effekt bei mehreren BitButtons haben
>> warum du nicht ganz normal über die OnEnter Prozedur des Bitbtn zugreifst!?
weil D7 den Event OnMouseLeave nicht hat sondern nur OnMouseMouve

Das Problem kommt von dem Event OnMouseEnter, was ich programmiert habe, und
möchte ich ändern

>> Bei letzterem würde ich folgene Anweisung nicht verstehen
Delphi-Quellcode:
procedure TForm1.ButtonsCMMouseEnter(var Message: TMessage);
var
  ptWork : TPoint;
begin
  GetCursorPos(ptWork);
  if WindowFromPoint(ptWork) = BitBtn2.Handle then // wenn der cursor drauf kommt

TonyR 10. Aug 2008 15:28

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Zitat:

Zitat von Praxist
...
weil D7 den Event OnMouseLeave nicht hat sondern nur OnMouseMouve
...

sorry, daran hatte ich nicht gedacht.


geht das bei MouseEnter vllt. auch so:
Delphi-Quellcode:
procedure TForm1.BitBtn1MouseEnter(Sender: TObject);
begin
TBitbtn(sender).Glyph:= {irgendwas} ;
end;

Praxist 10. Aug 2008 15:40

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
OnMouseEnter und OnMouseNove beide funktionieren
Das Problem was macht man OnMouseLeave ?
Das BitButton soll ein anderes Bild bekommen wenn der Cursor das Button verlässt

TonyR 10. Aug 2008 15:51

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Oder du lädst dir einfach die LMD Tools herunter: http://www.lmd.de/download/#LMD%20Freeware

Da ist der TLMDButton unter der Rubrik LMDStd dabei, der besitzt OnMouseEnter + OnMouseExit, da umgehst du die ganze Sache

Edit: Außerdem kann man in diesen Button natürlich auch ein Glyph laden ;-)

Praxist 10. Aug 2008 16:02

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
BitButton hat auch besitzt OnMouseEnter + OnMouseExit
Das geht um OnMouseLeave

DeddyH 10. Aug 2008 16:09

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Unter Delphi 7 hat ein BitBtn kein Ereignis OnMouseEnter oder OnMouseExit.

Praxist 10. Aug 2008 16:16

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Versehen, das war OnEnte und OnExit aber kein OnMouseEnter
Kann man sie nicht programmieren ?

DeddyH 10. Aug 2008 16:34

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Kann man. Kleines Beispiel (komplette Unit):
Delphi-Quellcode:
unit bla;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type

  TBitBtn = class(Buttons.TBitBtn)
  private
    procedure CMMOUSEENTER(var Msg: TMessage); message CM_MOUSEENTER;
    procedure CMMOUSELEAVE(var Msg: TMessage); message CM_MOUSELEAVE;
  end;

  TForm1 = class(TForm)
    btn1: TBitBtn;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TBitBtn }

procedure TBitBtn.CMMOUSEENTER(var Msg: TMessage);
begin
  inherited;
  Font.Style := Font.Style + [fsBold];
end;

procedure TBitBtn.CMMOUSELEAVE(var Msg: TMessage);
begin
  inherited;
  Font.Style := Font.Style - [fsBold];
end;

end.

Praxist 10. Aug 2008 17:53

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Es geht mit dem Vorschlag. Sollen aber alle BitBtns den selben Effekt haben ?
Wenn ich den Effekt für ein bestimtes Button zuweise, bekomme ich Fehler:
Undeclared BitBtn1 !
Delphi-Quellcode:
Bitbtn1.Font.Style := Bitbtn1.Font.Style + [fsBold];

DeddyH 10. Aug 2008 18:02

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Da muss man etwas weiter ausholen:
Delphi-Quellcode:
unit bla;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type

  TBitBtn = class(Buttons.TBitBtn)
  private
    FOnMouseEnter: TNotifyEvent;
    FOnMouseLeave: TNotifyEvent;
    procedure CMMOUSEENTER(var Msg: TMessage); message CM_MOUSEENTER;
    procedure CMMOUSELEAVE(var Msg: TMessage); message CM_MOUSELEAVE;
  public
    constructor Create(aOwner: TComponent); override;
    property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
    property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  end;

  TForm1 = class(TForm)
    btn1: TBitBtn;
    btn2: TBitBtn;
    btn3: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure DoOnEnter(Sender: TObject);
    procedure DoOnLeave(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TBitBtn }

procedure TBitBtn.CMMOUSEENTER(var Msg: TMessage);
begin
  inherited;
  if Assigned(FOnMouseEnter) then
    FOnMouseEnter(Self);
end;

procedure TBitBtn.CMMOUSELEAVE(var Msg: TMessage);
begin
  inherited;
  if Assigned(FOnMouseLeave) then
    FOnMouseLeave(Self);
end;

constructor TBitBtn.Create(aOwner: TComponent);
begin
  inherited;
  FOnMouseEnter := nil;
  FOnMouseLeave := nil;
end;

procedure TForm1.DoOnEnter(Sender: TObject);
begin
  (Sender as TBitBtn).Font.Style := (Sender as TBitBtn).Font.Style + [fsBold];
end;

procedure TForm1.DoOnLeave(Sender: TObject);
begin
  (Sender as TBitBtn).Font.Style := (Sender as TBitBtn).Font.Style - [fsBold];
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  btn2.OnMouseEnter := DoOnEnter;
  btn2.OnMouseLeave := DoOnLeave;
end;

end.
Hier werden die beiden definierten Events nur für btn2 zugewiesen.

Praxist 10. Aug 2008 18:28

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Wie konnte ich für ein bestimmtes Btn ein bestimmtes Bild zuweisen ?
Delphi-Quellcode:
ImageList1.GetBitmap(2, Btn2.Glyph);

DeddyH 10. Aug 2008 18:31

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Schau Dir in meinem Beispiel mal DoOnEnter und DoOnLeave an. Statt die Schriftart zu ändern, kannst Du dort auch andere Bilder zuweisen.

Praxist 10. Aug 2008 19:15

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
dort habe folgendes eingegeben
Delphi-Quellcode:
procedure TForm1.DoOnEnter(Sender: TObject);
begin
  //(Sender as TBitBtn).Font.Style := (Sender as TBitBtn).Font.Style + [fsBold];
  ImageList1.GetBitmap(1, Btn1.Glyph);
  ImageList1.GetBitmap(2, Btn2.Glyph);
end;
Aber die Bilder werden in alle Buttons angezeigt, wenn der Cursor auf ein Button kommt
Das Bild soll aber nur angezeigt, wenn der der Cursor auf sein Button kommt
Wie kann ich das machen ?
Vorteil mit diesem Code die Buttons glitzern nicht : )

DeddyH 10. Aug 2008 19:18

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Es kommt mir ein wenig so vor, als hättest Du das Prinzip nicht verstanden :gruebel:, oder wieso stehen da benannte Instanzen (Btn2 und Btn2)?

Praxist 10. Aug 2008 19:26

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Nicht ganz

TonyR 10. Aug 2008 21:04

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Also Praxist,

schau noch einmal in Beitrag #12 (hier nur ein Auszug mit Erläuterungen):
Delphi-Quellcode:
...
procedure TForm1.DoOnEnter(Sender: TObject);
begin
  //(Sender as TBitBtn).Font.Style := (Sender as TBitBtn).Font.Style + [fsBold];
  //das brauchst du nicht, vielmehr folgendes:
  ImageList1.GetBitmap(1, (Sender as TBitBtn).Glyph);
end;

procedure TForm1.DoOnLeave(Sender: TObject);
begin
  //(Sender as TBitBtn).Font.Style := (Sender as TBitBtn).Font.Style - [fsBold];
  //hier genau dasselbe nur eben das andere Bildchen
  //ich weiß ja jetzt nicht welches, aber ungefähr so eben:
  ImageList1.GetBitmap(2, (Sender as TBitBtn).Glyph);  
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //und hier ist es ganz wichtig, dass du für alle
  //Bitbtns Enter und Leave zuweist!

  //also nicht nur
  btn2.OnMouseEnter := DoOnEnter;
  btn2.OnMouseLeave := DoOnLeave;

  //sondern auch:
  btn1.OnMouseEnter := DoOnEnter;
  btn1.OnMouseLeave := DoOnLeave;

  //wenn das zu viele Komponenten sind dann
  //verwende eine Schleife die alle Komponenten durchläuft
  //und es den Bitbtns zuweist,
  //das gehört dann aber nicht in diesen Thread
end;

end.
Ich hoffe das hilft, sieh es dir genau an.

Praxist 10. Aug 2008 21:59

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Du hast auch das Button nicht hingeschrieben !
Delphi-Quellcode:
  //das brauchst du nicht, vielmehr folgendes:
  ImageList1.GetBitmap(1, (Sender as TBitBtn).Glyph); // für welches Button ?

TonyR 10. Aug 2008 22:02

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Zitat:

Zitat von Praxist
Du hast auch das Button nicht hingeschrieben !
Delphi-Quellcode:
  //das brauchst du nicht, vielmehr folgendes:
  ImageList1.GetBitmap(1, (Sender as TBitBtn).Glyph); // für welches Button ?

Das bestimmt der Sender, welcher Button das ist,
hast du den Code mal so probiert?
Vielleicht funktioniert es!?

Praxist 10. Aug 2008 22:24

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
>> hast du den Code mal so probiert?
Alle BitButtons bekommen das selbe Bilder OnMouseEnter, logisch
Aber jedes Bild soll ein bestimmtes Bild haben

mkinzler 11. Aug 2008 05:39

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Wende den Code halt auf Sender an

Praxist 11. Aug 2008 07:47

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Zitat:

Zitat von Praxist
>> hast du den Code mal so probiert?
Alle BitButtons bekommen das selbe Bilde OnMouseEnter, logisch
Aber jedes Bild soll ein bestimmtes Bild haben


DeddyH 11. Aug 2008 07:54

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Dann müsste man eine Abfrage auf den Sender einbauen.
Delphi-Quellcode:
if (Sender = btn1) then
  ImageList1.GetBitmap(1, btn1.Glyph)
else if (Sender = btn2) then
  ImageList1.GetBitmap(2, btn2.Glyph)
...
Evtl. gibt es auch eine elegantere Methode, aber die fällt mir gerade nicht ein.

mkinzler 11. Aug 2008 07:56

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Man könnte den Index als Tag im Button hinterlegen

DeddyH 11. Aug 2008 07:57

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Stimmt, die Tag-Property vergesse ich immer wieder, dabei kann sie so nützlich sein :lol:

Praxist 11. Aug 2008 09:27

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
So sieht es aus :

Delphi-Quellcode:
procedure TForm1.DoOnEnter(Sender: TObject);
begin
 if (Sender = btn1) then begin Btn1.Glyph := nil;
  ImageList1.GetBitmap(1, btn1.Glyph); end
else if (Sender = btn2) then begin Btn2.Glyph := nil;
  ImageList1.GetBitmap(3, btn2.Glyph);end
  else if (Sender = btn3) then begin Btn3.Glyph := nil;
  ImageList1.GetBitmap(5, btn3.Glyph);end;
end;

procedure TForm1.DoOnLeave(Sender: TObject);
begin
  //(Sender as TBitBtn).Font.Style := (Sender as TBitBtn).Font.Style - [fsBold];
    if (Sender <> btn1) then begin Btn1.Glyph := nil;
  ImageList1.GetBitmap(0, btn1.Glyph);end
else if (Sender <> btn2) then begin Btn2.Glyph := nil;
  ImageList1.GetBitmap(2, btn2.Glyph); end
  else if (Sender <> btn3) then begin Btn3.Glyph := nil;
  ImageList1.GetBitmap(4, btn3.Glyph);end;
end;
Es funktioniert nicht schnell und das Button bekommt nicht sofort ein neues Bild
OnMouseLeave sondern nur nach hin und her den Cursor auf andere BitButtons bewegen !
Das ganze funktioniert mit einer Verzögerung
Btn3 wechselt sein Bild überhaupt nicht !

DeddyH 11. Aug 2008 09:33

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Liest Du eigentlich, was wir hier schreiben? Markus' Idee mit dem Tag ist doch super, die musst Du nur umsetzen. Also: btn1 bekommt Tag 1, btn2 Tag 3 und btn3 Tag5 (im OI). Und nun müsste das so doch gehen:
Delphi-Quellcode:
procedure TForm1.DoOnEnter(Sender: TObject);
begin
  ImageList1.GetBitmap((Sender as TBitBtn).Tag, (Sender as TBitBtn).Glyph);
end;

procedure TForm1.DoOnLeave(Sender: TObject);
begin
  ImageList1.GetBitmap(Pred((Sender as TBitBtn).Tag), (Sender as TBitBtn).Glyph);
end;

Praxist 11. Aug 2008 10:37

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Mit dem Tag funktioniert OnMouseEnter wunderbar :
Delphi-Quellcode:
procedure TForm1.DoOnEnter(Sender: TObject);
begin
   If (sender AS TBitBtn).Tag = 1 then begin
  ImageList1.GetBitmap(1, btn1.Glyph); end;
  If (sender AS TBitBtn).Tag = 2 then begin
  ImageList1.GetBitmap(3, btn2.Glyph); end;
    If (sender AS TBitBtn).Tag = 3 then begin
  ImageList1.GetBitmap(5, btn3.Glyph); end
end;
Mit OnMouseLeave kapiere ich immer noch nicht
Delphi-Quellcode:
procedure TForm1.DoOnLeave(Sender: TObject);
begin
  ImageList1.GetBitmap(Pred((Sender as TBitBtn).Tag), (Sender as TBitBtn).Glyph);
end;

mkinzler 11. Aug 2008 10:41

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Ich würde keine feste Referenzen verwenden sonder den Sender auswerten
Delphi-Quellcode:
ImageList1.GetBitmap((Sender as TButton).Tag, (Sender as TButton).Glyph);

DeddyH 11. Aug 2008 10:43

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Und ich verstehe nicht, dass Du unsere Posts ignorierst oder nur halb liest.
Zitat:

Zitat von DeddyH
btn1 bekommt Tag 1, btn2 Tag 3 und btn3 Tag 5 (im OI).

Der Tag bestimmt den Index der ImageList und kann direkt aus dem Sender ausgelesen werden.
Zitat:

Delphi-Quellcode:
ImageList1.GetBitmap((Sender as TBitBtn).Tag, (Sender as TBitBtn).Glyph);

Und was verstehst Du an meinem DoOnLeave nicht? Ist doch genau dasselbe Prinzip, nur dass der Index dann Tag - 1 entspricht.

Praxist 11. Aug 2008 11:02

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Ich habe nicht gewusst, dass den tag automatisch ausgelesen wird
Wie gesagt OnMouseEnter geht super

In MouseLeave habe ich den selben Prinzip, wie Du geschrieben hast aber passiert nicht
Delphi-Quellcode:
procedure TForm1.DoOnLeave(Sender: TObject);
begin
//  ImageList1.GetBitmap(Pred((Sender as TBitBtn).Tag-1), (Sender as TBitBtn).Glyph);
ImageList1.GetBitmap((Sender as TBitBtn).Tag-1, (Sender as TBitBtn).Glyph);
end;
Oder vielleicht muss man das Bild vorher löschen

DeddyH 11. Aug 2008 11:03

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Funktioniert es denn, wenn Du als Index fest die 0 reinschreibst? Wird die Methode überhaupt aufgerufen?

Praxist 11. Aug 2008 11:39

Re: Problem mit Buttons OnMouseEnter. Alle Buttons gläntzern
 
Wie ich gedacht habe, man mus sowohl OnMouseEnter als auch OnMouseLeave vorher das BitBtn Graphic löschen :
Delphi-Quellcode:
procedure TForm1.DoOnLeave(Sender: TObject);
begin
(Sender as TBitBtn).Glyph := nil;
// dann kommt der code
Danke für die Hilfe und für Deine Geduld : )


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:15 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