![]() |
TreeView: Item komplett markieren?
Moin,
ich habe eine Frage und zwar, wie kann ich ein Item eines treeviews komplett, d.h nicht nur die schrift selektieren? So wie da: ![]() ? |
Re: TreeView: Item komplett markieren?
Kann es im Moment nicht abchecken, aber hat TTreeView nicht wie TListView die Möglichkeit, mit OwnerDraw selbst das Zeichnen der Einträge zu übernehmen?
Dann könntest du ja über den Canvas des TreeViews einfach ein FillRect machen. :coder: |
Re: TreeView: Item komplett markieren?
Moin,
ne hat sie nicht, ich hab sowas mit Zeichnen noch nie gemacht :oops: . Hoffe jemand kann mir erklären wie idch da mit Canvas(?) male |
Re: TreeView: Item komplett markieren?
Hallo,
OnCustomDrawItem scheint mir der richtige Ansatz zu sein. Gruß xaromz |
Re: TreeView: Item komplett markieren?
Das Problem wird sicher sein das dann auch das "Stateimage [+]" überzeichnet wird. (zummindest ist es bei mir so).
|
Re: TreeView: Item komplett markieren?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
also hiermit gehts:
Delphi-Quellcode:
Das einzige Problem: Sobald man auf das Handle des Canvas zugreift (z. B. über FillRect) wird die Schrift verstellt :gruebel: , aber nur bei nicht markierten Nodes. Keine Ahnung warum oder wie man das verhindert. Siehe dazu das Bild.
procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); var NodeRect: TRect; begin NodeRect := Node.DisplayRect(False); 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; Gruß xaromz |
Re: TreeView: Item komplett markieren?
Liste der Anhänge anzeigen (Anzahl: 4)
Hai xaromz,
so hatte ich es auch versucht. Dabei ist aber das wie im Anhang rausgekommen. (Bild2 und Bild3). Darum habe ich es etwas "koplizierter" gemacht. Es sieht dann so aus wie Bild1. Edit: Habe das Projekt vergessen :oops: |
Re: TreeView: Item komplett markieren?
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? |
Re: TreeView: Item komplett markieren?
Hallo,
was das mit dem Font soll weiss ich leider auch nicht. Ich tippe auf nen Bug. @Sharky: Die Unterschiede gibt's wohl, weil ich Delphi 7 verwende und Du Delphi 2005. Gruß xaromz |
Re: TreeView: Item komplett markieren?
Hm, das ist ja doof :( Borland halt....
|
Re: TreeView: Item komplett markieren?
Zitat:
Delphi-Quellcode:
Sender.Canvas.Font.Assign(Sender.Font);
|
Re: TreeView: Item komplett markieren?
Moin Flocke,
soweit bin ich (Dank der anderen Leute) schon gewesen, aber die Schriftart aendert sich gleichzeitig mit :( |
Re: TreeView: Item komplett markieren?
*schieb*
|
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:
Alternativ zeichne den Hintergrund mit dem Windows-API (ebenfalls ungetestet):
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;
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; |
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:
|
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 |
Re: TreeView: Item komplett markieren?
Zitat:
|
Re: TreeView: Item komplett markieren?
Moin Flocke,
ich habe es so probiert:
Delphi-Quellcode:
Die [+] sowie die Beschriftung der Items sind nicht zu sehen, nur die schwarze Markierung auf weiss ist dort.
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; Ist hier etwas falsch? |
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; |
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: ![]() und mit so wie es soll: ![]() ? Dann sehen Win2kuser usw es nicht richtig oder? |
Re: TreeView: Item komplett markieren?
TTreeView ist nur ein Wrapper für die MS-Komponente, insofern sollte der Bug eher in Redmond zu suchen sein, oder?
|
Re: TreeView: Item komplett markieren?
Hai,
eines verstehe ich nicht.... was ist denn an der Lösung von mir so falsch? Die geht doch ohne Problem. Interesant wäre jetzt nur noch dir Frage ob man die notwendigen Grafiken ([+] [-] I-) aus dem OS bekommen kann? |
Re: TreeView: Item komplett markieren?
Moin Sharky,
an deinem Beispiel war nichts falsch ;) Aber ich hätte die Grafiken +/- auch lieber vom OS (ka wo die liegen), da ich sie nicht extra beipacken wollte ;) Btw: ![]() Wie kriege ich die gestrichelte Linie um "Pseudemys" weg? Das nervt natürlich :( |
Re: TreeView: Item komplett markieren?
*sh33b*
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:46 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