PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit der Maus über ein objekt fahren ;) ....


D4N73
05.06.2002, 22:00
Hi leutz...

ich hab da folgendes problem:

Ich will die farbe eines Labels ändern... wenn ich mit der mouse darüberfahre... das ist ja auch kein problem... das setz ich einfach in onmouseover.... Aber WIE kann ich das wiederzurückändern wenn ich das objekt (Label) wieder mit verlasse ???

gibts da ne spezielle funktion oder...

thx

visit: http://elite.to/elitecorps

D4N73


Patrik Graf
05.06.2002, 22:04
Benutze einfach das OnMouseOver -Ereignis der ausenrumstehenden Objekte, z.B vom Form, und setze es da wieder auf die ursprüngliche Farbe zurück :D

SAV
05.06.2002, 23:08
Also ich würde es so machen, das ist zwar keine speziale Funktion oder sowas änliches aber vielleicht hilft es dir ja weiter.


procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Label1.Color := clred;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Label1.Color := clBtnFace;
end;

Felix Kaiser
05.06.2002, 23:42
Ich, als Perfektionist, möge diese Lösungen nicht, denn: Du fährst über das Label, es färbt sich. Dann hat der Explorer z.B. irgendeine Fehlermeldung (kann ja sein), dessen Fehlermeldung überlagert deine Anwendung. Du bestätigst diese, der Explorer bekommt den Fokus und aktiviert sich, du minimierst ihn. Nun ist der Mauszeiger in irgendeiner Bildecke, aber das Label ist IMMERNOCH gefärbt, obwohl die Maus draußen ist. Ich benutze daher einen Timer und ermittele somit das Steuerelement (o. Fensterelement) unterm Mauszeiger und prüfe so, ob Over oder Out. Wer auf Abwärtskompatiblität verzichten will, kann eine entsprechende Funktion benutzen, seit Windows2000 gibt es eine Botschaft WM_MOUSEOUT (o.ä.), die denselben Effekt bewirkt.

Übrigens ergibt sich diese Problematik auch bei eng am Fensterrand liegenden Komponenten, da der Mauszeiger viel schneller 'unbemerkt' das Objekt verlassen kann.

D4N73
07.06.2002, 18:51
also die möglichkeiten benutze ich auch... bloss damit gebe ich mich nicht zufrieden....

Wie Felix Kaiser ;) schon sag.. das mit dem rand und dem fokus...

hmm bloss das mit dem timer... das frisst zu viel speicher... wenn das jede sek prüft ob noch drauf oder nicht ;)

D4N73

Felix Kaiser
07.06.2002, 23:00
Welchen Speicher? Compilierten Code? Nicht mehr als 1k! Arbeitsspeicher? Nur ein Handle für den Timer. Ich sehe da kein Problem. Zu dem kommt mir gerade der Gedanke eine Basisklasse zu erstellen, die dies alles automatisch verwaltet und ein Ereignis OnMouseOut vererbt, aber solange ichs nicht brauch und genügend Langeweile dazu habe mach ich da nix
:D

D4N73
10.06.2002, 12:24
Jo... Hab da was verwechselt... :mauer:

dann probiere ich das mal mit dem timer...

thx

D4N73

visit: http://elite.to/elitecorps

D4N73
13.06.2002, 13:45
GURU Zitat :
(Ich benutze daher einen Timer und ermittele somit das Steuerelement (o. Fensterelement) unterm Mauszeiger und prüfe so, ob Over oder Out. ) Zitat Ende

haste das vielleicht ein kleines beispiel :) ???

D4N73

Felix Kaiser
13.06.2002, 15:58
Du ermittelst das Physische Viereck (Rect), was die absoluten Bildkoordinaten des Objektes enthält. Dann holst du dir die aktuelle Mauscursorposition und prüfst ob diese innerhalb des Clientbereichs des Objektes ist, hab mir hierfür eine Funktion gebaut:

function MouseOver(Obj: TControl): boolean;
var
PhysRect: TRect;
pt: TPoint;
begin
GetCursorPos(pt);
PhysRect:= Rect(Obj1.ClientOrigin,Point(Obj1.ClientOrigin.X+Label1.Width,Obj1.ClientOrigin.Y+Obj1.Height));
MouseOver:= PtInRect(PhysRect,pt);
end;

Den Rest verwaltest du dann über den Timer.

D4N73
13.06.2002, 17:16
thanx a lot... ;) Du bist verdammt gut ;)