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.