AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Lösung TListview eigene Farbe andere Icons für Aktive Items

Lösung TListview eigene Farbe andere Icons für Aktive Items

Ein Thema von etom291272 · begonnen am 4. Dez 2005 · letzter Beitrag vom 9. Dez 2005
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
etom291272

Registriert seit: 16. Feb 2004
Ort: ---
232 Beiträge
 
#1

Lösung TListview eigene Farbe andere Icons für Aktive Items

  Alt 4. Dez 2005, 00:08
hallo zusammen

Da ich nirgends eine Listviewkomponente gefunden habe bei der man das Erscheinungsbild der fokusierten Items (wird ja von Windows gesteuert clHighlight bzw grau wenn kein focus) einstellen kann habe ich mal selbst handangelegt.

Da ich schon einige fragen zu diesem thema im forum gefunden habe aber wie gesagt keine antwort fand möchte ich euch meine Lösung nicht vorenthalten.

Funktionen: (Siehe Anlagen)
Andere Icons für markierte Items
Die Markierung wird in einer gewünschten Farbe gezeichnet (auch wenn item fokusiert)
um die Markierung wird ein Rand in einer anderen Farbe gezeichnet.

Der Code müsste für jede TListview bei Viewstyle vsicon und vsreport funktionieren



Delphi-Quellcode:
//------------------------------------------------------------------------------

procedure TFmDesigner.lvGruppenCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  aIconRect, aTextRect:TRect;
begin

  if (Item.Index=TListView(Sender).ItemIndex) or (TListView(Sender).ItemFocused=Item) or (Item.selected) then
  begin
    DefaultDraw:=False;
    aIconRect:=Item.DisplayRect(drBounds);
    aTextRect:=Item.DisplayRect(drLabel);

    if TListView(Sender).ViewStyle=vsIcon then
    begin
      with Sender do
      begin
        Canvas.Pen.Color := $008FC2B3;
        Canvas.Brush.Color := $00CDEFE9;
        Canvas.Rectangle(aTextRect);

        Windows.DrawText(Canvas.Handle, @Item.Caption[1], Length(Item.Caption),
                         aTextRect, DT_CENTER+DT_WORDBREAK);

        Canvas.Brush.Color:=$008FC2B3;
        Canvas.FrameRect(aTextRect);

        TListView(Sender).LargeImages.Draw(Canvas,aIconRect.Left+((aIconRect.Right-aIconRect.Left) div 2)-TListView(Sender).LargeImages.Width div 2
                         ,aIconRect.Top+2,1);
      end;
    end;

    if TListView(Sender).ViewStyle<>vsIcon then
    begin
      with Sender do
      begin
        Canvas.Pen.Color := $00CDEFE9;
        Canvas.Brush.Color := $00CDEFE9;
        Canvas.Rectangle(aTextRect);

        aTextRect.Left:=aTextRect.Left+2;
        Windows.DrawText(Canvas.Handle, @Item.Caption[1], Length(Item.Caption),
                         aTextRect, DT_VCENTER);

        Canvas.Brush.Color:=$008FC2B3;
        Canvas.FrameRect(aTextRect);

        TListView(Sender).SmallImages.Draw(Canvas,aIconRect.Left+2
                         ,aIconRect.Top,1);
      end;
    end;
  end //Aktives Item
end;

//------------------------------------------------------------------------------

da ich mich bis jetzt sehr wenig mit komponentenentwicklung beschäftigt habe würde es mich freuen wenn mir jemand helfen würde diese funktionen in eine eigene Tlistviewkl Klasse einzubauen.
Ich möchte im Objektinspektor folgendes einstellen können (Farbe Markierung, Farbe Rand, Imageindex für
Mark Items gross(Aus LargeImages) und klein (SmallImages)
Miniaturansicht angehängter Grafiken
eitslistv2_139.jpg   eitslistv1_765.jpg  
  Mit Zitat antworten Zitat
etom291272

Registriert seit: 16. Feb 2004
Ort: ---
232 Beiträge
 
#2

Re: Lösung TListview eigene Farbe andere Icons für Aktive It

  Alt 4. Dez 2005, 10:46

noch ne kleine verbesserung. Bei viewstyle vsicon gabs ein problem wenn sehr viel text in den captions war (mehr als 20 Zeichen) mit folgender Codeänderung funktioniert auch dass

Delphi-Quellcode:
if TListView(Sender).ViewStyle=vsIcon then
    begin
      with Sender do
      begin
        Canvas.Pen.Color := $008FC2B3;
        Canvas.Brush.Color := $00CDEFE9;
        Canvas.Rectangle(aTextRect);

        Windows.DrawText(Canvas.Handle, @Item.Caption[1], Length(Item.Caption),
                         aTextRect, DT_EDITCONTROL+DT_CENTER+DT_WORDBREAK); //Hier war vorher nur DT_CENTER+DT_WORDBREAK

        Canvas.Brush.Color:=$008FC2B3;
        Canvas.FrameRect(aTextRect);

        TListView(Sender).LargeImages.Draw(Canvas,aIconRect.Left+((aIconRect.Right-aIconRect.Left) div 2)-TListView(Sender).LargeImages.Width div 2
                         ,aIconRect.Top+2,1);
      end;
    end;
  Mit Zitat antworten Zitat
100nF

Registriert seit: 7. Nov 2004
639 Beiträge
 
#3

Re: Lösung TListview eigene Farbe andere Icons für Aktive It

  Alt 4. Dez 2005, 11:23
super code!!

ich habs an einer listview mit ViewStyle = vsReport probiert, und es funktioniert ganz gut.
das einzige problem ist, dass nur die erste spalte so abgeändert wird, ich hätte aber lieber wenn die subitems dann auch noch so markiert werden.

ich habe schon probiert ob das funktioniert, leider habe ich es aber nicht hinbekommen.

könnte jemand den code noch so abändern dass es auch für die subitems funktioniert?

gruss
urbanbruhin
  Mit Zitat antworten Zitat
etom291272

Registriert seit: 16. Feb 2004
Ort: ---
232 Beiträge
 
#4

Re: Lösung TListview eigene Farbe andere Icons für Aktive It

  Alt 4. Dez 2005, 14:23
guter vorschlag

es ist zwar bei listviews normalerweise üblich dass nur die erste spalte markiert wird (siehe windows explorer) aber man kanns ja mal versuchen.

Damit der code für die subitems geht müsste man an die koordinaten des rects für die einzelnen subitems kommen.

Hat da jemand eine spontane idee
  Mit Zitat antworten Zitat
etom291272

Registriert seit: 16. Feb 2004
Ort: ---
232 Beiträge
 
#5

Re: Lösung TListview eigene Farbe andere Icons für Aktive It

  Alt 4. Dez 2005, 14:44
hab mal ein bißchen herumprobiert.

Das grössere Problem glaub ich wird es an das canvas der subitems zu kommen wenn man das rechteck wo er zeichnet weiter nach rechts verschiebt beim costumdrawsubitem macht er zwar die markierung und den text allerdings immer in der 1. spalte
  Mit Zitat antworten Zitat
100nF

Registriert seit: 7. Nov 2004
639 Beiträge
 
#6

Re: Lösung TListview eigene Farbe andere Icons für Aktive It

  Alt 4. Dez 2005, 15:14
bin auch schon die längste zeit am rumprobieren, und ich komme immer näher ans ziel

dauert aber noch ein bisschen bis ich fertig bin...
  Mit Zitat antworten Zitat
etom291272

Registriert seit: 16. Feb 2004
Ort: ---
232 Beiträge
 
#7

Re: Lösung TListview eigene Farbe andere Icons für Aktive It

  Alt 4. Dez 2005, 15:40
ich habs siehe anlage code folgt
Miniaturansicht angehängter Grafiken
eitslistv3_118.jpg  
  Mit Zitat antworten Zitat
100nF

Registriert seit: 7. Nov 2004
639 Beiträge
 
#8

Re: Lösung TListview eigene Farbe andere Icons für Aktive It

  Alt 4. Dez 2005, 15:50
ich habs jetzt auch fast, aber mit den farben stimmt noch etwas nicht ganz genau...

naja, ich warte jetzt mal auf deinen code, etom291272.

@etom291272
passt jetzt nicht grad zum thema, aber ich habe da grad den schönen button rechts oben auf deinem screenshot gesehen.
wie hast du den gemacht?
  Mit Zitat antworten Zitat
etom291272

Registriert seit: 16. Feb 2004
Ort: ---
232 Beiträge
 
#9

Re: Lösung TListview eigene Farbe andere Icons für Aktive It

  Alt 4. Dez 2005, 15:53
die lösung war in der DP
ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @aTextRect);
Delphi-Quellcode:
uses CommCtrl

//------------------------------------------------------------------------------

procedure TfmVarZusStln.lvElementeCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  aIconRect, aTextRect:TRect;
  SubItem:Integer;
begin

  if (Item.Index=TListView(Sender).ItemIndex) or (TListView(Sender).ItemFocused=Item) or (Item.selected) then
  begin
    DefaultDraw:=False;

    aIconRect:=Item.DisplayRect(drBounds);
    aTextRect:=Item.DisplayRect(drLabel);

    if TListView(Sender).ViewStyle=vsIcon then
    begin
      with Sender do
      begin
        Canvas.Pen.Color := $008FC2B3;
        Canvas.Brush.Color := $00CDEFE9;
        Canvas.Rectangle(aTextRect);

        Windows.DrawText(Canvas.Handle, @Item.Caption[1], Length(Item.Caption),
                         aTextRect, DT_EDITCONTROL+DT_CENTER+DT_WORDBREAK);

        Canvas.Brush.Color:=$008FC2B3;
        Canvas.FrameRect(aTextRect);

        TListView(Sender).LargeImages.Draw(Canvas,aIconRect.Left+((aIconRect.Right-aIconRect.Left) div 2)-TListView(Sender).LargeImages.Width div 2
                         ,aIconRect.Top+2,1);
      end;
    end;

    if TListView(Sender).ViewStyle<>vsIcon then
    begin
      with Sender do
      begin
        Canvas.Pen.Color := $00CDEFE9;
        Canvas.Brush.Color := $00CDEFE9;
        Canvas.Rectangle(aTextRect);

        aTextRect.Left:=aTextRect.Left+2;
        Windows.DrawText(Canvas.Handle, @Item.Caption[1], Length(Item.Caption),
                         aTextRect, DT_VCENTER);

        Canvas.Brush.Color:=$008FC2B3;
        Canvas.FrameRect(aTextRect);

        TListView(Sender).SmallImages.Draw(Canvas,aIconRect.Left+2
                         ,aIconRect.Top,1);
        //----------------------------------------------------------------------
        //SubItems durchlaufen
        for SubItem:=1 to Item.SubItems.Count do
        begin
          ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @aTextRect);

          if TListView(Sender).ViewStyle=vsReport then
          begin
            with Sender do
            begin
              Canvas.Pen.Color := $00CDEFE9;
              Canvas.Brush.Color := $00CDEFE9;
              Canvas.Rectangle(Rect(aTextRect.Left+2,aTextRect.Top,aTextRect.Right,aTextRect.Bottom));

              aTextRect.Left:=aTextRect.Left+2;
              Windows.DrawText(Canvas.Handle, @Item.SubItems[SubItem-1][1], Length(Item.SubItems[SubItem-1]),
                               aTextRect, DT_VCENTER);

              Canvas.Brush.Color:=$008FC2B3;
              Canvas.FrameRect(aTextRect);
            end;
          end;
        end;
        //----------------------------------------------------------------------
      end;
    end;
  end; //Aktives Item
end;

//------------------------------------------------------------------------------
da die routine im oncustomdrawsubitem nur funktionierte wenn ich im oncustomdrawitem das Defaultdraw auf true liess (was natürlich nicht geht) hab ich versucht alles im oncustomdrawitem zu zeichnen und das ging
  Mit Zitat antworten Zitat
etom291272

Registriert seit: 16. Feb 2004
Ort: ---
232 Beiträge
 
#10

Re: Lösung TListview eigene Farbe andere Icons für Aktive It

  Alt 4. Dez 2005, 15:58
kuckst du Hier rbControls
endlich ordentliche Schaltflächen ohne XP Manifest
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:14 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