Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив записей в качестве данных в TreeVirtualView 
V
    Опции темы
Dom
Дата 11.9.2008, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 3
Всего: 4



Создаю дочерний класс 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.

PM MAIL   Вверх
aktuba
Дата 11.9.2008, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 7
Всего: 38



Цитата(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);

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


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Dom
Дата 11.9.2008, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 3
Всего: 4



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

Это сообщение отредактировал(а) Dom - 11.9.2008, 22:09
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.