Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriffsverletzung bei JVTreeView (https://www.delphipraxis.net/64462-zugriffsverletzung-bei-jvtreeview.html)

Yheeky 3. Mär 2006 22:17


Zugriffsverletzung bei JVTreeView
 
Hi,

ich bekomme dauernd Zugriffsfehler beim Verarbeiten einer JVTreeView. Ich habe folgende Daten

+ Eintrag1
|-- Mustermann
|-- Max
|-- 12345
+ Eintrag2
|-- Musterfrau
|-- Maxi
|-- 67890

Ich möchte jetzt mit einer Schleife jeweils das erste "Child" ändern (in dem Fall Mustermann und Musterfrau). Wie kann ich das machen?

marabu 4. Mär 2006 08:29

Re: Zugriffsverletzung bei JVTreeView
 
Hallo Christian,

das funktioniert wie bei der Standardkomponente auch:

Delphi-Quellcode:
procedure TDemoForm.EditButtonClick(Sender: TObject);
var
  TreeNodes: TTreeNodes;
  i: Integer;
begin
  TreeNodes := TreeView.Items;
  for i := 0 to Pred(TreeNodes.Count) do
    DoProcess(TreeNodes[i].getFirstChild);
end;
Grüße vom marabu

Yheeky 4. Mär 2006 12:07

Re: Zugriffsverletzung bei JVTreeView
 
Leider nein. :roll:

DoProcess wird nicht erkannt.

marabu 4. Mär 2006 12:13

Re: Zugriffsverletzung bei JVTreeView
 
DoProcess() ist doch nur mein Platzhalter für deinen Code...

marabu

Yheeky 4. Mär 2006 12:36

Re: Zugriffsverletzung bei JVTreeView
 
Das ist ja gerade das Problem, da bekomme ich eine Zugriffsverletzung. Was muss ich denn da reinschreiben, wenn ich immer das erste Child ändern will? Ich hab schon einiges probiert...

marabu 4. Mär 2006 12:49

Re: Zugriffsverletzung bei JVTreeView
 
Sorry - beim Iterieren über all Nodes werden ja auch solche besucht, die dich gar nicht interessieren. Dieser Code ist getestet:

Delphi-Quellcode:
procedure TDemoForm.DoProcess(tn: TTreeNode);
begin
  tn.Text := Uppercase(tn.Text);
end;

procedure TDemoForm.ProcessButtonClick(Sender: TObject);
var
  Nodes: TTreeNodes;
  tn: TTreeNode;
begin
  Nodes := TreeView.Items;
  tn := Nodes.GetFirstNode;
  while Assigned(tn) do
  begin
    DoProcess(tn.getFirstChild);
    tn := tn.getNextSibling;
  end;
end;
marabu

Yheeky 4. Mär 2006 13:29

Re: Zugriffsverletzung bei JVTreeView
 
Okay danke, das geht nun soweit.

Ich möchte nun aber alle Childs ändern und das auf ein mal.
Ich habs erst mal mit ShowMessage Dialogen versucht und da komme ich schon nicht weiter:

Delphi-Quellcode:
showmessage(TreeNode.GetFirstChild.Text);
showmessage(treenode.GetNext.Text);
showmessage(TreeNode.GetLastChild.Text);
Die erste zeigt mir "0" an - richtig.
Die zweiter zeigt mir aber auch "0" an - falsch.
die letzte zeigt mir "gude" an - richtig.

Wieso ist mein 2.Aufruf falsch?

marabu 4. Mär 2006 13:59

Re: Zugriffsverletzung bei JVTreeView
 
GetNext() liefert einfach den nächsten Knoten. Das kann ein Knoten auf einer beliebigen Ebene sein. Wenn du alle direkten Unterknoten eines Knotens sehen willst, dann mache es so:

Delphi-Quellcode:
procedure TDemoForm.ShowChildren(tn: TTreeNode);
begin
  tn := tn.GetFirstChild;
  while Assigned(tn) do
  begin
    ShowMessage(tn.Text);
    tn := tn.GetNextSibling;
  end;
end;
marabu

Yheeky 4. Mär 2006 16:52

Re: Zugriffsverletzung bei JVTreeView
 
Jetzt bekomme ich aber nur den ersten Eintrag im TreeView angezeigt. Wenn ich nun beide Lösungen von dir kombiniere, bekomme ich schon wieder Zugriffsverletzungen :(

marabu 4. Mär 2006 20:24

Re: Zugriffsverletzung bei JVTreeView
 
Die Zugriffsverletzungen könnten durch deine Kombination der Codes bedingt sein. Hier übernehme ich den Code von ShowChildren() nach DoProcess() und passe den Aufruf so an, dass für alle Knoten auf der ersten Ebene die direkten Unterknoten ausgegeben werden - ungetestet:

Delphi-Quellcode:
procedure TDemoForm.DoProcess(tn: TTreeNode);
begin
  tn := tn.GetFirstChild;
  while Assigned(tn) do
  begin
    ShowMessage(tn.Text);
    tn := tn.GetNextSibling;
  end;
end;

procedure TDemoForm.ProcessButtonClick(Sender: TObject);
var
  tn: TTreeNode;
begin
  tn := TreeView.Items.GetFirstNode;
  while Assigned(tn) do
  begin
    DoProcess(tn);
    tn := tn.getNextSibling;
  end;
end;
marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz