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 Label-Position auswerten (https://www.delphipraxis.net/62243-label-position-auswerten.html)

Hansa 1. Feb 2006 18:00


Label-Position auswerten
 
Hi,

es geht um Mauspositionen. Wie und wo kann man auswerten, ob sich der Mauszeiger über einem Label befindet ?

Luckie 1. Feb 2006 18:04

Re: Label-Position auswerten
 
Forensuche: http://www.delphipraxis.net/internal...ght=cmmouse%2A

Christian Seehase 1. Feb 2006 18:17

Re: Label-Position auswerten
 
Moin Hansa,

schau Dir mal Delphi-Referenz durchsuchenControlAtPos an.

Hansa 1. Feb 2006 18:37

Re: Label-Position auswerten
 
Das ControlAtPos hört sich gut an. Nur bringt so was :

Delphi-Quellcode:
procedure Tfrm.FormMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  if ControlAtPos(Point (x,y),false) = TLabel (Self) then
showmessage ('asdsaf');
end;
keinerlei Reaktion. Das MouseMove wird allerdings schon angesprochen. Lasse ich die if Abfrage weg, so kommt die showmessage. Da liegt also der Hund begraben. Nur wo ? :mrgreen:

marabu 1. Feb 2006 19:39

Re: Label-Position auswerten
 
Da schlummert nicht nur ein Hund.

Das Ereignis OnMouseMove() wird nur für die Form selbst ausgelöst, für auf der Form befindliche WinControls wird es an diese delegiert. Das bedeutet, das du das Ereignis dort abholen kannst - beim Label selbst. Außerdem willst du deine Form ganz sicher nicht nach TLabel casten - oder?

Grüße vom marabu

Hansa 1. Feb 2006 20:05

Re: Label-Position auswerten
 
Zitat:

Zitat von marabu
Außerdem willst du deine Form ganz sicher nicht nach TLabel casten - oder?

Doch. :mrgreen: Befindet sich die Maus über einem Label, dann soll das anders aussehen, als wie normal. Bei der Sache geht es allerdings nur um max. 10 Labels.

Christian Seehase 1. Feb 2006 20:56

Re: Label-Position auswerten
 
Moin Hansa,

Zitat:

Zitat von Hansa
Befindet sich die Maus über einem Label, dann soll das anders aussehen, als wie normal.

das kannst Du einfacher haben:

interface

Delphi-Quellcode:
type
  TMyLabel = class(TLabel)
  private
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  end;

implemenation

procedure TMyLabel.CMMouseEnter(var Message: TMessage);
begin
  self.Font.Color := clRed;
end;

procedure TMyLabel.CMMouseLeave(var Message: TMessage);
begin
  self.Font.Color := clBlack;
end;

procedure TForm1.FormCreate(Sender: TObject);

var
  mlbl : TMyLabel;

begin
  mlbl        := TMyLabel.Create(self);
  mlbl.Parent := self;
  mlbl.Caption := 'TESTLABEL';
  mlbl.Left   := 10;
  mlbl.Top    := 10;
end;

Hansa 2. Feb 2006 11:47

Re: Label-Position auswerten
 
Christian, das würde bedeuten, sämtliche Labels umzubauen. :shock: Ich muß die auch schon zur Designzeit rumschieben können. Was ist denn hierdran verkehrt :

Delphi-Quellcode:
procedure Tfrm.FormMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  i := i + 1;
  if ControlAtPos(Point (x,y),true,true) = TLabel (Sender) then    
    Memo1.Lines.Add (IntToStr (i)+' Label')
  else
    Memo1.Lines.Add (IntToStr (i)+' kein Label')
end;
Wandere ich auf der Form rum, dann wird der else Zweig durchlaufen. Bewege ich die Maus über einem Label, so passiert absolut nichts. Habe deshalb das i mit eingebaut. Es ist also kein Sehfehler. 8)

marabu 2. Feb 2006 12:14

Re: Label-Position auswerten
 
Hansa, du hast zwar inzwischen self durch Sender ersetzt, aber wahrscheinlich doch nicht verstanden was ich dir im Beitrag #5 beibiegen wollte. Ersetze noch "TLabel(Sender)" durch "Sender as TLabel", vielleicht wird dann deutlicher, das Sender = Self = frm ist.

Um Labels mit roter Schrift hervorzuheben kannst du einfach für alle TLabel Komponenten einen gemeinsamen Event Handler verwenden:

Delphi-Quellcode:
procedure TDemoForm.LabelMouseEnter(Sender: TObject);
begin
  with Sender as TLabel do
    Font.Color := clRed;
end;

procedure TDemoForm.LabelMouseLeave(Sender: TObject);
begin
  with Sender as TLabel do
    Font.Color := clBlack;
end;
Grüße vom marabu

Jens Schumann 2. Feb 2006 12:15

Re: Label-Position auswerten
 
[quote="Hansa"]Christian, das würde bedeuten, sämtliche Labels umzubauen. :shock: Ich muß die auch schon zur Designzeit rumschieben können. Was ist denn hierdran verkehrt :
Alles :cyclops:

Das OnMouseMove Event wird vom Formualar gefeuert. Wenn Du mit der Maus über das Label kommst wird das OnMouseMove Event vom
Label gefeuert.

Wenn Du den Type prüfen möchest solltest Du den is Operator verwenden
Delphi-Quellcode:
if ControlAtPos(Point (x,y),true,true) is TLabel then
Der einfachste Weg ist der, den Christain vorgeschlagen hat. Du kannst Dir eine eigene Labelkomponente basteln und in der Komponentenpallette registrieren.

bigg 2. Feb 2006 13:10

Re: Label-Position auswerten
 
Liste der Anhänge anzeigen (Anzahl: 1)
moin,

ich weiß zwar nicht genau, worum es geht, poste aber trotzdem mal.

Hansa 2. Feb 2006 17:37

Re: Label-Position auswerten
 
Die Vorschläge haben bisher nicht viel genützt :

Delphi-Quellcode:
procedure Tfrm.FormMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
//  inherited;
i := i + 1;
  if ControlAtPos(Point (x,y),true,true) is TLabel then
Memo1.Lines.Add (IntToStr (i)+' Label')
else
Memo1.Lines.Add (IntToStr (i)+' kein Label')
end;
Egal, was ich mache : nur der else-Zweig wird durchlaufen. Ergo : im ControlAtPos ist ein Fehler.

turboPASCAL 2. Feb 2006 17:44

Re: Label-Position auswerten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nimm den Vorschlag von marabu. Jedem Label weist du dann im OI die selbe Procedure zu und jedes Label wird dir sagen wo es ist. ;)

Helmi 2. Feb 2006 17:51

Re: Label-Position auswerten
 
Hallo,

das Event "Tfrm.FormMouseMove" wird ja nur ausgelöst, wenn du dich mit der Maus direkt auf der Form bewegst.
Bewegst du aber die Maus auf ein Label, bist du nicht mehr direkt auf der Form, sondern eben auf diesem Label und nun wird dort (auf diesem Label) das Event "OnMouseMove" ausgelöst.

Ich hab einfach mal folgendes gemacht:
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
//  inherited;
i := i + 1;
  if ControlAtPos(Point (x,y),true,true) is TLabel then
Memo1.Lines.Add (IntToStr (i)+' Label')
else
Memo1.Lines.Add (IntToStr (i)+' kein Label')
end;

procedure TForm1.Label2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Memo1.Lines.Add('LABEL');
end;
Bin ich mit der Maus auf der Form bekomm ich "kein Label". Bin ich aber mit der Maus auf dem Label2, dann erhalt ich "LABEL".

Hansa 2. Feb 2006 18:43

Re: Label-Position auswerten
 
Helmi, das war schon mal richtig so. :-D Allerdings wird das Event 2mal ausgelöst. Das läßt sich aber leicht so beseitigen (inspired by Ch. Seehase) :

Delphi-Quellcode:
procedure Tfrm.lblMouseEnter(Sender: TObject);
begin
  inherited;
//  if ControlAtPos(Point (x,y),true,true) is TLabel then
    showmessage ('Label');
end;
Mal sehen, ob ich das MouseLeave auch noch brauche. Allerdings wäre es noch gut, wenn einer wüßte, wie ich dieses Verhalten ALLEN Labels beibringe.

Khabarakh 2. Feb 2006 18:57

Re: Label-Position auswerten
 
Wenn du es nicht per Hand machen willst, musst du eben am Anfang des Programms durch Components der Form iterieren und jedem Label die Prozedur zuweisen.

Hansa 2. Feb 2006 23:17

Re: Label-Position auswerten
 
Wieso kriege ich hier :

Delphi-Quellcode:
        TLabel (FindComponent (lblKomp.Name)).Canvas.Brush.Color := clRed;
        TLabel (FindComponent (lblKomp.Name)).Font.Color := clBlue;
zwar den Font geändert, die Hintergrundfarbe aber nicht ?

phlux 2. Feb 2006 23:20

Re: Label-Position auswerten
 
neue frage neuer thread? :mrgreen:

schon pen.color getestet?

Hansa 2. Feb 2006 23:32

Re: Label-Position auswerten
 
Zitat:

Zitat von phlux
neue frage neuer thread? :mrgreen:

jaja, aber der thread ist noch lange nicht beendet. :lol: Wie lautet denn die Antwort auf letzte aufgetauchte Frage ? Wem nützt ein Auseinanderreißen der Frage ? :mrgreen:

alcaeus 2. Feb 2006 23:33

Re: Label-Position auswerten
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von phlux
neue frage neuer thread? :mrgreen:

jaja, aber der thread ist noch lange nicht beendet. :lol: Wie lautet denn die Antwort auf letzte aufgetauchte Frage ? Wem nützt ein Auseinanderreißen der Frage ? :mrgreen:

Doch. Du bist lange genug dabei, und solltest die Regeln kennen. Neue Frage => Neuer Thread. So einfach ist das. Wem das nuetzt? Der Suchfunktion. Also, erstelle bitte ein neues Thema fuer die zweite Frage.

Hier mach ich erstmal zu.

Greetz
alcaeus

*** LOCKED ***


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