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 [VST] Zeilenumbruch in Nodes (https://www.delphipraxis.net/36937-%5Bvst%5D-zeilenumbruch-nodes.html)

phXql 28. Dez 2004 13:15


[VST] Zeilenumbruch in Nodes
 
huhu leute. mal wieder ein problem mit dem VST. Ich versuche einem Node eine Caption mit nem #13#10 zuzuweisen. nur leider hat der node dann keinen zeilenumbruch, sondern zwei schwarze kästchen da, wo der zeilenumbruch sein sollte. wie bringt man dem VST bei, einen zeilenumbruch darzustellen?

mfg phXql

Bernhard Geyer 28. Dez 2004 17:17

Re: [VST] Zeilenumbruch in Nodes
 
Was ist der VST?

Evtl. kann er/sie/es keine mehrzeiligen Texte.

mirage228 28. Dez 2004 17:34

Re: [VST] Zeilenumbruch in Nodes
 
Zitat:

Zitat von Bernhard Geyer
Was ist der VST?

Er meint das VirtualTreeView von Mike Lischke.

mfG
mirage228

paresy 28. Dez 2004 18:53

Re: [VST] Zeilenumbruch in Nodes
 
guck dir bei der VST Advanced Demo das Multiline Demo an :)

phXql 29. Dez 2004 14:49

Re: [VST] Zeilenumbruch in Nodes
 
bin ich zu blöd dafür?? hab mir die demo angeschaut, und das nun so gemacht:

Beim hinzufügen eines Nodes:
Delphi-Quellcode:
    t_child := VST1.AddChild(t_node);
    VST1.MultiLine[t_child] := True;
    t_data := VST1.GetNodeData(t_child);
    t_data^.ExceptionObj := g_Exceptions.Exception[i];
    t_data^.Kind := tkMessage;
Dann bei GetText:
Delphi-Quellcode:
procedure TFormExceptionLog.VST1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  t_data: PTreeNodeData;
begin
  t_data := Sender.GetNodeData(Node);
  case t_data^.Kind of
    tkMessage: CellText := 'Zeile 1' + #13#10 + 'Zeile 2';
  end;
Und dann noch um automatisch die richtige Höhe anzeigen zu lassen:
Delphi-Quellcode:
procedure TFormExceptionLog.VST1MeasureItem(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer);
begin
  if Sender.MultiLine[Node] then
    NodeHeight := VST1.ComputeNodeHeight(TargetCanvas, Node, -1);
end;
Nun SOLLTE es ja eigentlich gehen. also die spalte schaut mehrzeilig aus, nur leider wird der Text als "Zeile 1[dann die zwei kastel]Zeile 2" dargstellt. Wo is der Fehler??

mfg phXql

generic 30. Dez 2004 13:21

Re: [VST] Zeilenumbruch in Nodes
 
in der demo ist ein beispiel.
hab die mal den code rauskopiert:

Delphi-Quellcode:
procedure TNodeForm.MLTreeMeasureItem(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  var NodeHeight: Integer);

begin
  if Sender.MultiLine[Node] and AutoAdjustCheckBox.Checked then
  begin
    TargetCanvas.Font := Sender.Font;
    NodeHeight := MLTree.ComputeNodeHeight(TargetCanvas, Node, 0);
  end;
  // ...else use what's set by default.
end;


procedure TNodeForm.MLTreeInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode;
  var InitialStates: TVirtualNodeInitStates);

begin
  Node.Align := 20; // Alignment of expand/collapse button nearly at the top of the node.
  if (Node.Index mod 3) = 0 then
  begin
    MLTree.NodeHeight[Node] := 40;
  end
  else
  begin
    MLTree.NodeHeight[Node] := 120;
    Include(InitialStates, ivsMultiline);
  end;
end;

procedure TNodeForm.AutoAdjustCheckBoxClick(Sender: TObject);

begin
  MLTree.ReinitNode(nil, True);
  MLTree.Invalidate;
end;

phXql 1. Jan 2005 16:30

Re: [VST] Zeilenumbruch in Nodes
 
das gibts doch nich. ich habs genauso gemacht wie in der demo, der node wird auch zweizeilig dargestellt, nur leider will der mir des enter nich richtig anzeigen. Noch ne idee, woran das liegen kann? :(

paresy 1. Jan 2005 17:14

Re: [VST] Zeilenumbruch in Nodes
 
versuch mal statt #13#10 -> #10#13 einzugeben.... das hilft manchmal :)

phXql 1. Jan 2005 17:49

Re: [VST] Zeilenumbruch in Nodes
 
Zitat:

Zitat von paresy
versuch mal statt #13#10 -> #10#13 einzugeben.... das hilft manchmal :)

hilft leider auch nicht... :/

generic 3. Jan 2005 06:55

Re: [VST] Zeilenumbruch in Nodes
 
hast du vieleicht widechars oder sowas an?

phXql 3. Jan 2005 15:31

Re: [VST] Zeilenumbruch in Nodes
 
ne.. ich lasse nur den message-text eines error-objekts ausgeben. und wenn da ein zeilenumbruch drin ist, wird der nicht richtig dargstellt. kein wide-char oder sowas...

phXql 29. Jan 2005 11:03

Re: [VST] Zeilenumbruch in Nodes
 
So kleine Korrektur. Im OnGetText-Ereignis wird der Celltext als WideString zurückgegeben. Wie macht man einen Zeilenumbruch (#13#10) in einem Widestring?

mfg phXql

generic 28. Nov 2005 12:53

Re: [VST] Zeilenumbruch in Nodes
 
ich hab da gerade nochmal rumprobiert.

hast du mehrere spalten oder vieleicht static-texte?

Angel4585 28. Nov 2005 12:58

Re: [VST] Zeilenumbruch in Nodes
 
mach mal anstatt +#10#13+ => +sLineBreak+

(Ups, sLineBreak steht ja für #13#10, Sorry)

phXql 28. Nov 2005 16:51

Re: [VST] Zeilenumbruch in Nodes
 
Zitat:

Zitat von generic
ich hab da gerade nochmal rumprobiert.

hast du mehrere spalten oder vieleicht static-texte?

ich hab mehrere spalten, ja...

generic 29. Nov 2005 08:56

Re: [VST] Zeilenumbruch in Nodes
 
hmm, komisch komisch.
ich poste mal alles zu dem multiline was ich im letzten projekte verwendet habe.
bei multiline wird der static text nicht angezeigt.

der tree ist schon komplett aufgebaut wird nur noch durch folgendes in multiline gesetzt
Delphi-Quellcode:
vst_vergleich.IterateSubtree(nil, SetVstMultilineCallback,nil);

procedure Tfrm_vergleich.SetVstMultilineCallback(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
begin
  sender.MultiLine[node]:=True;
  Abort:=false;
end;
Im onMeasureItem errechne ich noch von allen spalten die maximale höhe+5.
der Knoten soll aber mindestens DefaultNodeHeight haben.

Delphi-Quellcode:
procedure Tfrm_vergleich.vst_vergleichMeasureItem(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer);
var
  i: integer;
begin
  if Sender.MultiLine[Node] then
  begin
    NodeHeight:=vst_vergleich.DefaultNodeHeight;
    for i:=0 to vst_vergleich.Header.Columns.Count-1 do
      NodeHeight := Max(vst_vergleich.ComputeNodeHeight(TargetCanvas, Node, i)+5, NodeHeight);
  end;
end;
so nur noch mein vst:
Delphi-Quellcode:
var
  vst_vergleich: TVirtualStringTree;

  vst_vergleich := TVirtualStringTree.Create(Self);
  with vst_vergleich do
  begin
    Name := 'vst_vergleich';
    Parent := Self;
    Left := 0;
    Top := 23;
    Width := 792;
    Height := 550;
    Align := alClient;
    Header.AutoSizeIndex := 0;
    Header.Font.Charset := DEFAULT_CHARSET;
    Header.Font.Color := clWindowText;
    Header.Font.Height := -11;
    Header.Font.Name := 'Tahoma';
    Header.Font.Style := [];
    Header.Options := [hoColumnResize, hoVisible];
    Header.Style := hsPlates;
    HintAnimation := hatNone;
    HintMode := hmHint;
    LineMode := lmBands;
    LineStyle := lsSolid;
    ParentShowHint := False;
    ShowHint := True;
    TabOrder := 1;
    TreeOptions.MiscOptions := [toAcceptOLEDrop, toFullRepaintOnResize, toGridExtensions, toInitOnSave, toToggleOnDblClick, toWheelPanning, toVariableNodeHeight];
    TreeOptions.PaintOptions := [toShowButtons, toShowDropmark, toShowHorzGridLines, toShowRoot, toShowTreeLines, toShowVertGridLines, toThemeAware, toUseBlendedImages, toFullVertGridLines];
    TreeOptions.SelectionOptions := [toExtendedFocus, toFullRowSelect];
    OnGetText := vst_vergleichGetText;
    OnPaintText := vst_vergleichPaintText;
    OnGetHint := vst_vergleichGetHint;
    OnMeasureItem := vst_vergleichMeasureItem;
    with Columns.Add do begin
      Options := [coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coVisible];
      Position := 0;
      Tag := 5;
      Width := 350;
      WideText := 'Bezeichnung';
    end;
    WideDefaultText := '';
  end;
nicht wundern das nur 1 spalte da ist. es werden noch weitere dynamisch hinzugefügt.
das passiert ungefähr so:
Delphi-Quellcode:
    fheader:=vst_vergleich.Header.Columns.Add;
    fheader.Width:=150;
    fheader.Options:=fheader.Options-[coAllowClick];
    fheader.Text:='text text';
ich nutze Version 4.3.1 des virtualstringtree.
läuft ohne probleme mit delphi 6 pro, delphi7 enterprise und delphi2005 enterprise

wenn das dann immer noch nicht geht, melde dich mal bitte per icq oder pm bei mir


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