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 OnAdvancedCustomDrawSubitem ändert nachfolgende Spalten (https://www.delphipraxis.net/68486-onadvancedcustomdrawsubitem-aendert-nachfolgende-spalten.html)

tigerman33 30. Apr 2006 14:32


OnAdvancedCustomDrawSubitem ändert nachfolgende Spalten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich male in meiner (virtuellen) ListView, ViewStyle = vsReport, mit folgendem Code Sterne in eine meiner Spalten:
Delphi-Quellcode:
procedure TfrmMain.lvTasksAdvancedCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var Task: TTask;
    Rect: TRect;
    i: integer;
begin
  if Stage = cdPostPaint then
    if SubItem = 2 then begin
      Task := Item.Data;

      // Obtain column rectangle for this item:
      Rect := Item.DisplayRect(drBounds);
      for i := 0 to SubItem - 1 do
        Rect.Left := Rect.Left + Sender.Column[i].Width;
      Rect.Right := Rect.Left + Sender.Column[SubItem].Width;

      for i := ord(low(TTaskPriority)) to ord(Task.Priority) do begin
        Sender.Canvas.Draw(Rect.Left,Rect.Top,FStarBitmap);
        Rect.Left := Rect.Left + FStarBitmap.Width;
      end;
    end;
end;
Das funktioniert auch prima. Nur wird jetzt plötzlich die Schrift in der Spalte rechts davon in einer anderen Schrift dargestellt. Scheint nur eine neue Schriftgröße zu sein.

Das seltsame daran: Beim Auswerten des Sender.Canvas.Font-Objekts werden mir die ganz normalen Werte angezeigt, und sogar eine Neuzuweisung der Schriftgröße bringt mir die vorgesehene Schriftart nicht wieder zurück! :evil:
Das Problem tritt auf, sobald irgendeine Zeichenoperation mit dem Canvas durchgeführt wird.

Kennt jemand das Problem, und weiß vielleicht sogar eine Lösung? Schaut mir doch sehr nach einem Bug in Delphi aus!

ErazerZ 30. Apr 2006 15:04

Re: OnAdvancedCustomDrawSubitem ändert nachfolgende Spalten
 
hey, also mir ist das problem nur einmal aufgefallen, da ich normaler weiße die images in der letzten spalte zeichne

naja ne lösung wäre ne andere schriftart zu benutzen anstatt die die du im Object Inspector eingestellt hast, zb. du hast MS Sans Serif eingestellt als font im ListView, dann schreibst im code zb "Font.Name := 'Arial'"
Delphi-Quellcode:
// ist nur ein beispiel code ..
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var
  B: TBitmap;
begin
  if SubItem = 1 then
  begin
    DefaultDraw := False;
    B := TBitmap.Create;
    ImageList1.GetBitmap(0, B);
    ListView1.Canvas.Draw(ListView1.Column[0].Width, Item.Top, b);
    B.Free;
  end else
  begin
    DefaultDraw := True;
    Sender.Canvas.Font.Name := 'Arial';
  end;
end;

// und hier auch nochmal die Font Ändern da sonst .Caption auch die font ändert .. :O
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  Sender.Canvas.Font.Name := 'Arial';
end;
ich weiß es ist nicht die beste lösung ist aber ich glaube auch das es ein problem von Delphi ist

cya, ErazerZ

tigerman33 30. Apr 2006 15:50

Re: OnAdvancedCustomDrawSubitem ändert nachfolgende Spalten
 
Tatsächlich, so funktioniert es. Aber auch nur, wenn ich den String als Konstante angebe. Zuweisungen à la
Delphi-Quellcode:
Sender.Canvas.Font := frmMain.Font;
Sender.Canvas.Font := (Sender as TListView).Font;
etc. produzieren nach wie vor den Fehler, genauso wie die Zuweisung (im OI) ParentFont := true :shock:

Sehr, sehr, sehr mysteriös!
Aber trotzdem ein großes Dankeschön an ErazerZ! :thumb:

kaiser1401 18. Mai 2006 14:02

Re: OnAdvancedCustomDrawSubitem ändert nachfolgende Spalten
 
Es geht auch wenn man zuvor den Font ausliest ihn ändert und wieder zurückschreibt. man muss dann nur aufpassen das der font den man zwischendurch setzt ein anderer ist (am besten einen der quasi nie gebraucht wird z.B. Symbol)

Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var f : string;
begin
f:=sender.Canvas.Font.Name;
sender.Canvas.Font.Name:='Symbol';
sender.Canvas.Font.Name:=f;
if ....


end;
dann kann man sich auch das wechseln für die captions sparen.


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