Autor Beitrag
bruce185
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 283

winXP
D7 Ent
BeitragVerfasst: Do 10.11.11 12:58 
Hallo,
wenn ich versuche einen Rect in TListView SubItem zu zeichnen, dann wird die komplette fläche von z.B. SubItem = 3 gefüllt, was ich nicht möchte.

So hab ich es versucht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TfrmMain.ListeCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
  if SubItem = 3 then
  begin
    Liste.Canvas.Brush.Color := clRed;
    Liste.Canvas.Brush.Style := bsSolid;
    Liste.Canvas.FillRect(rect(00105));
  end
  else begin
    Liste.Canvas.Brush.Color := clWhite;
  end;
end;


Ich danke euch schonmal für die Hilfe.


Moderiert von user profile iconNarses: Topic aus Multimedia / Grafik verschoben am Do 10.11.2011 um 14:01
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: Do 10.11.11 14:05 
Ich weiss ja nicht genau, was du vorhast... aber:

Unter Umständen mag es dir helfen, nicht FillRect, sondern FrameRect zu verwenden.

Zum anderen mag es in deinem Interesse sein, den ursprünglichen Text wieder manuell zu zeichnen, da dieser (wenn ich mich richtig erinnere) in deinem Fall überschrieben (/-zeichnet) werden dürfte.

_________________
Delphi: XE - OS: Windows 7 Professional x64
bruce185 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 283

winXP
D7 Ent
BeitragVerfasst: Do 10.11.11 14:20 
Danke Dir.
Mit FrameRect funktioniert das auch nicht.
Ich möchte einfach ein Rechteck mit der breite von z.B. 10 Pixel in ListView Spalte nr 3 zeichnen, aber er füllt immer die komplette Spalte aus.
Ich denke wegen dieser Zeile:
ausblenden Delphi-Quelltext
1:
Liste.Canvas.Brush.Color := clRed;					


Das müsste ja irgendwie machbar sein, eine bestimmte breite von TRect in Spalte nr 3 in Farbe rot zu zeichnen.

Danke schonmal.

Edit: Ich hab es jetzt so gelöst:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  if subitem<>4 then begin
    DefaultDraw:=True;
    exit;
  end;
  DefaultDraw:=False;
  r:=item.DisplayRect(drBounds);
  for i:=0 to 3 do
   r.left:=r.left+Liste.Columns[i].Width;
  r.right:=r.left+Liste.Columns[4].Width-20;
  Liste.Canvas.Brush.color:=clGreen;
  Liste.canvas.FillRect(r);


Danke trotzdem für die Hilfe.


Zuletzt bearbeitet von bruce185 am Do 10.11.11 14:31, insgesamt 1-mal bearbeitet
Teekeks
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 211
Erhaltene Danke: 23



BeitragVerfasst: Do 10.11.11 14:30 
Was öfter mal hilft:
Die voreingestellte farbe merken, dann deine eigenen Sachen machen und danach die gemerkte Farbe wieder zurück stellen.
bruce185 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 283

winXP
D7 Ent
BeitragVerfasst: Do 10.11.11 14:34 
Ich habe das jetzt gelöst und oben mein Beitrag editiert wie ich es gelöst habe.

Ich danke dir trotzdem für die Hilfe.

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Hallo nochmal,
wenn ich jetzt mehrere Einträge in der ListView habe und über Repaint neu zeichne, dann Flackert die Liste extrem.
Ich habe versucht DoubleBuffered einzusetzen, leider hilft mir das auch nicht weiter.

Kann mir da Vielleicht jemand Weiterhelfen?

Danke schonmal.

Edit: Ich hab für die Form DoubleBuffered gesetzt gehabt, deshalb hat es für die Liste nicht funktioniert.
Damit funktioniert es jetzt:
ausblenden Delphi-Quelltext
1:
frmMain.Liste.DoubleBuffered := true;					


Gruss