Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi TTreeView auslesen und Werte von Nodes in Listbox eintragen. (https://www.delphipraxis.net/90461-ttreeview-auslesen-und-werte-von-nodes-listbox-eintragen.html)

lucius 17. Apr 2007 22:04


TTreeView auslesen und Werte von Nodes in Listbox eintragen.
 
Guten Abend,

der Unglueckliche Lucius meldet sich wieder :gruebel:

Bezueglich dieses Thema XML ist es mir jetzt gelungen die XML-Datei(2MB) recht zuegig ein zu lesen in einer TreeView.
Im TreeView werden verschiedene Nodes angeben wovon manche, Daten enthalten die in einer Listbox angegeben werden beim anklicken.
Node: Daten:
file |------------ poster (Listbox.ItemIndex[0])
|------------ date (Listbox.ItemIndex[1])
|------------ subject(Listbox.ItemIndex[2])

Jetzt moechte Ich gerne dass aus der ganzen TreeView nur die Daten vom Node (file) mit den Daten 'subject' in der Listbox angeben werden, also muesste 'poster' und 'date' geloescht werden.
Spaeter brauchte ich auf dem selben Wege auch die Daten 'segment' vom Node (segments) und einmalig die Daten 'group' vom Node (groups).
Delphi-Quellcode:
procedure TfrmMain.DrawXML( Data : Pointer = nil );
var
  p : Pointer;
begin
  p := Data;
  if (tvXML.Selected <> nil) and
     (p = nil) then
    p := tvXML.Selected.Data;
  tvXML.Items.Clear;
  tvXML.Items.BeginUpdate;
  p := DrawXMLItem(XML.Root, nil, p);
  tvXML.Items.EndUpdate;
  tvXML.FullExpand;
  if p = nil then
    tvXML.Selected := tvXML.Items[0]
  else
    tvXML.Selected := p;
end;

function TfrmMain.DrawXMLItem(XMLItem: TXMLItem; Node: TTreeNode; Data : Pointer) : Pointer;
var
  n : TTreeNode;
  i : Integer;
  p : Pointer;
begin
  Result := nil;
  p := nil;
  n := tvXML.Items.AddChild(Node, XMLItem.Name);
  n.Data := XMLItem;
  if Integer(n.Data) = Integer(Data) then
    p := n;

  for i := 0 to XMLItem.SubItemCount -1 do
    if p = nil then
      p := DrawXMLItem(XMLItem.SubItems[i], n, Data)
    else
      DrawXMLItem(XMLItem.SubItems[i], n, Data);

  if p <> nil then
    Result := p;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  HistoryList := TStringList.Create;
  XML.CrLfInAsString := btnCrLf.Down;
  FileName := '';
  XML.Clear;
  if FileExists(ParamStr(1)) then
    begin
      FileName := ParamStr(1);
      XML.LoadFromFile(FileName);
    end;
  DrawXML;
end;

procedure TfrmMain.tvXMLChange(Sender: TObject; Node: TTreeNode);
var
  xmlItem : TXMLItem;
begin
  DoChangeEvents := false;
  try
    btnNewNode.Enabled := Assigned(Node);
    btnDeleteNode.Enabled := Assigned(Node) and (Node.Level > 0);
    edItemTitle.ReadOnly := not Assigned(Node);
    edItemValue.ReadOnly := not Assigned(Node);
    btnNewProperty.Enabled := Assigned(Node);
    btnDeleteProperty.Enabled := false;
    btnMoveDown.Enabled := btnDeleteNode.Enabled;
    btnMoveUp.Enabled  := btnDeleteNode.Enabled;

    if Assigned(Node) then
      begin
        xmlItem := Node.Data;
        edItemTitle.Text := xmlItem.Name;
        edItemValue.Text := xmlItem.Text;
        lbItemParamaters.Items.Assign(xmlItem.Params);
      end;
  finally
    DoChangeEvents := true;
  end;
end;
Ich weiss dass ganze ging vielleicht viel besser mit einer ListView was Ich auch eigentlich realisieren moechte, aber Ich kriege es auf normalen Wege einfach nicht hin als Newbie und der Tag war so kurz Heute. :coder:
Kann mir da einer bitte helfen?

Vielen Dank,

Lucius.

lucius 18. Apr 2007 08:07

Re: TTreeView auslesen und Werte von Nodes in Listbox eintra
 
Hat keiner ein Vorschlag?

marabu 18. Apr 2007 13:00

Re: TTreeView auslesen und Werte von Nodes in Listbox eintra
 
Hallo unglücklicher Lucius,

welche XML-Komponenten verwendest du?

Ich würde die beiden Attribute poster und date nicht hinterher rausschmeißen, sondern gar nicht erst in die ListBox schreiben. Dazu musst du in der Routine tvXMLChange() ein paar Änderungen machen.

Delphi-Quellcode:
// ...
  if Assigned(Node) then
  begin
    xmlItem := Node.Data;
    edItemTitle.Text := xmlItem.Name;
    edItemValue.Text := xmlItem.Text;
    lbItemParameters.Clear;
    lbItemParamaters.Items.Add(xmlItem.Params[xmlItem.Params.IndexOfName('subject')]);
  end;
// ...
So oder ähnlich könnte es aussehen, testen konnte ich aber nicht.

Freundliche Grüße


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