Thema: Delphi VirtualStringTreeview

Einzelnen Beitrag anzeigen

Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
431 Beiträge
 
Delphi 10.3 Rio
 
#1

VirtualStringTreeview

  Alt 18. Jun 2008, 16:11
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]
  Mit Zitat antworten Zitat