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 VirtualStringTreeview (https://www.delphipraxis.net/115823-virtualstringtreeview.html)

stOrM 18. Jun 2008 16:11


VirtualStringTreeview
 
Hallo, ich hab ein riesen Problem hier mit der VST von Mike Lischke...

Ich versuche seit 3 Tagen mehrere Columns auf ivsMultiline zu setzen jedoch ohne erfolg, bzw Teilerfolg, es wird nur die Column 0 auf multiline gesetzt was aber leider die falsche Column ist...

Ich muss gestehen ich hab nicht wirklich Plan von der Komponente so das ich dem Beispiel von generic folgte, also hab ich mehrere Klassen erstellt um eine art Gruppierung aufzubauen.

Die Columns die multiline sein sollen wären: Column 1, 7, 8 , 10 und 11, da diese sehr grossen Text aufnehmen müssen.

Die Klassen:

Delphi-Quellcode:
type
  TRwuaData = record
   wuaUpdateTitel : WideString;
   wuaUpdateDescription : WideString;
  end;
   PRwuaData = ^TRwuaData;

  TOPwuaData = class
  public
    wuaUpdateTitel : WideString;
    wuaUpdateSeverity : WideString;
    wuaUpdateDescription : WideString;
    wuaUpdateUninstallSteps : WideString;
    wuaUpdateReleaseNotes : Widestring;
    wuaUninstallNotes : Widestring;
    wuaIsBetaDownload : WideString;
    wuaSupportUrl : WideString;
    wuaKB : WideString;
    wuaLanguage : WideString;
    wuaEula : WideString;
    wuaIsUninstallable : WideString;
  end;

  TOwuaGroup = class(TOPwuaData)
  private
  public
  end;
OnGetText Ereignis:

Delphi-Quellcode:
procedure TwuaMain.vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
  var
    data: TOPwuaData;
begin
  data := TOPwuaData(vst.GetNodeData(node)^);
  case Column of
    0: celltext := data.wuaUpdateTitel;
    1: celltext := data.wuaUpdateDescription;
    2: celltext := data.wuaUpdateSeverity;
    3: celltext := data.wuaIsBetaDownload;
    4: celltext := data.wuaSupportUrl;
    5: celltext := data.wuaKB;
    6: celltext := data.wuaLanguage;
    7: celltext := data.wuaEula;
    8: celltext := data.wuaUpdateReleaseNotes;
    9: celltext := data.wuaIsUninstallable;
   10: celltext := data.wuaUninstallNotes;
   11: celltext := data.wuaUpdateUninstallSteps;
   end;
end;
Was nun kommt, da blick ich selber nicht genau durch was hier rein muss:

Delphi-Quellcode:
procedure TwuaMain.vstInitNode(Sender: TBaseVirtualTree; ParentNode,
  Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
  Column: TColumnIndex;
begin
 Node.Align := 20; // Alignment of expand/collapse button nearly at the top of the node.
 Column := vst.Header.Columns.Count; // just for testing
case Column of
  0: // nicht multiline
  begin
    vst.NodeHeight[Node] := 40;
    Include(InitialStates, ivsHasChildren);
  end;
  end;
  case Column of
  1,7,8,10,11: // soll multiline sein! seltsam ist, das immer nur Column 0 auf multiline steht ich weiss nicht warum!
  begin
    vst.NodeHeight[Node] := 120;
    Include(InitialStates, ivsMultiline);
    end;
  end;
end;
Init Childs:

Delphi-Quellcode:
procedure TwuaMain.vstInitChildren(Sender: TBaseVirtualTree;
  Node: PVirtualNode; var ChildCount: Cardinal);
begin
  ChildCount := 1;
end;
Folgendes scheint auch nicht wirklich richtig zu sein, weil wenn ich +21 nicht mache stimmt die höhe der Checkboxen im Root so gar nicht, die werden dann zur Hälfte abgeschnitten!

Delphi-Quellcode:
procedure TwuaMain.vstMeasureItem(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer);
begin
  if Sender.MultiLine[Node] then
  begin
    TargetCanvas.Font := Sender.Font;
    NodeHeight := vst.ComputeNodeHeight(TargetCanvas, Node, 0)+ 21;
  end
   else
    NodeHeight := 21;
end;
Hinzufügen der Nodes, wie folgt:

Delphi-Quellcode:
  group := TOwuaGroup.Create;
  group.wuaUpdateTitel := Upd.Title;
  group.wuaUpdateSeverity := 'Test';
  node:=vst.AddChild(nil, group);
  vst.CheckType[node] := ctCheckBox;
  vst.CheckState[node] := csCheckedNormal;

  data := TOPwuaData.Create;

// Column 1 really really long!
  data.wuaUpdateDescription := 'Hier soll ein ziemlich langer Text rein...........';
  node:=vst.AddChild(node, data);
Wär echt super falls mir dabei jemand helfen kann?!

Viele Grüße
Marc

[edit=Christian Seehase]Titel korrigiert. Mfg, Christian Seehase[/edit]

toms 21. Jun 2008 07:47

Re: VirtualStringTreview
 
Hallo, hast du schon nach Bei Google suchenivsMultiline gegoogelt?

Bin u.a. auf diesen Beitrag gestossen: http://www.ureader.de/msg/1226546.aspx

stOrM 22. Jun 2008 01:39

Re: VirtualStringTreview
 
Jepp danke Dir, da hab ich auch schon gesucht nur ebenfalls keinen Erfolg. Beziehungsweise, wird die Höhe der Column zwar richtig gesetzt der Text aber nicht umgebrochen...

michaelg 22. Jun 2008 04:03

Re: VirtualStringTreview
 
Hi stOrM,

wieso nimmst Du ??
Delphi-Quellcode:
Column := vst.Header.Columns.Count;
Wieviele Spalten hast Du denn? Wenn ich so tue, funzt es.

Delphi-Quellcode:
procedure tForm1.vInitNode(Sender: TBaseVirtualTree; ParentNode,
  Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
  Column: TColumnIndex;
  i:Integer;
begin
  Node.Align := 20; // Alignment of expand/collapse button nearly at the top of the node.
  for i:= 0 to v.Header.columns.count-1 do begin
    Column := i;
    case Column of
      0: // nicht multiline
      begin
        v.NodeHeight[Node] := 40;
        Include(InitialStates, ivsHasChildren);
      end;
      1,3,7,8,10,11: // soll multiline sein! seltsam ist, das immer nur Column 0 auf multiline steht ich weiss nicht warum!
      begin
        v.NodeHeight[Node] := 120;
        Include(InitialStates, ivsMultiline);
      end;
    end;
  end;
end;
Ganz klar ist mir noch nicht, wieso es das tut, aber ich hab festgestellt, daß auch Column[0] als Multiline dargestellt wird, obwohl es nicht explizit hier drinsteht. Kann ein einzelnes Column überhaupt getrennt Multiline sein? Ich hab eher den Eindruck, daß Du sobald Du Include mit Multiline setzt, alle Columns in dem Node auf Multiline gesetzt werden. Würde sogar Sinn machen, finde ich.

stOrM 22. Jun 2008 13:28

Re: VirtualStringTreview
 
Hi Michael
Anzahl der Spalten gesamt 12 (0-11)

Wie sieht denn MeasureItem aus bei dir?

Extrem geil es funzt schon mal nun kenn ich auch meinen Fehler ich Depp!


Zusatzfrage, kennst Du dich mit der Komponente etwas besser aus als ich? mich würde da mal was wegen der Optik interessieren...
Die Column 1 ist jetzt dank deines genialen Codes multiline, sieht nur etwas gewöhnungsbedürfitg aus meiner Meinung nach.
Column 0 ist ja nicht multiline, dient aber als Root bzw. Überschrift somit ist der Inhalt von Column 1 unter Column 0
kann ich das so verschieben das der Inhalt von Column 1 unter Column 0 steht, also sozusagen nen Spawning Von Column 0 - 1 ?
Schwer verständlich ich weiss ich würds dir lieber Bildlich zeigen was ich meine...

Ich versuchs mal so :-)

Derzeitige Darstellung:

Colum 0 | Column 1
Text Column0
-------------------Text Column 1

Gewollte Darstellung:
Colum 0 | Column 1
Text Column0
Text Column 1 bis zum ende Column1
dann umbrechen...

Viele Grüsse
s!

michaelg 23. Jun 2008 03:25

Re: VirtualStringTreview
 
Mein Code war sicher nicht genial, sondern eher überflüssig, denn sowohl bei InitNode als auch bei OnMeasureItem ist kein Column als Parameter im Aufruf. Deshalb gehe ich davon aus, daß es um die komplette Zeile (Höhe des Nodes) geht, also könntest Du Dir das mit den Columns sparen. Bist Du wirklich sicher, daß man das für eine Col machen kann?

Mir ist aufgefallen, daß beim Setzen der Nodeheight bei OnMeasureItem "korrekter" gezeichnet wird. Im Fall von InitNode werden die Nodes alle auf die gleiche "höchste" Höhe gesetzt, das passiert bei OnMeasureItem nicht. Ich würde deshalb bei InitNode nur das Multiline setzen und bei OnMeasureItem die Höhe. Es gibt dazu auch ne Funktion ComputeNodeHeight, die könnte hilfreich sein, wenn Du tatsächlich variable Höhen für jedes Node haben willst. Damit die Höhe aber nur einmal berechnet werden muß, solange sich der Inhalt nicht ändert, würde ich mir die Höhe ins pTreeData-Record einbauen und wenn was drinsteht, nicht nochmal berechnen.

Ich hab noch das Property TreeOptions.MiscOptions.toVariableNodeHeight entdeckt, hat aber bisher keine Auswirkung bei mir gehabt, ob man das setzt oder nicht.

Zu Deiner anderen Frage:
Du willst sozusagen Column[0] als Überschrift haben und dann Column[1] darunter mit Multiline, und das Ganze innerhalb eines Knotens. Das kannst Du nur selber ins Canvas zeichnen glaube ich. Ich hab auch in den tausend Beispielprogrammen für den Stringtree nichts gefunden (außer in Advanced.dpr, aber da fehlt genau das im Quelltext, wonach wir suchen).

stOrM 23. Jun 2008 16:26

Re: VirtualStringTreview
 
?? Hmm wenn ich mir die Columns sparen kann, wie sag ich dem Tree dann das es um diverse Columns geht die multiline sein sollen jedoch nicht alle?


Das benutze ich ja schon : NodeHeight := vst.ComputeNodeHeight(TargetCanvas, Node, 1)+ 21; Die 1 steht für Column 1

Eigentlich müsste ich denk ich mal die Höhe nur fürs multiline Column anders sein?
Weil die stehen ja unter der Node die als Überschrift dient somit ist die Überschrift immer 21 in der Höhe und die darunter eben höher...

Naja ich hatte es fast befürchtet das das nicht so einfach zu handhaben ist, warum auch, wenn ich etwas suche was mir in die Birne kam gehts eh meist nicht auf einfachem weg ich bins gewohnt :-(

Der.Kaktus 23. Jun 2008 17:05

Re: VirtualStringTreview
 
Hi, Schuldigung..aber aender mal Bitte im Titel das Treview in Treeview um..
Danke

P.S.: damit die Suchfunktion auch diesen Thread findet.

stOrM 23. Jun 2008 21:53

Re: VirtualStringTreview
 
Zitat:

Zitat von Der.Kaktus
Hi, Schuldigung..aber aender mal Bitte im Titel das Treview in Treeview um..
Danke

P.S.: damit die Suchfunktion auch diesen Thread findet.

Jo wenn du mir noch schnell sagst wo?

Christian Seehase 23. Jun 2008 22:03

Re: VirtualStringTreview
 
Moin Storm,

Zitat:

Zitat von stOrM
Zitat:

Zitat von Der.Kaktus
Hi, Schuldigung..aber aender mal Bitte im Titel das Treview in Treeview um..
Danke

P.S.: damit die Suchfunktion auch diesen Thread findet.

Jo wenn du mir noch schnell sagst wo?

dazu müsstest Du den ersten Beitrag editieren (siehe Edit-Button, oberhalb eines Beitrages, rechts)
Da das aber nach 24 Stunden nicht mehr geht, habe ich das mal eben gemacht ;-)

stOrM 24. Jun 2008 09:21

Re: VirtualStringTreeview
 
Merci :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf