【发布时间】:2014-09-11 05:34:45
【问题描述】:
使用 TreeNode.MoveTo(...) 方法有时无法正常工作并引发“访问冲突”异常。
大多数时候有效,有些时候无效。
大多数时候'模块 COMCTL32.DLL 中的访问冲突。读取地址 FEEEFEFA' 和程序崩溃/冻结。
这是我的代码。
procedure TForm1.FormShow(Sender: TObject);
var
I, sectioncount: Integer;
parent, child: TTreeNode;
begin
sectioncount := 0;
for I := 0 to 19 do
begin
if I mod 5 = 0 then
begin
parent := TreeView1.Items.AddChild(nil, 'Section: ' + IntToStr(sectioncount));
Inc(sectioncount);
end;
child := TreeView1.Items.AddChild(parent, 'Child: ' + IntToStr(I));
end;
TreeView1.Items[0].Expand(True);
end;
procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var src, dst : TTreeNode;
I : Integer;
begin
dst := TreeView1.DropTarget;
for I := 0 to TreeView1.SelectionCount - 1 do
begin
src := TreeView1.Selections[I];
src.MoveTo(dst,naInsert);
end;
end;
procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := true;
end;
添加 from 到项目,添加树视图 set tree view dragmode dmAutomatic 和 multiselect true。
然后
使用 ctrl 选择以下顺序的 3 个连续节点。 选择中间节点, 选择底部节点, 选择顶部节点。 并将节点按第一个节点拖动到另一个可以看到 AV 错误的地方。
或从上到下选择三个节点并从底部节点拖动AV出现。
或使用控制键按以下顺序选择三个节点:-首先是“child 1”,然后是“child 2”,然后是“child 0”,最后通过选择“Child 0”拖放节点
【问题讨论】:
-
错误可能在您的代码中。我们如何重现故障?哪个版本的 Delphi?
-
德尔福 XE5。为了重现它,大多数时候它可以正常工作,但有时它会引发 AV 错误。
-
我怀疑代码是否足以触发问题。您编写问题的方式表明您认为树视图 vcl 代码中存在错误。毫无疑问存在错误,但我怀疑 MoveTo 已损坏。更有可能问题出在我们看不到的代码中。无论如何,调试器告诉你什么?引发错误时的堆栈跟踪是什么。这是调查的第一步。
-
该地址不在 comctl32 中。所以这不是它真正所说的。什么是调用堆栈?
-
请显示调用堆栈。你知道什么是调用栈吗?如果不是,我可以解释一下吗?
标签: delphi delphi-xe5