Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Icon auf Canvas im SubItem zeichnen mit Hintergrundfarbe (https://www.delphipraxis.net/168778-icon-auf-canvas-im-subitem-zeichnen-mit-hintergrundfarbe.html)

RWarnecke 10. Jun 2012 18:49


Icon auf Canvas im SubItem zeichnen mit Hintergrundfarbe
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

mit der Procedure zeichne ich in einer TAdvListView ein bestimmtes Icon in die 8.Spalte. Das funktioniert auch soweit.
Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
///
///  [Orginal : http://www.delphipraxis.net/1115406-post3.html]
///
procedure TMainForm.AdvLV_OverviewListCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var
  aRect: TRect;
  aIcon: TIcon;
begin
  if (SubItem = 7) and (AdvToolBarPg_Main.ActivePageIndex = 1) then
  begin
    aIcon:= TIcon.Create;
    try
      DefaultDraw:= False;
      ListView_GetSubItemRect(Sender.Handle,Item.Index,SubItem,LVIR_BOUNDS,@aRect);
      if (TRechnung(RechnungsListe.Items[Item.Index]).Verschickt) and (not TRechnung(RechnungsListe.Items[Item.Index]).Bezahlt) then
        ImgL_SmallImages.GetIcon(11, aIcon)
      else
        if (TRechnung(RechnungsListe.Items[Item.Index]).Verschickt) and (TRechnung(RechnungsListe.Items[Item.Index]).Bezahlt) then
          ImgL_SmallImages.GetIcon(10, aIcon)
        else
          ImgL_SmallImages.GetIcon(12, aIcon);
      Sender.Canvas.Brush.Style := bsDiagCross;
      if Odd(Item.Index) then
        SetBkColor(Sender.Canvas.Handle, ColorToRgb(cl3DLight))
      else
        SetBkColor(Sender.Canvas.Handle, ColorToRgb(clWhite));
      Sender.Canvas.FillRect(aRect);
      Sender.Canvas.Draw(aRect.Left + ((aRect.Right - aRect.Left - aIcon.Width) div 2), aRect.Top, aIcon);
    finally
      aIcon.Free;
    end;
  end;
end;
Meine beiden Probleme seht Ihr in dem angehängten Bild. Ich möchte gerne jede zweite Zeile grau haben und dann jeweils nach Bedingung die entsprechenden Icons. Leider sieht bei mit das grau wie ein Muster aus und ist nicht als durchgängige Farbe. Das zweite Problem, was ich habe ist der Cursorbalken, der in der letzten Spalte nur noch den Rahmen zeigt.

Was muss ich an meinem obenstehenden Quelltext ändern, damit ich die Probleme weg bekomme ?

Bei den anderen Spalten benutze ich die folgende Procedure um jede zweite Zeile grau zu bekommen :
Delphi-Quellcode:
procedure TMainForm.AdvLV_OverviewListCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  if Odd(Item.Index) then
    Sender.Canvas.Brush.Color := cl3DLight
  else
    Sender.Canvas.Brush.Color := clWhite;
end;
Kann es sein, dass sich hier etwas nicht verträgt ? Wenn ja, was ?

Bummi 10. Jun 2012 19:14

AW: Icon auf Canvas im SubItem zeichnen mit Hintergrundfarbe
 
ich verwende kein ADV... und das Bild scheint zu fehlen, im Code fällt folgendes auf


Zitat:

Leider sieht bei mit das grau wie ein Muster aus und ist nicht als durchgängige Farbe
Delphi-Quellcode:
Sender.Canvas.Brush.Style := bsDiagCross;

RWarnecke 10. Jun 2012 19:22

AW: Icon auf Canvas im SubItem zeichnen mit Hintergrundfarbe
 
Zitat:

Zitat von Bummi (Beitrag 1170223)
Zitat:

Leider sieht bei mit das grau wie ein Muster aus und ist nicht als durchgängige Farbe
Delphi-Quellcode:
Sender.Canvas.Brush.Style := bsDiagCross;

Der Style ist doch auf bsDiagCross gesetzt.

Bummi 10. Jun 2012 19:26

AW: Icon auf Canvas im SubItem zeichnen mit Hintergrundfarbe
 
dann verstehe ich Dich nicht ...
eine durchgängige Farbe würde ich bei bsSolid erwarten

RWarnecke 10. Jun 2012 19:35

AW: Icon auf Canvas im SubItem zeichnen mit Hintergrundfarbe
 
Zitat:

Zitat von Bummi (Beitrag 1170226)
dann verstehe ich Dich nicht ...
eine durchgängige Farbe würde ich bei bsSolid erwarten

Sorry, ich habe den Anhang vergessen und jetzt im ersten Beitrag angehängt. Dieses Bild zeigt das Problem.

Sir Rufo 10. Jun 2012 23:36

AW: Icon auf Canvas im SubItem zeichnen mit Hintergrundfarbe
 
Zitat:

Zitat von RWarnecke (Beitrag 1170222)
Leider sieht bei mit das grau wie ein Muster aus und ist nicht als durchgängige Farbe.
Delphi-Quellcode:
Sender.Canvas.Brush.Style := bsDiagCross;

Was erwartest du, wenn du dem System mitteilst: "Mach ma so diagonale Kreuze als Muster da mit rein"? :wink:

Änder das mal - wie Bummi schon versucht hat dir mitzuteilen - auf bsSolid ab.

Und dann sagst du dem System auch noch, dass in der Spalte mit dem Icon kein DefaultDraw gemacht werden soll. Ok, aber wann und wo zeichnet das System wohl diesen CursorBalken? Im DefaultDraw? :wink:

RWarnecke 11. Jun 2012 03:21

AW: Icon auf Canvas im SubItem zeichnen mit Hintergrundfarbe
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Sir Rufo,

dann hatte ich Bummi mit dem bsSolid falsch verstanden. Habe den Style jetzt mal mit bsSolid probiert und den Wert DefaultDraw auf True gesetzt. Dann bekomme ich das Ergebnis aus dem Anhang. Ich bekomme jetzt nur das Icon angezeigt, wenn der Eintrag in der Listview auch markiert ist. Selbst dann wird der blaue Markierungbalken nicht durchgängig gezeichnet. Das zweite Problem was auftritt ist, dass beim runterscrollen des blauen Balkens die Einträge in den anderen Spalten mit einem schwarzen Kasten dargestellt werden (s. Anhang).

Sir Rufo 11. Jun 2012 05:39

AW: Icon auf Canvas im SubItem zeichnen mit Hintergrundfarbe
 
Das waren ja auch nur die direkten Antworten auf die Fragen warum das so ist :wink:

Du musst halt auch auswerten ob die aktuelle Zeile/Zelle ausgewählt ist und darauf in deinem OnPaint reagieren.

Ein Beispiel findest du hier http://www.delphipraxis.net/1128926-post35.html

RWarnecke 11. Jun 2012 06:08

AW: Icon auf Canvas im SubItem zeichnen mit Hintergrundfarbe
 
Zitat:

Zitat von Sir Rufo (Beitrag 1170249)
Das waren ja auch nur die direkten Antworten auf die Fragen warum das so ist :wink:

Ich habe ja auch nur versucht Deine Hinweise entsprechend umzusetzen in verschiedenen Kombinationen. Leider hat aber keine der Kombinationen zum Erfolg geführt.


Zitat:

Zitat von Sir Rufo (Beitrag 1170249)
Du musst halt auch auswerten ob die aktuelle Zeile/Zelle ausgewählt ist und darauf in deinem OnPaint reagieren.

Ein Beispiel findest du hier http://www.delphipraxis.net/1128926-post35.html

Das Beispiel ist aus meiner Sicht doch nicht vergleichbar. Ich benutze die TAdvListview und nicht ein Grid. Ich verstehe noch nicht, wie mir das weiterhelfen soll.

Sir Rufo 11. Jun 2012 11:26

AW: Icon auf Canvas im SubItem zeichnen mit Hintergrundfarbe
 
Weil das AdvGrid ähnlich tickt wie das normale Grid. Auch dort gibt es eine DefaultPaint Methode.
Und wenn du eine Zeile gemalt haben möchtest, so wie die default gezeichnt wird, dann musst du dieses eben komplett selber implementieren oder eben geschickt übrgeben.

Das Beispiel von mir zeigt dir, wie das beim normalen Grid geht.

Beim AdvGrid kann ich nicht direkt weiterhelfen, da ich mich von den TMS vor einiger Zeit verabschiedet habe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 Uhr.
Seite 1 von 2  1 2      

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