Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Virtual TreeView, pro SubItem verschiedene Spalten (https://www.delphipraxis.net/102969-virtual-treeview-pro-subitem-verschiedene-spalten.html)

hoika 7. Nov 2007 17:05


Virtual TreeView, pro SubItem verschiedene Spalten
 
Hallo #,

jetzt will ich diese Sache mit dem VT endlich mal in Angriff nehmen ;)

Aber :(

Ich habe folgendes Problem.
Der TreeView zeigt in der 1. Ebene Projekte an, pro Projkt ein Item, klar.
Klappe ich ein Projekt auf, zeigt er mir Gruppen, z.B. Rechnung (Re), Lieferschein (LS).
Klappe ich eine Gruppe auf, erscheinen die eigentlichen Daten (z.B. Re-Nr, LS-Nr).

Aber 1
Je nach Gruppe werden verschiedene Daten angezeigt.
Bsp:
Bei Rechnung nur die Nummer, bei Lieferschein Nr und "Lieferschein zurück),
also bei Rechnung 1 Spalte, bei Lieferschein 2 Spalten (nur als Bsp).

Ich würde gern bei jeder verschiedenen Gruppe die Header ändern, ebenso die Spaltenanzahl.

Das würde dann in etwa so aussehen, wie ein ListView im TreeView.

Ich habe mit die descendants angesehen, nix.
(auch das nested header ist ja nicht dass, was ich brauche)


Zur Not könnte ich ja folgendes machen
das erste Item unterhalb der Rechnung ist der Header, der wird dann grau (?),
darf nicht auswählbar sein (?).

Nur muss ich die Spaltenzahl ändern können ?
Über Tabulator "lösen" (?)


Wie würdet ich das denn machen?


Danke


Heiko

dominikkv 7. Nov 2007 17:16

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
der ViertualTreeView hat die Eigenschaft .Header welches wieder die Einegnschaft .Columns hat wo du die Anzahl und Beschriftung der Header verändern kannst.

hoika 7. Nov 2007 18:06

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
Hallo,

korrekt.
Aber ich brauche ja nach aufgeklapptem Item verschiedene Header.

Wie oben gesagt, bei Lieferschein z.B. 2 Spalten mit Headerbeschriftung,
bei Rechnung 1.

Sowas wie Subheaders

Delphi-Quellcode:
0815
  |-- Rechnung
        |--  Re.-Nr:                              <- die Zeile grau, weil Header
        |--  0815-01
        |--  0815-02   

  |- Lieferschein
        |--  Nr:            zurück               <- die Zeile grau, weil Header
        |--  LS_0815_01      ja
        |--  LS_0815_02      nein

so in etwa


Heiko

Hawkeye219 7. Nov 2007 19:15

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
Hallo Heiko,

ich glaube nicht, daß die von dir gewünschte Darstellung mit dem VST direkt zu erreichen ist. Die einzige Möglichkeit besteht vielleicht darin, auf die Unterstützung der Komponente bei der Spaltenanzeige zu verzichten und alle Daten auf der untersten Stufe selbst zu zeichnen.

Warum trennst du die Anzeige der Daten nicht? Mit einer Baumanzeige könnte sich der Anwender in der Verzeichnisstruktur bewegen. Wählt er ein Verzeichnis an, das nur noch Blattknoten und keine Gruppenknoten mehr enthält, stellst du alle Blattknoten in einer Listenanzeige dar. Die Listenanzeige kannst du dann für jede Gruppe individuell gestalten. Beide Elemente - Baumanzeige und Listenanzeige - kannst du mit dem VST oder den Standardkomponenten (TTreeView, TListView) realisieren. Eine einzelne Komponente wäre mir wegen der unterschiedlichen Datenstruktur auf der untersten Ebene zu unübersichtlich.

Gruß Hawkeye

hoika 7. Nov 2007 19:36

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
Hallo,

es geht darum, dass bei ExpandAll eines Projekt-Knotens
alle Daten des Projektes angezeigt werden sollen.

Es geht also um einen schnellen Überblick,
was ist beim Projekt gelaufen.


Heiko

OG Karotte 7. Nov 2007 20:05

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
Hast Du Dir schonmal 'BeforeCellPaint' angesehen? Dadurch kannst Du extremen Einfluss auf Aussehen und Inhalt der jeweiligen Zelle nehmen. Somit sollte es möglich sein entspr. (Sub)Header unterhalb des jeweiligen Knoten zusetzen.

sh17 8. Nov 2007 08:06

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
ggf auch AfterCellPaint, sonst kommt es beim Zeichnen von Grafiken zu Problemen, wenn die Zeile Markiert ist (blauer Balken).

Ansonsten gibt es in VST keine Möglichkeit die Spaltenanzahl je Zeile dynamisch anzupassen. Das gibt das Konzept nicht her.

generic 8. Nov 2007 08:49

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
Ich meine bei Mike auf der Homepage eine abgeleitete Klasse gesehen die das kann.
Im Namen war etwas mit Subheadern.

hoika 8. Nov 2007 09:33

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
Hallo,

du meinst nested header.
Dabei wird aber "nur" im oberen Bereich eine zweite Header-Spalte angezeigt.

Ich muss aber pto Item verschiedene Header zeigen.

Am einfachsten verständlich ist es,
sich ein ListView in TreeView vorzustellen.

Es würde viell. ja erst mal reichen,
wenn die ListItems verschiedene Spalten-Anzahl hätten.
Geht ja aber leider auch nicht.
Ich will auch das AutoSize benutzen,
wenn ich das jetzt alles selber malen müsste ;(

Ich befürchte, das geht nur mit dem QuantumGrid,
obwohl ich in deren Screenshots und Handbuch auch nichts gesehen habe.


Heiko

stifflersmom 8. Nov 2007 09:44

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
Ich glaube, dass es dennoch möglich ist,
das gewünschte Ergebnis zu erreichen.

Für den VS legen wir zu Darstellung ja eine eigene Datenstruktur an,
und die können wir uns ja nach Belieben zusammenstellen.

Delphi-Quellcode:
 Type
    Ptreedbdata = ^TTreeDbData;
    TTreeDbdata = Record
      categories_id     : Integer;
      parent_id         : Integer;
      Caption           : String;
      report_ID         : Integer;
      Icon_Index        : Integer;
      ReportFile        : String;
      Faktura           : Integer;
    end;
Pass Dir die Struktur einfach zusammen wie es Dir gefällt.

Und im GetText-Ereignis des VS kannst Du dann dementsprechend reagieren
und die Texte anpassen
Delphi-Quellcode:
var
  Data: PTreeDBData;
begin
  Data:=ReportTree.GetNodeData(Node);
  If Data.Faktura = 1 Then Celltext := 'Rechnung'
  ... bla bla
end;
Und ähnlich könntest Du beim Zeichnen der Nodes vorgehen.

Moin

sh17 8. Nov 2007 09:49

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
Die Spaltenanzahl bleibt in der Summe aber gleich, je nach Zeile kann er nur einfach ein paar Spalten ohne Inhalt lassen

stifflersmom 8. Nov 2007 09:52

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
Zitat:

Zitat von sh17
Die Spaltenanzahl bleibt in der Summe aber gleich, je nach Zeile kann er nur einfach ein paar Spalten ohne Inhalt lassen

Das meine ich, beim Zeichnen der Nodes reagieren.

Moin

hoika 8. Nov 2007 09:55

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
Hallo,

genau das ist das Problem.
Ich möchte halt verschiedene Inhalte anzeigen,
je nach Item, ohne jetzt alles selber zu malen.


Ich habe jetzt mal in bisschen probiert mit

ProjektNr + Name (ein Text) | Nr | Datum | sonstiges

Nr + Datum hat je nach Item verschiedene Bedeutung,
bei Rechnung Rechnungs-Nr., bei Lieferschein LS-Nr. usw.

So richtig glücklich bin ich aber nicht,
weil jetzt alles ganz weit "nach hinten" wandert, z.B. das wichtige
"Lieferschein zurück".

Deshalb habe ich ja zur Zeit noch den normalen TreeView,
dort sind immerhin alle Daten sofort zu sehen (bei grossen Bildschirm ... ;) )

Ein Umstellen auf VT bringt mir da ja nicht viel
(Geschwindigkeit, Optik jaja)


Heiko

raiguen 8. Nov 2007 10:59

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
Zitat:

Zitat von hoika
[...]
Ich würde gern bei jeder verschiedenen Gruppe die Header ändern, ebenso die Spaltenanzahl.
[...]

Das lässt sich natürlich bewerkstelligen ;) Ich habe das in einem meiner Projekte so gelöst, dass ich die max. benötigte Anzahl der Spalten schon zur Designzeit erstellt habe und während der Laufzeit die nicht benötigten Spalten unsichtbar mache bzw die sichtbaren Spalten je nach Anforderung mit einem entsprechenden Kopftext versehen habe und ggf. die Spaltenbreite angepasst habe:
Delphi-Quellcode:
//--Spalte sichtbar
         VSTVO.Header.Columns[col].Options := VSTVO.Header.Columns[col].Options+[coVisible];
//--Spalte unsichtbar
         VSTVO.Header.Columns[col].Options := VSTVO.Header.Columns[col].Options-[coVisible];
//--Kopftext / Breite /Ausrichtung ändern
         VSTV0.Header.Columns[col].Text := 'Kopttext';
         VSTV0.Header.Columns[col].Width := 200;
         VSTV0.Header.Columns[col].Alignment := taRightJustify;
//--VSTVO ist der VirtualStringTree
Und im GetTextEreignis - wie bereits weiter oben erwähnt - befüllst du die Spalten je nach Gruppe
Delphi-Quellcode:
procedure TFormXYZ.VSTV0GetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var Data: PNodeInfos;
begin
   Data := VSTV0.GetNodeData(Node);
   if Data.Rechnung then
     case Column of
          1: CellText := Data.RELSNR; //Rechnungs-/LieferscheinNr als Bsp.
          2: CellText := '';          //wenn nix drinne stehen soll z.b.
          ...
     end
   else
     case Column of
          1: CellText := Data.RELESNR; //Rechnungs-/LieferscheinNr als Bsp.
          2: CellText := Data.BEMERK; //irgendwelche Zusatzinfos
          ...
   end;
Zitat:

Zitat von hoika
[...]Ich möchte halt verschiedene Inhalte anzeigen,
je nach Item, ohne jetzt alles selber zu malen.

Ähm... bisher wird da noch nix selber gemalt! Das macht der VST schon von sich aus ;)

Zitat:

Zitat von hoika
[...]
So richtig glücklich bin ich aber nicht,
weil jetzt alles ganz weit "nach hinten" wandert, z.B. das wichtige
"Lieferschein zurück".

Deshalb habe ich ja zur Zeit noch den normalen TreeView,
dort sind immerhin alle Daten sofort zu sehen (bei grossen Bildschirm ... ;) )

Ein Umstellen auf VT bringt mir da ja nicht viel
(Geschwindigkeit, Optik jaja)[...]

:roll: das muss ich nicht ganz verstehen ??oder?? Ob du nun den herkömmlichen TreeView nimmst oder den weitaus flexibleren VST - es ist alles eine Frage der Anpassung und mit dem VST wirst du mit Sicherheit auch das gleiche Aussehen erzielen (können) wie mit dem schnöden StandardTreeView

Apropos selber malen: natürlich kannst du je nach 'Zustand' bsp. die Spalte 'Lieferschein zurück' entsprechend einfärben: rot->noch nicht zurück, grün->zurück (nur mal so als Bsp):
Delphi-Quellcode:
procedure TFormXYZ.VSTV0BeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellRect: TRect);
var Data: PNodeInfos;
begin
// -- Beispielcode  
  Data := Sender.GetNodeData(Node);
  if ((Column=3) and (Data.LieferscheinZurück)) then
        TargetCanvas.Brush.Color := clGreen
  else
    TargetCanvas.Brush.Color := clRed;
  TargetCanvas.FillRect(CellRect);
end;
Noch 'n Tipp - falls 'übersehen':
Im OI des VST die Eigenschaft .DefaultText leer lassen (standardText ist 'Node'), somit werden alle Nodes, denen expliziet kein Text zugewiesen wurde, ohne Inhalt dargestellt ;)
okay, vllt. ist ja was für dich dabei...

hoika 8. Nov 2007 12:12

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
Hm,

viel Code, danke ;)

Aber:
Was passiert jetzt, wenn ich die Lieferscheine und Rechnungen
gleichzeitig aufmache ?
Klappt das mit den verschiedenen Spalten dann immer noch ?

Mit dem "nicht nutzen" meinte ich, dass solange
ich das nicht mit den Spalten drinhabe,
ist ein normaler Treeview einfacher / schneller zu programmieren.


Heiko

hoika 12. Nov 2007 11:23

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
Hallo raiguen,

wo genau setzt du die Spalten auf coVisible oder nicht coVisible ?


Heiko

raiguen 14. Nov 2007 22:13

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
Moin Heiko :)
Sorry, dass ich mich erst jetzt (wieder) melde... hab mir in den letzten Tagen ne ordentliche steife (Nordsee-)Brise um die Ohren wehen lassen (mein Lieblingsziel ist in der Regel Cuxhaven...aber das nur am Rande)...

In meinem Projekt verwende ich den VST sehr gerne zur Darstellung von Daten, weil ich durch die enormen flexiblen Möglichkeiten (okay, man muss sich da ordentlich durchwuseln und viel probieren, da m.E. die mir verfügbaren/auffindbaren Dokumentationen nicht immer erschöpfend sind und die Demos nicht immer das AHA-Erlebnis bringen - aber das nur nebenbei bemerkt) vielfache Gestaltungsmöglichkeiten habe.
In einem Modul bspw. werden (vom User editierbare) Vorgabetabellen dargestellt und je nach Art der Tabelle werden bei Auswahl derselben die benötigten Spalten eingeblendet bzw nicht benötigte Spalten ausgeblendet. Von daher kommt es natürlich auf den 'Verwendungs'Zweck an, wann man dieses 'Ereignis' antriggert ;)

Hmm, weiss jetzt nicht genau, was du damit meinst, Rechnung und Lieferschein gleichzeitig aufmachen? Ausgehend von deinem Beispiel wären das dann insgesamt drei Spalten (1*Rechnung, 2*Lieferschein) richtig? Somit hast du es ja in der Hand, wann (=was wird angezeigt) welche Spalte(n) sichtbar sein sollen - aber wie gesagt, das ist jetzt nur ins Blaue geraten. Vllt. ist es hilfreich, deine genauen Wünsche/Ziele zu skizzieren...

hoika 15. Nov 2007 07:47

Re: Virtual TreeView, pro SubItem verschiedene Spalten
 
Hallo,

#3 zeigt das doch eigentlich gut an.

1. Ebene Projekt
2. Ebene Dokumenten-Typ (Lieferschein/Rechnung)
3. Ebene einzelne Dokumente (je nach Dokumenttyp verschiedene Daten)


Mit "gleichzeitig Anzeigen" meine ich, dass alle Daten
des Projektes angezeigt werden (Expand aller Knoten des Projektes).
Der Nutzer soll auf einen Blick sehen,
welche Lieferschein UND Rechnungen im Projekt sind.


Heiko


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