Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Массив записей в качестве данных в TreeVirtualView


Автор: Dom 11.9.2008, 19:41
Создаю дочерний класс TMyTree от TVirtualDrawTree. Элементом данных является PTMyTreeNode. При обращении и попытках что-то изменить в массиве MyRule выдает ошибку Access violation. Почти уверен, что ошибка какая-то пустяковая, но найти и понять откуда она возникает не могу. 

Код

unit uMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, VirtualTrees, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    VirtualDrawTree1: TVirtualDrawTree;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TMyRule = record
    Name: string;
    Value: single;
end;

type
  PTMyTreeNode = ^TMyTreeNode;
  TMyTreeNode = record
    MyRule : array of TMyRule;
//   ...
end;

type
  TMyTree = class(TVirtualDrawTree)
  private
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyTree }

constructor TMyTree.Create(AOwner: TComponent);
begin
  inherited;
  
end;

destructor TMyTree.Destroy;
begin

  inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Tree: TMyTree;
TreeNode: PVirtualNode;
Data: PTMyTreeNode;
begin
  Tree := TMyTree.Create(nil);
  TreeNode := Tree.AddChild(nil);
  Tree.NodeDataSize := SizeOf(Data);
  Data := Tree.GetNodeData(TreeNode);

  SetLength(Data^.MyRule, 1);    //   <-- вот тут выдает ошибку Access violation
  Data^.MyRule[0].Name := 'MyName';
  Data^.MyRule[0].Value := 6.52;

end;

end.

Автор: aktuba 11.9.2008, 21:26
Цитата(Dom @  11.9.2008,  20:41 Найти цитируемый пост)
Код

  Tree := TMyTree.Create(nil);
  TreeNode := Tree.AddChild(nil);
  Tree.NodeDataSize := SizeOf(Data);
  Data := Tree.GetNodeData(TreeNode);


Это что-за каша??? Во-первых, создаешь нод, до того, как задал размер записей для нода. Во вторых - не правильный размер нода задал. Надо не SizeOf(Data), а SizeOf(TMyTreeNode);

Плюс - динамический массив в записи - не лучший вариант. Тогда уж лучше сделать ноды классами.

Автор: Dom 11.9.2008, 22:07
Спасибо за подсказку! Действительно каша...
А чем лучше классы в данном случае? Или какие проблемы могут возникнуть с динамическими массивами в составе записей? Безопасность выше? Или из соображений удобства? В двух словах хотя бы, может действительно пока не поздно перейти на классы...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)