AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Große Probleme mit VirtualStringTree

Große Probleme mit VirtualStringTree

Ein Thema von SneakyBagels · begonnen am 17. Jun 2017 · letzter Beitrag vom 19. Jun 2017
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
SneakyBagels
(Gast)

n/a Beiträge
 
#1

Große Probleme mit VirtualStringTree

  Alt 17. Jun 2017, 10:40
Ich teste mich heute an einem VirtualStringTree denn mein Ziel ist es ein VST zu haben was aussieht wie ein TListView (mit Mouse-Hover-Effekt).

Das hier habe ich schon. Ok, es kommt von einem Tutorial. Aber es funktioniert trotzdem nicht.
Statt dass die in Col1 und Col2 zugewiesenen Strings im VST landen, landet das im Form.Caption.

Delphi-Quellcode:
type
 PTreeData = ^TTreeData;

 TTreeData = packed record
  Col1: string;
  Col2: string;
 end;

implementation

{$R *.dfm}

function AddVSTStructure(AVST: TCustomVirtualStringTree; ANode: PVirtualNode; ARecord: TTreeData): PVirtualNode;
var
 Data: PTreeData;
begin
 Result := AVST.AddChild(ANode);
 Data := AVST.GetNodeData(Result);
 AVST.ValidateNode(Result, False);
 Data^.Col1 := ARecord.Col1;
 Data^.Col2 := ARecord.Col2;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
 i: Integer;
 TreeData: TTreeData;
begin
 VST.NodeDataSize := SizeOf(TTreeData);
 VST.BeginUpdate;
 for i := 0 to 9 do
  begin
   TreeData.Col1 := 'Node-Nummer: ' + IntToStr(i);
   TreeData.Col2 := 'Nummer: ' + IntToStr(i * i);
   AddVSTStructure(VST, nil, TreeData);
  end;
 VST.EndUpdate;
end;

procedure TForm2.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
 Data: PTreeData;
begin
 Data := VST.GetNodeData(Node);
 case Column of
  0:
   Text := Data.Col1;
  1:
   Text := Data.Col2;
 end;
end;
Text habe ich mal durch CellText geändert das funktioniert jetzt.
Was aber nicht funktioniert das Einstellen der Höhe eines Nodes. Und allgemein kann man mit dem VST irgendwie wenig machen oder es ist halt alles versteckt.
Wieso gibt es denn nicht mal einen Fokus-Rahmen wenn man mit er Maus drüber fährt wie beim ListView?

Geändert von SneakyBagels (17. Jun 2017 um 11:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
6.572 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Große Probleme mit VirtualStringTree

  Alt 17. Jun 2017, 11:07
Delphi-Quellcode:
procedure TForm2.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); // CellText !!!
var
 Data: PTreeData;
begin
 Data := VST.GetNodeData(Node);
 case Column of
  0:
   Text := Data.Col1; // nicht Text !!
  1:
   Text := Data.Col2;
 end;
end;
// EDIT:
Ok, hast du selbst parallel gesehen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke (17. Jun 2017 um 11:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
6.572 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Große Probleme mit VirtualStringTree

  Alt 17. Jun 2017, 11:27
Ich schreibe das mal separat, damit du eine Benachrichtigung siehst:
Höhe ändern geht einfach, aber man muss es aktivieren (aus Performancegründen):
Unter TreeOptions --> MiscOptions den Wert toVariableNodeHeight auf True setzen.
Dann funktioniert OnMeasureItem.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#4

AW: Große Probleme mit VirtualStringTree

  Alt 17. Jun 2017, 11:32
Zitat:
Ich schreibe das mal separat, damit du eine Benachrichtigung siehst:
Weiß nicht, welche Benachrichtigung.

Ich bin mittlerweile so weit:

Items zur besseren Übersicht farblich gestalten (jedes zweite):
Delphi-Quellcode:
procedure TForm2.VSTAfterItemErase(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect);
begin
 if Odd(Node.Index) then
  TargetCanvas.Brush.Color := $00E1F3FF;

 TargetCanvas.FillRect(ItemRect);
end;
Im OnGetText u.a.:
Delphi-Quellcode:
procedure TForm2.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
 Data: PVSTData;
begin
 Data := VST.GetNodeData(Node);

 if Node.Index = 2 then
  Node.NodeHeight := 35; // <= funktioniert sogar ohne toVariableNodeHeight
....
end;
Text selber zeichnen:
Delphi-Quellcode:
procedure TForm2.VSTDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const Text: string; const CellRect: TRect;
 var DefaultDraw: Boolean);
begin
 DefaultDraw := False;
 TargetCanvas.TextOut(CellRect.Left, CellRect.Top + 2, Text);

 if Node.Index = 2 then
  begin
   TargetCanvas.TextOut(CellRect.Left, CellRect.Top + 16, '123'); // Funktioniert. Wird aber erst sichtbar, wenn ich mit der Maus über das VST fahre
  end;
end;
Ist das bisher eine absolute 0815-Lösung oder ist das OK so?

Geändert von SneakyBagels (17. Jun 2017 um 11:35 Uhr)
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#5

AW: Große Probleme mit VirtualStringTree

  Alt 17. Jun 2017, 11:58
Im Anhang mal mein aktueller Versuch.
Das Ganze ist eine Zusammenstellung aus Forum, Google, Tutorial und meinem Kram.

Es funktioniert soweit bis auf, dass
- ein Node mit einer Höhe > Default den zweiten TextOut nicht anzeigt.
- ein Node der vorher selektiert war und wo nun der Fokus woanders hin verlegt wird (Button), eine andere Hintergrundfarbe hat
Angehängte Dateien
Dateityp: zip VST-Test.zip (2,1 KB, 3x aufgerufen)

Geändert von SneakyBagels (17. Jun 2017 um 12:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
6.572 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: Große Probleme mit VirtualStringTree

  Alt 17. Jun 2017, 12:00
Ich würde das ganze mit den Pointern und Records lassen und lieber Klassen dranhängen. In den aktuellen Versionen des VST geht es auch generisch:
Delphi-Quellcode:
type
  TTest = class
  private
    FValue: Integer;
    procedure SetValue(const Value: Integer);
  public
    constructor Create(const AValue: Integer);
    property Value: Integer read FValue write SetValue;
  end;

// hinzufügen
  VirtualStringTree1.AddChild(nil, TTest.Create(15));

// OnGetText
  CellText := IntToStr(Node.GetData<TTest>.Value);
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#7

AW: Große Probleme mit VirtualStringTree

  Alt 17. Jun 2017, 12:02
Ich brauche die ObjectList leider, um später auf die Daten zugreifen zu können OHNE ins VST gehen zu müssen. Sonst würde ich sie auch weglassen.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
6.572 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#8

AW: Große Probleme mit VirtualStringTree

  Alt 17. Jun 2017, 12:08
Es funktioniert soweit bis auf, dass
- ein Node mit einer Höhe > Default den zweiten TextOut nicht anzeigt.
Weil du den Wert einfach hineinschreibst statt es zu machen wie ich geschrieben habe.

Im Anhang funktioniert es und die Pointerspielerei ist auch raus.

Ich brauche die ObjectList leider, um später auf die Daten zugreifen zu können OHNE ins VST gehen zu müssen. Sonst würde ich sie auch weglassen.
Die soll auch nicht raus, die Daten sollen schon extern liegen. Aber siehe Anhang.
Angehängte Dateien
Dateityp: zip VST-Test.zip (2,4 KB, 3x aufgerufen)
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.207 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: Große Probleme mit VirtualStringTree

  Alt 17. Jun 2017, 12:11
Tag!

Also vorab: Mit dem VST kannst du eigentlich alles machen was du willst. Die Komponente ist extrem flexibel und lässt sehr viele Dinge zu, die mit anderen Komponenten nur schwer bis gar nicht erreicht werden können. Und das noch auf extrem einfache Art und Weise.

Das farbliche Markieren von Zeilen macht man besser im OnBeforeCellPaint. Das Event ist dafür besser geeignet bzw. wird in der Regel eher dafür genutzt. Anbei mal die Reihenfolge der Zeichen-Events, die nacheinander ausgelöst werden. Das OnBeforeCellPaint Event kommt zwar direkt nach dem OnAfterItemErase, aber StateOfTheArt ist eigentlich OnBeforeCellPaint.

Zitat von VirtualTreeView Help File:
Usually the following paint stages are executed during a paint cycle:
• before paint (OnBeforePaint)
• before item paint (OnBeforeItemPaint)
• before item erase (OnBeforeItemErase)
• after item erase (OnAfterItemErase)
• before cell draw (OnBeforeCellPaint)
• on paint text (string trees only, OnPaintText)
• after cell draw (OnAfterCellPaint)
• after item paint (OnAfterItemPaint) after paint (OnAfterPaint)
Die Messung der Texthöhe solltest du nicht im OnGetText Event machen. Dafür gibt es spezielle Events wie z.B. OnMeasureItem.

Zitat von VirtualTreeView Help File:
10.1.2.126 TBaseVirtualTree.OnMeasureItem Event

Miscellaneous event.

property OnMeasureItem: TVTMeasureItemEvent; Description

Virtual Treeview supports individual node heights. However it might sometimes unpractical to set this height in advance (e.g. during OnInitNode( see TBaseVirtualTree.OnInitNode Event, page 147)). Another scenario might be that multi line nodes must size themselves to accomodate the entire node text without clipping. For such and similar cases the event OnMeasureItem is for. It is queried once for each node and allows to specify the node's future height. If you later want to have a new height applied (e.g. because the node's text changed) then call InvalidateNode( see TBaseVirtualTree.InvalidateNode Method , page 221) for it and its vsHeightMeasured state is reset causing so the tree to trigger the OnMeasureItem event again when the node is painted the next time.
Die Grund Initialisierung kannst du im OnInit Event durchführen. In den neueren Versionen gibt es auch noch die Events OnMeasureTextHeight und OnMeasureTextWidth die du dafür nutzen solltest.


Bei Änderungen der Formatierung deiner Texte die im VST angezeigt werden solltest du OnPaintText benutzen. Im OnDrawText musst du alles selbst machen. Die Positionierung, die Ausgabe des Textes, usw.

Im OnPaintText übernimmt der Tree das alles für dich. Aber nur, wenn es um Formatierungen geht. Wenn du weitere Texte dazumalen willst, dann solltest du OnDrawText.


Die eigentliche Erstellung der Nodes solltest du mit der RootNodeCount Eigenschaft des Trees machen. Die Children bzw. den ChildCount dann im OnInit und OnInitChildren Event zuweisen.

Um Nodes beim Drüberfahren mit der Maus markieren zu lassen, kannst du auch die TreeOption toHotTrack in den PaintOptions setzen. Wenn dir das Design nicht zusagt, dann setze evtl. zum Testen mal toUseExplorerTheme auf True. Wenn es dann noch nicht passt, dann kannst du das im OnBeforeCellPaint selbst machen. Hatte ich auch mal für ein paar Programme gemacht. Sieht eigentlich ziemlich gut aus.
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#10

AW: Große Probleme mit VirtualStringTree

  Alt 17. Jun 2017, 12:19
Hallo Aviator, deinen Beitrag lese ich mir gleich mal in Ruhe durch.

Jaenike:
Danke für deine Änderung.
SetData und GetData können leider nicht gefunden werden und ich weiß auch leider nicht wie ich das in diesen von mir fabrizierten Salat einbinde
VST in Verbindung mit Klassen und ObjectList ist komplett neu für mich.

Geändert von SneakyBagels (17. Jun 2017 um 12:21 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:

Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2017 by Daniel R. Wolf