AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TCheckListBox, OwnerDraw zeichnet immer neu

Ein Thema von LeoDD · begonnen am 10. Okt 2008 · letzter Beitrag vom 13. Okt 2008
Antwort Antwort
LeoDD

Registriert seit: 30. Jul 2003
43 Beiträge
 
Delphi 2010 Professional
 
#1

TCheckListBox, OwnerDraw zeichnet immer neu

  Alt 10. Okt 2008, 10:56
Hallo ihr Delphigötter,

nach langem Suchen im Netz habe ich immer noch keine wirkliche Lösung für mein Problem gefunden. Daher frage ich hier mal direkt.

Ich verwende eine TCheckListbox mit dsOwnerDrawFixed. Ein Item wird mit dieser Routine gezeichnet:

Delphi-Quellcode:
procedure TASManForm.ListBox_ASDrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
{
  Zeichnen eines Items
}

var
  ASStruc: TTC7AutoStartStruc;
  ASPointer: PTC7AutoStartStruc;
  FileIcon: TBitmap;
  Text1, Text2, Text3: string; //für die dreizeilige Ausgabe
  TextRect: TRect;
begin

  ASPointer := AutoStarts.Items[Index];
  ASStruc := ASPointer^;

  with (Control as TCheckListBox) do begin

    Canvas.Brush.Color := clWhite;
    Canvas.FillRect(Rect);

    TextRect := Rect;
    TextRect.Left := Rect.Left + 50;

    case ASStruc.AutoStartDangerLevel of
      dlLow: Canvas.Brush.Color := Color_ASMan_DangerLow;
      dlMiddle: Canvas.Brush.Color := Color_ASMan_DangerMiddle;
      dlHigh: Canvas.Brush.Color := Color_ASMan_DangerHigh;
    end;
    Canvas.FillRect(TextRect);

    FileIcon := TBitmap.Create;

    case ASStruc.EntryType of

      asBinaryFile, asTextFile: begin

        if FileExists(ASStruc.FileData.FileName) then begin
          FileIcon := ConvertIconToBmp(GetIconFromFile(ASStruc.FileData.FileName, 0));
        end else begin
          FileIcon := BmpFromIcoFile(AppDir + Icon_ASMan_FileNotFound);
        end;

        Text1 := ExtractFileName(ASSTruc.FileData.FileName);
        Text2 := format(_asmanListTextFilePath, [IncludeTrailingPathDelimiter(ExtractFilePath(ASSTruc.FileData.FileName))]);
        Text3 := '';
        if ASStruc.EntryType = asBinaryFile then begin
          Text3 := _asmanListTextIsBinary;
        end else begin
          Text3 := format(_asmanListTextLineCount, [FormatThousands(ASSTruc.FileData.FileTextLineCount)]);
        end;
        Text3 := Text3 + ', ' + format(_asmanListTextSize, [FormatThousands(ASStruc.FileData.FileSize)]);
        if ASStruc.FileData.FileAttr and faHidden > 0 then begin
          Text3 := Text3 + ', ' + _asmanListTextHidden;
        end;

      end;


      asRegistryKey: begin
        FileIcon := BmpFromIcoFile(AppDir + Icon_ASMan_Reg);
      end;


      asRegistryValue: begin

        if ASStruc.RegData.ResultFile<>'then begin
          FileIcon := ConvertIconToBmp(GetIconFromFile(ASStruc.RegData.ResultFile, 0));
        end else begin
          FileIcon := BmpFromIcoFile(AppDir + Icon_ASMan_Reg);
        end;

        Text1 := ASStruc.RegData.Key;
        Text2 := format(_asmanListTextRegPfad, [ASStruc.RegData.MainKey, ASStruc.RegData.Path]);
        Text3 := format(_asmanListTextRegValue, [ASStruc.RegData.Value]);

      end;

    end; //case ASStruc.EntryType of

    //todo: nur für Debugzwecke!!!!
    Text3 := Text3 + ' (' + ASStruc.UniqueID + ')';

    Canvas.Draw(Rect.Left + 10, Rect.Top + 11, FileIcon);

    Canvas.Font.Color := clBlack;
    Canvas.Font.Size := 8;
    Canvas.Font.Style := [fsBold];
    Canvas.TextOut(Rect.Left + 55, Rect.Top + 7, Text1);

    Canvas.Font.Color := RGB($33, $33, $33);
    Canvas.Font.Size := 7;
    Canvas.Font.Style := [];
    Canvas.TextOut(Rect.Left + 65, Rect.Top + 26, Text2);

    Canvas.Font.Size := 7;
    Canvas.Font.Style := [];
    Canvas.TextOut(Rect.Left + 65, Rect.Top + 41, Text3);


  end;

  
end;
Das funktioniert auch sehr prächtig, allerdings habe ich ein Performanceproblem und denke, dass es mit "State: TOwnerDrawState" zu tun hat. Die Items sollen nur gezeichnet werden, wenn es nötig ist. Derzeit werden sie immer gemalt, auch wenn nur eine MessageBox drüberliegt und diese dann geschlossen wird. Das resultiert in einem unschönen Flackern z.B. beim Scrollen oder eben bei einer MessageBox.

Habt ihr eine Idee, wie ich die Routine dahingehend optimieren kann?

Danke schonmal voraus
Erst wenn man dreimal auf Holz klopfen will, stellt man fest, dass die Welt nur noch aus Plastik und Aluminium besteht.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: TCheckListBox, OwnerDraw zeichnet immer neu

  Alt 10. Okt 2008, 15:03
Hallo, vielleicht hilft BitBlt
Thomas
  Mit Zitat antworten Zitat
LeoDD

Registriert seit: 30. Jul 2003
43 Beiträge
 
Delphi 2010 Professional
 
#3

Re: TCheckListBox, OwnerDraw zeichnet immer neu

  Alt 10. Okt 2008, 15:42
Hm, muss ich mal probieren. Auf jeden Fall ist der Hinkefuß das Icon, was aus der Datei extrahiert wird. Diese Routinen dauern einfach zu lange.

Ich denke, ich muss da einen Cachemechanismus schaffen, damit das Icon vorgehalten wird und nicht jedesmal aufs Neue aus der Datei geholt wird.
Erst wenn man dreimal auf Holz klopfen will, stellt man fest, dass die Welt nur noch aus Plastik und Aluminium besteht.
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#4

Re: TCheckListBox, OwnerDraw zeichnet immer neu

  Alt 10. Okt 2008, 20:12
Nihm doch einfach ne ImageList und füg das Icon rein und überschreib den Index wieder wenn sich der eintrag ändert.
Damit musst du die Icxons nicht immer lesen
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.626 Beiträge
 
Delphi 12 Athens
 
#5

Re: TCheckListBox, OwnerDraw zeichnet immer neu

  Alt 10. Okt 2008, 20:14
Jepp. Und wenn die Icons nicht gleich groß sind, kann man sich zur Not mit einer TObjectList behelfen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
LeoDD

Registriert seit: 30. Jul 2003
43 Beiträge
 
Delphi 2010 Professional
 
#6

Re: TCheckListBox, OwnerDraw zeichnet immer neu

  Alt 13. Okt 2008, 09:43
Jup, ich nehm dafür eine TList und halte da die Icons vor
Erst wenn man dreimal auf Holz klopfen will, stellt man fest, dass die Welt nur noch aus Plastik und Aluminium besteht.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:15 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