Delphi-PRAXiS
Seite 2 von 3     12 3      

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 TreeView: Item komplett markieren? (https://www.delphipraxis.net/51143-treeview-item-komplett-markieren.html)

Flocke 7. Aug 2005 11:55

Re: TreeView: Item komplett markieren?
 
Zitat:

Zitat von Pseudemys Nelsoni
Moin,

danke euch Zwei. Ich würde gerne das Beispiel von xaromz verwenden (weil keine Extragrafiken), nur stört mich das mit dem Font schon, ich wollte Tahoma? <g> Kann man das irgendwie noch hinkriegen?

Probier mal vor der Ausgabe (in OnCustomDrawItem) (aus dem Kopf, nicht ausprobiert)
Delphi-Quellcode:
Sender.Canvas.Font.Assign(Sender.Font);

Pseudemys Nelsoni 7. Aug 2005 12:03

Re: TreeView: Item komplett markieren?
 
Moin Flocke,

soweit bin ich (Dank der anderen Leute) schon gewesen, aber die Schriftart aendert sich gleichzeitig mit :(

Pseudemys Nelsoni 8. Aug 2005 14:39

Re: TreeView: Item komplett markieren?
 
*schieb*

Flocke 8. Aug 2005 15:56

Re: TreeView: Item komplett markieren?
 
Das FillRect stört die VCL gar nicht, es werden Veränderungen am Brush und am Font protokolliert.

Probier mal die markierte Zeile einzufügen (ungetestet, wär allerdings ein ziemlich dreckiger Trick...)
Delphi-Quellcode:
procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  NodeRect: TRect;
begin
  NodeRect := Node.DisplayRect(False);

  Sender.Canvas.Brush.OnChange := nil; //<--- HIER

  if cdsSelected in State then
    Sender.Canvas.Brush.Color := clLime
  else
    Sender.Canvas.Brush.Color := TTreeView(Sender).Color;

  Sender.Canvas.FillRect(NodeRect);

  DefaultDraw := True;
end;
Alternativ zeichne den Hintergrund mit dem Windows-API (ebenfalls ungetestet):
Delphi-Quellcode:
var
  hbr: THandle;
begin
  ...
  if cdsSelected in State then
    hbr := Windows.CreateSolidBrush(ColorToRGB(clLime));
  else
    hbr := Windows.CreateSolidBrush(ColorToRGB(TTreeView(Sender).Color));
  if hbr = 0 then
    RaiseLastWin32Error;
  try
    Windows.FillRect(Canvas.Handle, NodeRect, hbr);
  finally
    Windows.DeleteObject(hbr);
  end;
  ...
end;

tigerman33 8. Aug 2005 16:08

Re: TreeView: Item komplett markieren?
 
Ich hatte ein ganz ähnliches (naja eigentlich das gleiche Problem mit einem TListView, das ich in CustomDrawItem zeichnete. Das löste sich ganz urplötzlich in Wohlgefallen auf als ich statt CustomDrawItem AdvancedCustomDrawItem benutzte.

Zitat:

Zitat von xaromz
Ich tippe auf nen Bug.

Ich auch. :wall:

Pseudemys Nelsoni 8. Aug 2005 16:22

Re: TreeView: Item komplett markieren?
 
Moin Flocke,

ich habe beide Beispiele ausprobiert (Danke dafür übrigens ;)).

Ohne die Beispiele hat sich das ganze so verhalten: Die Schrift der Items war falsch(fett usw) bis auf das aktuelle markierte Item - das war richtig dargstellt bis es die Markierung verliert.

Nach Beispiel1 war es so, das die Items alle Fett waren - auch das markierte.

Nach Beispiel2 waren auch alle Fett und der grüne Hintergrund für das Item war wieder im Standardblau :(

Ich werd auch nicht so schlau draus WO genau da der Bug ist :\


@Tigerman: Das Problem beim TreeView ist, das bei "OnAdvanedDrawItem" die Grafiken nicht gezeichnet werden, bzw mein Hintergrund überdeckt die :(. das "[+]" der Bäume fehlt dann z.B

Flocke 8. Aug 2005 17:37

Re: TreeView: Item komplett markieren?
 
Zitat:

Zitat von Pseudemys Nelsoni
@Tigerman: Das Problem beim TreeView ist, das bei "OnAdvanedDrawItem" die Grafiken nicht gezeichnet werden, bzw mein Hintergrund überdeckt die :(. das "[+]" der Bäume fehlt dann z.B

Du musst bei OnAdvancedDrawItem natürlich den zusätzlichen Parameter auswerten und nicht immer zeichnen!

Pseudemys Nelsoni 8. Aug 2005 17:45

Re: TreeView: Item komplett markieren?
 
Moin Flocke,

ich habe es so probiert:

Delphi-Quellcode:
procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
  var PaintImages, DefaultDraw: Boolean);
begin
  with TreeView1.Canvas do
  begin
    if cdsSelected in State then
    begin
      Brush.Color := clBlack;
      Font.Color := clWhite;
    end else
    begin
      Brush.Color := clWhite;
      Font.Color := clBlack;
    end;
    FillRect(Node.DisplayRect(false));
  end;
  Stage := cdPrePaint;
  PaintImages := True;
  DefaultDraw := True;
end;
Die [+] sowie die Beschriftung der Items sind nicht zu sehen, nur die schwarze Markierung auf weiss ist dort.

Ist hier etwas falsch?

Flocke 8. Aug 2005 18:04

Re: TreeView: Item komplett markieren?
 
Du darfst an Stage nichts zuweisen sondern musst es auswerten!
Delphi-Quellcode:
procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
  var PaintImages, DefaultDraw: Boolean);
begin
  if Stage = cdPrePaint then
    with TreeView1.Canvas do
    begin
      if cdsSelected in State then
      begin
        Brush.Color := clBlack;
        Font.Color := clWhite;
      end else
      begin
        Brush.Color := clWhite;
        Font.Color := clBlack;
      end;
      FillRect(Node.DisplayRect(false));
    end;

  // Bei den beiden bin ich mir nicht sicher, ob sie noch in das erste IF gehören
  PaintImages := True;
  DefaultDraw := True;
end;

Pseudemys Nelsoni 8. Aug 2005 18:11

Re: TreeView: Item komplett markieren?
 
Ahhhhh, es klappt!!! Hab gar nicht gesehen das "Stage" _kein_ var-parameter ist :oops:

Danke @tigerman für die Idee mit diesem Event

Danke @Flocke für die intensive Hilfe :)

Eine letzt Frage dazu nurnoch und zwar, wieso sieht es ohne XP-Manifest so aus:

http://www.pixelbytes.net/nm.JPG

und mit so wie es soll:

http://www.pixelbytes.net/m.JPG

?

Dann sehen Win2kuser usw es nicht richtig oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:13 Uhr.
Seite 2 von 3     12 3      

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