【发布时间】:2011-06-06 07:51:48
【问题描述】:
给定的代码在 Delphi 2007 中没有任何问题。但是在 Delphi 2009 中我遇到了异常。
访问冲突显示读取地址 $00000000。
问题只存在于分配字符串时,它适用于数字。
另外,当我通过调试器选项手动分配 Data.Text 时,我没有得到任何 AV - 它可以工作。
老实说,我迷路了,有人可以帮我解决这个问题吗?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, VirtualTrees, StdCtrls;
type
TTest = record
Text: String;
Number: Integer;
end;
PTest = ^TTest;
type
TTestArray = array of TTest;
type
TForm1 = class(TForm)
VirtualStringTree1: TVirtualStringTree;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure VirtualStringTree1InitNode(Sender: TBaseVirtualTree; ParentNode,
Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
TestArray: array of TTest;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
SetLength(TestArray, 1);
TestArray[0].Text := 'test';
TestArray[0].Number := 12345;
VirtualStringTree1.AddChild(VirtualStringTree1.RootNode, @TestArray[0]);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
VirtualStringTree1.NodeDataSize := SizeOf(TTest);
end;
procedure TForm1.VirtualStringTree1InitNode(Sender: TBaseVirtualTree;
ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
Data: PTest;
NodeData: PPointer;
begin
Data := Sender.GetNodeData(Node);
NodeData := Sender.GetNodeData(Node);
Data.Number := PTest(NodeData^)^.Number;
Data.Text := PTest(NodeData^)^.Text; //crash here!
end;
end.
【问题讨论】:
-
只是伙计们?我知道我是少数,但你必须把它揉进去吗? :-))
-
@Marjan 在美式英语中,人们通常以一种性别中立的方式来称呼他们。也就是说,如果这真的是 Wodzu 的样子,那么我会接受他/她/它想给你打电话的任何东西。看起来不像是那种让人想反其道而行之的生物!
-
@David:是的,我知道,它刚刚引起了我的注意,我无法抗拒发表评论的冲动。一定是因为我有点脾气暴躁,因为我睡过头了,因为我在一个长周末后忘记重新启动我的闹钟......(你确实注意到了笑脸,不是吗?)但你是对的,如果 Wodzu 是像他的头像一样,我会尽量不弄乱他的头发:-)
-
哈哈,伙计们!;)我是一个非常友好且容易驯服的人,相信我;)
-
您还能期待什么?您的代码专门设计为崩溃,原因与 Virtual TreeView 无关。
标签: string delphi delphi-2009 virtualtreeview tvirtualstringtree