Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointer of Record --> Record konvertieren (https://www.delphipraxis.net/87239-pointer-record-record-konvertieren.html)

Zacherl 25. Feb 2007 17:53


Pointer of Record --> Record konvertieren
 
So, ich habe folgenden Record:

Delphi-Quellcode:
type
  PCatData = ^TCatData;
  TCatData = record
    Caption: string;
    ImageIndex: integer;
    SubCats: array of PCatData;
  end;
und folgende Funktion, die sich selbst rekursiv wieder aufruft:

Delphi-Quellcode:
procedure AddNodes(Root: PVirtualNode; Data: PCatData);
var
  i: integer;
  NodeData: PNodeData;
  NewNode: PVirtualNode;
begin
  with frmInteractive do
  begin
    NewNode := CatList.AddChild(Root);
    NodeData := CatList.GetNodeData(NewNode);
    NodeData.Caption := Data.Caption;
    NodeData.ImageIndex := Data.ImageIndex;
    NodeData.Panel := nil; // hinterher ändern
    for i := low(Data.SubCats) to high(Data.SubCats) do
    begin
      AddNodes(NewNode, Data.SubCats[i]);
    end;
  end;
end;
Starte ich die Rekursion erhalte ich allerdings eine Zugriffsverletzung, die vermutlich daher stammt, dass ich PCatData nicht einfach wie TCatData behandeln kann.

Kann da jemand helfen?

Daniel G 25. Feb 2007 17:56

Re: Pointer of Record --> Record konvertieren
 
Geht's so?

Delphi-Quellcode:
procedure AddNodes(Root: PVirtualNode; Data: PCatData);
var
  i: integer;
  NodeData: PNodeData;
  NewNode: PVirtualNode;
begin
  with frmInteractive do
  begin
    NewNode := CatList.AddChild(Root);
    NodeData := CatList.GetNodeData(NewNode);
    NodeData.Caption := Data.Caption;
    NodeData.ImageIndex := Data.ImageIndex;
    NodeData.Panel := nil; // hinterher ändern
    for i := low(Data.SubCats^) to high(Data.SubCats^) do
    begin
      AddNodes(NewNode, Data.SubCats^[i]);
    end;
  end;

Zacherl 25. Feb 2007 17:59

Re: Pointer of Record --> Record konvertieren
 
Bringt leider auch nichts .. aber wenn, dann müsste es auch Data^ heißen, oder?
Weil Data ist ja auch vom Typ PNodeData ..

xZise 25. Feb 2007 18:05

Re: Pointer of Record --> Record konvertieren
 
So ähnlich (hatte auch einen Recordpointer übergeben) hatte ich das gemacht:

Delphi-Quellcode:
procedure AddNodes(Root: PVirtualNode; Data: PCatData);
var
  i: integer;
  NodeData: PNodeData;
  NewNode: PVirtualNode;
begin
  with frmInteractive do
  begin
    NewNode := CatList.AddChild(Root);
    NodeData := CatList.GetNodeData(NewNode);
    NodeData.Caption := Data^.Caption;
    NodeData.ImageIndex := Data^.ImageIndex;
    NodeData.Panel := nil; // hinterher ändern
    for i := low(Data^.SubCats^) to high(Data^.SubCats^) do
    begin
      AddNodes(NewNode, Data^.SubCats^[i]);
    end;
  end;
end;
Aber ich weis nicht, wie das mit dem "PVirtualNode" is...

[edit]OOPs... Pointeralarm ^^ Hatte glatt die SubCats übersehen xD[/edit]

Daniel G 25. Feb 2007 18:06

Re: Pointer of Record --> Record konvertieren
 
Zitat:

Zitat von Florian Bernd
aber wenn, dann müsste es auch Data^ heißen, oder?

:wall: Ja, natürlich...

Dann hilft das sicher auch nicht, oder?

Delphi-Quellcode:
procedure AddNodes(Root: PVirtualNode; Data: PCatData);
var
  i: integer;
  NodeData: PNodeData;
  NewNode: PVirtualNode;
begin
  with frmInteractive do
  begin
    NewNode := CatList.AddChild(Root);
    NodeData := CatList.GetNodeData(NewNode);
    NodeData.Caption := Data^.Caption;
    NodeData.ImageIndex := Data^.ImageIndex;
    NodeData.Panel := nil; // hinterher ändern
    for i := low(Data^.SubCats) to high(Data^.SubCats) do
    begin
      AddNodes(NewNode, Data^.SubCats[i]);
    end;
  end;
Zitat:

Zitat von Florian Bernd
Weil Data ist ja auch vom Typ PNodeData ..

Stümmt nicht. :stupid: :wink:

//Edit: Der xZise war zu schnell...
Zitat:

[edit]OOPs... Pointeralarm ^^ Hatte glatt die SubCats übersehen xD[/edit]
Die Funktion erwartet aber einen Pointer... :wink:

Zacherl 25. Feb 2007 18:10

Re: Pointer of Record --> Record konvertieren
 
So, mit eurer Hilfe und mit einem vergessenen New() :wall: funktioniert es nun.

Vielen Dank :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:41 Uhr.

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