![]() |
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:
OnGetText Ereignis:
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;
Delphi-Quellcode:
Was nun kommt, da blick ich selber nicht genau durch was hier rein muss:
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;
Delphi-Quellcode:
Init Childs:
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;
Delphi-Quellcode:
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!
procedure TwuaMain.vstInitChildren(Sender: TBaseVirtualTree;
Node: PVirtualNode; var ChildCount: Cardinal); begin ChildCount := 1; end;
Delphi-Quellcode:
Hinzufügen der Nodes, wie folgt:
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;
Delphi-Quellcode:
Wär echt super falls mir dabei jemand helfen kann?!
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); Viele Grüße Marc [edit=Christian Seehase]Titel korrigiert. Mfg, Christian Seehase[/edit] |
Re: VirtualStringTreview
Hallo, hast du schon nach
![]() Bin u.a. auf diesen Beitrag gestossen: ![]() |
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...
|
Re: VirtualStringTreview
Hi stOrM,
wieso nimmst Du ??
Delphi-Quellcode:
Wieviele Spalten hast Du denn? Wenn ich so tue, funzt es.
Column := vst.Header.Columns.Count;
Delphi-Quellcode:
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.
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; |
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! |
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). |
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 :-( |
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. |
Re: VirtualStringTreview
Zitat:
|
Re: VirtualStringTreview
Moin Storm,
Zitat:
Da das aber nach 24 Stunden nicht mehr geht, habe ich das mal eben gemacht ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:28 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