当在IDE中的主窗体上使用ShellTreeView / ShellListView关闭Delphi 2009项目时,索引超出范围(0)会生成异常。是否修复了ShellTreeView / ShellListView,以便消除异常?
答案 0 :(得分:3)
这是我第一次听说过这个。如果有任何安慰我可以在这里重现它。
您应该做的第一件事可能是在Quality Central中提交错误报告,并询问Codegear NNTP新闻组。
另外,尝试将TCustomShellListView.GetFolder更改为下面的代码,看看你是如何继续的。您需要重建软件包 - 并注意由于某种原因D2009在Windows \ System32中安装此软件包的第二个副本。我改名(到目前为止)没有任何不良影响。
function TCustomShellListView.GetFolder(Index: Integer): TShellFolder;
begin
if Index < FFolders.Count then
Result := TShellFolder(FFolders[Index])
else
Result := NIL;
end;
答案 1 :(得分:0)
{ TCustomShellTreeView }
...
TCustomShellTreeView = class(TCustomTreeView, IShellCommandVerb)
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override; //$$jp shellctrl.pas 26.08.2007: missing "override"
procedure Refresh(Node: TTreeNode);
...
destructor TCustomShellTreeView.Destroy;
begin
//$$jp: ClearItems;
//$$jp: raises EInvalidOperation and access-violations (shellctrl.pas 26.08.2007)
FRootFolder.Free;
inherited;
end;
答案 2 :(得分:0)
到目前为止,没有任何建议可以解决问题...但是如果我从一个演示项目中删除ShellListView组件然后关闭项目,则不会创建任何异常。我认为问题在于ShellListView组件而不是ShellTreeView。
问题可能比看上去要大。
答案 3 :(得分:0)
问题在设计时出现 。
以下是TShellListView
组件应用于ShellCtrls.pas
文件的解决方案:
destructor TCustomShellListView.Destroy;
begin
ClearItems;
if not (csDesigning in ComponentState) then // Avoid design time error
FFolders.Free;
FreeAndNil(FRootFolder);
inherited;
end;
procedure TCustomShellListView.DestroyWnd;
begin
ClearItems;
// Avoid error in inherited DestroyWnd procedure :
if csDesigning in ComponentState then
Items.Count := 0;
inherited DestroyWnd;
end;