Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

100nF 5. Dez 2005 18:39

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
Liste der Anhänge anzeigen (Anzahl: 1)
so, ich habe jetzt auch mal ein panel unter die listview gebaut, und jetzt funktionierts mit den farben.

ich habe den code noch etwas abgeändert:
Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  aTextRect:TRect; subitem: integer; backpanel: tpanel;
begin
  if tlistview(sender).Tag <> 1 then
  begin
    backpanel := tpanel.create(self);
    backpanel.Parent := tlistview(sender).Parent;
    backpanel.Name := 'BackPanel1';
    backpanel.Left := tlistview(sender).left;
    backpanel.Top := tlistview(sender).top;
    backpanel.Width := tlistview(sender).clientwidth;
    backpanel.Height := tlistview(sender).clientheight;
    backpanel.Visible := false;
    tlistview(sender).Tag := 1;
    backpanel.Color := $00CDEFE9;
  end
  else if (findcomponent('BackPanel1') is tpanel) then
    (findcomponent('BackPanel1') as tpanel).Color := $00CDEFE9;

  if (Item.Index=TListView(Sender).ItemIndex) or (TListView(Sender).ItemFocused=Item) or (Item.selected) then
  begin
    DefaultDraw:=false;
    aTextRect:=Item.DisplayRect(drLabel);
    with Sender do
    begin
      Canvas.Pen.Color := $00CDEFE9;
      Canvas.Brush.Color := $00CDEFE9;
      Canvas.Rectangle(aTextRect);
      aTextRect.Left:=aTextRect.Left+2;
      atextrect.Right := atextrect.Right+5;
      Windows.DrawText(Canvas.Handle, @Item.Caption[1], Length(Item.Caption), aTextRect, DT_VCENTER);
      Canvas.Brush.Color:=$008FC2B3;
      Canvas.FrameRect(aTextRect);
      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;
            aTextRect.Left:=aTextRect.Left+6;
            atextrect.Right := atextrect.Right+5  ;
            Canvas.Rectangle(aTextRect);
            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;
das panel wird also zur laufzeit erstellt.

ein kleiner schönheitsfehler gibts aber noch, siehe bild im anhang.

etom291272 5. Dez 2005 21:27

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
warum machst du die eigenen grafiken breiter als die spalten (rect.right:=rect.right+5) ist doch nicht notwendig lass lieber die subitems weiter links anfangen

hast schon mit state dshot experimentiert da kann man starken hottrack bauen.

:coder2:

100nF 6. Dez 2005 21:07

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
naja, wenn ich das +5 nicht reinsetzt, gibts ein spalt von 5 pixel und der gefällt mir nicht. aber ich kann mir einfach nicht erklären, dass der rahmen die richtige breite hat, aber nicht ganz ausgefüllt ist :gruebel:

das mit dem hottrack werde ich noch ausprobieren.

etom291272 7. Dez 2005 09:09

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
:warn: da sticht mir doch gleich was ins auge
Delphi-Quellcode:
 with Sender do
    begin
      Canvas.Pen.Color := $00CDEFE9;
      Canvas.Brush.Color := $00CDEFE9;
      Canvas.Rectangle(aTextRect);//<- das zeichnet den hintergrund hellgrün
      aTextRect.Left:=aTextRect.Left+2;
      atextrect.Right := atextrect.Right+5;//<- hier dann + 5
      Windows.DrawText(Canvas.Handle, @Item.Caption[1], Length(Item.Caption), aTextRect, DT_VCENTER);
      Canvas.Brush.Color:=$008FC2B3;
      Canvas.FrameRect(aTextRect);//<- das zeichnet nur dunkelgrünen rand
      for SubItem:=1 to Item.SubItems.Count do
:chat: :hi:

100nF 7. Dez 2005 17:07

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
ups, ein ganz dummer fehler :oops:

danke, jetzt funktionierts wunderbar :mrgreen:

zum state = dshot:
das kann ja gar nicht funktionieren, weil ja das onCustomDrawItem gar nicht ausgelöst wird wenn man mit der maus über die listview fährt.
ich habe dann mal
Delphi-Quellcode:
if state = [cdshot] then showmessage('dshot');
ins onCustomDrawItem gebaut, kam aber nie eine showmessage.

ach ja, kann man auch den rahmen-strich unten oder/und oben weglassen?
also dass das item nur:
links und rechts,
links, oben und rechts,
oder links, unten und rechts
...umrahmt wird?
wenn nämlich mehrere items nacheinander markiert sind, wäre es schöner wenn zrischendrin keine querstriche sind.

etom291272 8. Dez 2005 10:35

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
Liste der Anhänge anzeigen (Anzahl: 4)
:twisted: stimmt nicht kuckst du hier (Anlage) du musst eine property in der listview setzen

hab den code jetzt perfektioniert das rechteck läuft ohne füllung mit der Maus mit :cyclops:

100nF 8. Dez 2005 11:35

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
ich vermute, dass bei mir der fehler bei
Delphi-Quellcode:
if state = [cdshot] then
war, ich hätte
Delphi-Quellcode:
if (cdshot) in state then
verwenden müssen.

weiss niemand wie man bei einem item den unteren oder den oberen rand weglassen kann?

gruss
urbanbruhin

etom291272 8. Dez 2005 12:10

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
hatte ich vorher vergessen

da wir ja die koordinaten des rechteckes haben kannst du in diese canvas zeichnen was du lustig bist
wenn z.b die Markierung so aussehen soll │Listview Caption │ brauchst du ja nur 2 linien zu malen von
links oben nach links unten und ...

100nF 8. Dez 2005 15:08

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
also ich habe da mal rumprobiert, jedoch schaffe ich es einfach nicht, eine linie zu zeichnen :wall:

ich habe mal diesen code:
Delphi-Quellcode:
Canvas.FrameRect(aTextRect);
...durch diesen ersetzt:
Delphi-Quellcode:
canvas.MoveTo(atextrect.Left, atextrect.top);
canvas.LineTo(atextrect.right, atextrect.top);
klappt aber nicht :gruebel:

etom291272 8. Dez 2005 16:13

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
Liste der Anhänge anzeigen (Anzahl: 1)
:shock: wieso funktioniert doch (Anlage)
Delphi-Quellcode:
if TListView(Sender).ViewStyle=vsIcon then
      begin
        Windows.DrawText(Canvas.Handle, @Item.Caption[1], Length(Item.Caption),
                         aTextRect, DT_EDITCONTROL+DT_CENTER+DT_WORDBREAK);

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

        Canvas.Pen.Color := clred;
        canvas.MoveTo(atextrect.Left, atextrect.top);
        canvas.LineTo(atextrect.right, atextrect.top);

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:02 Uhr.
Seite 3 von 4     123 4      

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