Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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 Lösung TListview eigene Farbe andere Icons für Aktive Items (https://www.delphipraxis.net/58244-loesung-tlistview-eigene-farbe-andere-icons-fuer-aktive-items.html)

etom291272 3. Dez 2005 23:08


Lösung TListview eigene Farbe andere Icons für Aktive Items
 
Liste der Anhänge anzeigen (Anzahl: 2)
:mrgreen: 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

:coder: :coder:

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)

etom291272 4. Dez 2005 09:46

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
:hi:
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;
:coder2:

100nF 4. Dez 2005 10:23

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
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

etom291272 4. Dez 2005 13:23

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

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 :?: :?: :?:

etom291272 4. Dez 2005 13:44

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
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 :gruebel: :gruebel: :gruebel:

100nF 4. Dez 2005 14:14

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
bin auch schon die längste zeit am rumprobieren, und ich komme immer näher ans ziel :bounce1:

dauert aber noch ein bisschen bis ich fertig bin...

etom291272 4. Dez 2005 14:40

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich habs siehe anlage code folgt :mrgreen:

100nF 4. Dez 2005 14:50

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
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?

etom291272 4. Dez 2005 14:53

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
die lösung war in der DP :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 :gruebel: :thumb:

etom291272 4. Dez 2005 14:58

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
kuckst du Hier rbControls
endlich ordentliche Schaltflächen ohne XP Manifest


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:43 Uhr.
Seite 1 von 4  1 23     Letzte »    

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