Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit der Maus über ein objekt fahren ;) ....
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
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.
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
Jo... Hab da was verwechselt... :mauer:
dann probiere ich das mal mit dem timer...
thx
D4N73
visit: http://elite.to/elitecorps
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.
thanx a lot... ;) Du bist verdammt gut ;)
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.