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

Pseudemys Nelsoni 6. Aug 2005 22:43


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: http://www.nnscript.com/40teaser/new6/new5.png

?

tigerman33 7. Aug 2005 08:40

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:

Pseudemys Nelsoni 7. Aug 2005 10:05

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

xaromz 7. Aug 2005 10:14

Re: TreeView: Item komplett markieren?
 
Hallo,

OnCustomDrawItem scheint mir der richtige Ansatz zu sein.

Gruß
xaromz

Sharky 7. Aug 2005 10:19

Re: TreeView: Item komplett markieren?
 
Das Problem wird sicher sein das dann auch das "Stateimage [+]" überzeichnet wird. (zummindest ist es bei mir so).

xaromz 7. Aug 2005 10:58

Re: TreeView: Item komplett markieren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

also hiermit gehts:
Delphi-Quellcode:
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;
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.

Gruß
xaromz

Sharky 7. Aug 2005 11:07

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:

Pseudemys Nelsoni 7. Aug 2005 11:23

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?

xaromz 7. Aug 2005 11:29

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

Pseudemys Nelsoni 7. Aug 2005 11:49

Re: TreeView: Item komplett markieren?
 
Hm, das ist ja doof :( Borland halt....

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?

alzaimar 8. Aug 2005 18:16

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?

Sharky 8. Aug 2005 20:01

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?

Pseudemys Nelsoni 10. Aug 2005 23:27

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:

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

Wie kriege ich die gestrichelte Linie um "Pseudemys" weg? Das nervt natürlich :(

Pseudemys Nelsoni 12. Aug 2005 10:43

Re: TreeView: Item komplett markieren?
 
*sh33b*


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