Einzelnen Beitrag anzeigen

lucius

Registriert seit: 6. Okt 2005
Ort: Niederlande
215 Beiträge
 
Delphi 7 Enterprise
 
#1

TTreeView auslesen und Werte von Nodes in Listbox eintragen.

  Alt 17. Apr 2007, 23:04
Guten Abend,

der Unglueckliche Lucius meldet sich wieder

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.
Kann mir da einer bitte helfen?

Vielen Dank,

Lucius.
  Mit Zitat antworten Zitat