AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ListBox OnMouseOver Item-Farbe

Ein Thema von LTE5 · begonnen am 30. Dez 2017 · letzter Beitrag vom 3. Jan 2018
Antwort Antwort
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

ListBox OnMouseOver Item-Farbe

  Alt 30. Dez 2017, 18:54
Wie bekommt man es hin, dass wenn man mit der Maus über ein Listboxitem fährt, sich die Farbe ändert?
Ich möchte eine sehr dezente Farbe nutzen, ein leichtes Grau.

Ratet ihr davon grundsätzlich ab oder gehört das schon zu Benutzerfreundlichkeit?

So weit bin ich, komme aber nicht weiter
Delphi-Quellcode:
procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
 Index: Integer;
 Point: TPoint;
 CCanvas: TCanvas;
begin
 Point.X := X;
 Point.Y := Y;
 Index := TListBox(Sender).ItemAtPos(Point, True);

 if Index > -1 then
  begin
   CCanvas := TListBox(Sender).Canvas;

   CCanvas.Brush.Color := clRed;
  end;
end;
  Mit Zitat antworten Zitat
Solutor

Registriert seit: 24. Dez 2017
15 Beiträge
 
Delphi XE2 Enterprise
 
#2

AW: ListBox OnMouseOver Item-Farbe

  Alt 2. Jan 2018, 19:09
Also mal "quick and dirty":

Man kommt nicht ums selbst Zeichnen in der Behandlungsroutine Drawitem der Listbox herum.
Damit das funktioniert, muss man die Eigenschaft Style der Listbox auf LbOwnerDrawFixed setzen.

Ich hab anstelle einer globalen Variable die Tag-Eigenschaft der Listbox als Zwischenspeicher verwendet.

Die Farben muss man wie ich es hier gemacht habe, dann selber setzen.

Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
   With Control as Tlistbox do
   begin
      with canvas do
      begin
         brush.Color:=clwhite;//Standardfarfbe der Listbox
         Font.Color:=clblack;//Standardfarbe des Textes
         If OdSelected in State then //Wenn Eintrag markiert ist
         begin
            Brush.Color:=clblue;
            Font.Color:=clwhite;
         end;
         if Tag=Index then //Wenn sich der Cursor in der hier zu zeichneten Zeile befindet.
         begin
            Brush.Color:=clred;
            Font.Color:=clwhite;
         end;
         fillrect(rect);//Eintrag einfärben
         Textout(rect.left,rect.Top,Items[index]);//Text ausgeben
      end;

      //Trick um das Focus Rechteck auszublenden
      if (odSelected in State) then
      begin
         Canvas.DrawFocusRect(Rect);
         if not (odFocused in State) then Canvas.DrawFocusRect(Rect);
      end;
   end;
end;

procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
Var z:Integer;
begin
   z:=ListBox1.ItemAtPos(TPoint.Create( X, Y ),True);
   if z<>Listbox1.Tag then
   begin
   Listbox1.Items.BeginUpdate;
   ListBox1.Tag:=z;
   Listbox1.Invalidate;
   Listbox1.Items.EndUpdate;
   end;
end;
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#3

AW: ListBox OnMouseOver Item-Farbe

  Alt 3. Jan 2018, 00:42
;
Delphi-Quellcode:
      //Trick um das Focus Rechteck auszublenden
      if (odSelected in State) then
      begin
         Canvas.DrawFocusRect(Rect);
         if not (odFocused in State) then Canvas.DrawFocusRect(Rect);
      end;
   end;
end;
end;
Also, wenn die Zeile "selected" ist dann machst du ein DrawFocusRect.
Und wenn sie dann nicht zusätzlich auch "focused" ist, machst du nochmal DrawFocusRect.

Das passiert also folgendes
Wenn eine Zeile "selected" und "focused" ist, dann zeichnest du das FocusRect und die ListBox nimmt es mit ihrem "internen DrawFocusRect wieder weg.

Wenn eine Zeile "selected" aber nicht "focused" ist dann zeichnest du das FocusRect, nimmst es wieder weg und die Listbox macht in dem Fall gar nichts.

Ist irgendwie doppelt gemoppelt.

Ein einfaches if odFocused in State then Canvas.DrawFocusRect(Rect); ist völlig ausreichend, denn eine Zeile kann nur dann "focused" sein wenn sie auch "selected" ist.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Solutor

Registriert seit: 24. Dez 2017
15 Beiträge
 
Delphi XE2 Enterprise
 
#4

AW: ListBox OnMouseOver Item-Farbe

  Alt 3. Jan 2018, 11:25
Danke Amateurprofi,

da hab ich nicht zu Ende gedacht. Deine Lösung ist es besser und hat sicher weniger Seiteneffekte,
von der Performance ganz zu schweigen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 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