IDE のメインフォームで ShellTreeView/ShellListView を使用して Delphi 2009 プロジェクトを閉じると、Index out of bounds(0) 例外が生成されます。例外を排除できるように、ShellTreeView/ShellListView の修正はありますか?
4 に答える
それは私がこれについて聞いたのは初めてです。慰めになる場合は、ここで再現できます。
最初に行うべきことは、おそらくQuality Centralにバグ レポートを提出し、Codegear NNTP ニュースグループで質問することです。
また、TCustomShellListView.GetFolder を以下のコードに変更してみて、うまくいくかどうかを確認してください。パッケージを再構築する必要があります。また、何らかの理由で D2009 がこのパッケージの 2 つ目のコピーを Windows\System32 にインストールすることに注意してください。私はそれを(今のところ)何の悪影響もなく改名しました。
function TCustomShellListView.GetFolder(Index: Integer): TShellFolder;
begin
if Index < FFolders.Count then
Result := TShellFolder(FFolders[Index])
else
Result := NIL;
end;
これまでのところ、問題を解決するために提案されたものは何もありません...しかし、デモ プロジェクトから ShellListView コンポーネントを削除してからプロジェクトを閉じても、例外は作成されません。問題は、ShellTreeView ではなく、ShellListView コンポーネントにあると思います。
問題は見た目よりも大きい場合があります。
この問題は、設計時にのみ発生します。
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;
{ 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;