![]() |
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:
das panel wird also zur laufzeit erstellt.
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; ein kleiner schönheitsfehler gibts aber noch, siehe bild im anhang. |
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: |
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. |
Re: Lösung TListview eigene Farbe andere Icons für Aktive It
:warn: da sticht mir doch gleich was ins auge
Delphi-Quellcode:
:chat: :hi:
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 |
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:
ins onCustomDrawItem gebaut, kam aber nie eine showmessage.
if state = [cdshot] then showmessage('dshot');
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. |
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: |
Re: Lösung TListview eigene Farbe andere Icons für Aktive It
ich vermute, dass bei mir der fehler bei
Delphi-Quellcode:
war, ich hätte
if state = [cdshot] then
Delphi-Quellcode:
verwenden müssen.
if (cdshot) in state then
weiss niemand wie man bei einem item den unteren oder den oberen rand weglassen kann? gruss urbanbruhin |
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 ... |
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:
...durch diesen ersetzt:
Canvas.FrameRect(aTextRect);
Delphi-Quellcode:
klappt aber nicht :gruebel:
canvas.MoveTo(atextrect.Left, atextrect.top);
canvas.LineTo(atextrect.right, atextrect.top); |
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 01:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz