Delphi-PRAXiS

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

100nF 4. Dez 2005 15:04

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

die lösung war in der DP
ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @aTextRect);
soweit kam ich auch schon.

das resultat von deinem und meinem code war das gleiche, allerdings nicht das gleiche wie auf deinem screenshot :gruebel:

also dein screenshot sieht schon schöner aus als meiner :mrgreen:

was ist das problem?

ach ja, danke für den link (button) :angel:
aber könntest du noch den direktlink posten, ich weiss nicht recht was ich da genau downloaden muss...
EDIT: habs gefunden :stupid:

etom291272 4. Dez 2005 15:09

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
das kommt raus wenn sich die defaultdraw gegenseitig stören darum habe ich allen code nur im drawitem und zeichne dort die items und alle subitems

Zitat:

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

100nF 4. Dez 2005 15:20

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
und was müsste ich jetzt tun?

ach ja, wegen den rbControls:
sieht aus als würde es nicht für delphi 7 gehen, oder soll ich mal die package für D6 öffnen?

etom291272 4. Dez 2005 15:55

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
rb controls gehen super über delphi7 (hab delphi7)

du musst allen zeichencode im oncustomdrawiten und nicht subitem haben

wenn das nicht hilft poste mal code

100nF 4. Dez 2005 16:25

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
also ich habe alles im oncustomdrawitem, hier der code:
Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  aTextRect, aIconRect: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);

    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);

      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+2;
            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;

etom291272 4. Dez 2005 17:15

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
Liste der Anhänge anzeigen (Anzahl: 1)
:?: :?: :?: :?: :?: :?: :?: :?: bahnhof

ich hab den code den du gepostet hast mit copy und paste eingefügt und dass kam dabei raus (anlage)
shick mal nen kompletten screenshot vielleich sehe ich dann was (1024x768)

100nF 4. Dez 2005 18:18

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
Liste der Anhänge anzeigen (Anzahl: 1)
also ich habe jetzt mal ein neues projekt gemacht, eine listview auf die form plaziert, und diese eigenschaften verändert:
  • columns hinzugefügt
  • items hinzugefügt
  • multiselect auf true gestellt
  • readonly auf true gestellt
  • rowselect auf true gestellt
  • viewstyle auf vsreport gestellt
dann habe ich beim code noch das image-zeugs entfernt, und so sieht er jetzt aus:
Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  aTextRect:TRect; subitem: integer;
begin
  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;
      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+2;
            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;
ergebnis: siehe anhang.
mach doch auch mal ein leeres projekt auf, und ändere die selben eigenschaften wie ich. dann fügst du genau den selben code rein und schaust was rauskommt.
vielleicht ist in deinem projekt noch mehr code drin, der irgendwas an der listview verändert, oder es ist irgend eine eigenschaft anders eingestellt als bei mir.

etom291272 4. Dez 2005 19:14

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
der grund ist rowselect gehört auf false das zeichnen der markierungen machen wir ja selber

100nF 4. Dez 2005 19:53

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
Liste der Anhänge anzeigen (Anzahl: 1)
habe jetzt rowselect auf false gestellt, funzt aber immernoch nicht.

ich hänge mal mein test-projekt an, kannst es ja mal anschauen.

etom291272 4. Dez 2005 20:24

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
Liste der Anhänge anzeigen (Anzahl: 2)
habs gefunden aber dass versteh einer wenn einmal ein echter guru diesen beitrag lest mich würde brennend interessieren warum sich das so verhält.

bei mir gings weil ich ein panel mit der selben farbe darunter habe als die helle markierung in der listview

hab dein projekt angehängt mit dem notwendigen panel und einen shot wies bei mir jetzt aussieht

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);

100nF 8. Dez 2005 18:41

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
probiers mal an einer listview mit viewstyle = vsReport, da hats bei mir nicht funktioniert...

ach ja, ich habe grad rausgefunden, dass wenn es ein & in der listview hat (in einem item) wird dieses gelöscht wenn diese zeile markiert wird.
muss irgendwie am drawtext liegen.
kann man das ändern oder nicht?

etom291272 8. Dez 2005 19:31

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
bei mir gings bei beiden viewstyles

100nF 8. Dez 2005 21:01

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
Liste der Anhänge anzeigen (Anzahl: 2)
ups, ich glaube ich habe den rahmen mit der gleichen farbe wie der hintergrund gezeichnet :shock:

nun habe ich aber noch ein problem...
ich habe es zuerst so gemacht:
wenn das vorherige item markiert ist, soll der obere rahmen nicht gezeichnet werden,
und wenn das untere item markiert ist, soll der untere rahmen nicht gezeichnet werden.
wenn aber die items nacheinander von oben nach unten oder von unten nach oben markiert werden, wird logischerweise immer der untere oder der obere rahmen gezeichnet, und im endeffekt sieht man dann die horizontalen rahmen-linien trotzdem.

dann hatte ich eine andere idee:
wenn das vorherige item markiert ist, soll der untere rahmen vom vorherigen item mit der hintergrundfarbe übermalt werden. klappte aber irgendwie auch nicht, hier der code:
Delphi-Quellcode:
if item.Index > 0 then
  if tlistview(sender).Items.Item[item.Index-1].Selected = true then
  begin
    aVorherRect := tlistview(sender).Items.Item[item.index-1].DisplayRect(drLabel);
    Canvas.Pen.Color := listviewItemBackColor;
    Canvas.Brush.Color := listviewItemBackColor;
    aVorherRect.Left:=aVorherRect.Left+2;
    aVorherRect.Right := aVorherRect.Right+6;
    canvas.MoveTo(aVorherRect.right, aVorherRect.bottom);
    canvas.LineTo(aVorherRect.left, aVorherRect.bottom);
  end;
EDIT: ich habe jetzt herausgefunden, dass wenn man mehrere items mit der maus markiert (also so ein gestricheltes viereck zieht), dass die eigenschaft selected der markierten items erst true wird, wenn die maus losgelassen wird. so funktioniert mein code natürlich auch nicht...
aber wenn man mehrere items mit der Shift-taste markiert, funktionierts wunderbar (siehe anhang)

etom291272 9. Dez 2005 21:19

Re: Lösung TListview eigene Farbe andere Icons für Aktive It
 
:-D na ja die geschmäcker sind verschieden (gott sei dank) ich fand den effekt das bei multiselect alle items gerahmt werden ziemlich cool ist mal was anderes

:gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 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