Когда проект Delphi 2009 закрывается с помощью ShellTreeView / ShellListView на главной форме в IDE Index, генерируются исключения за пределы (0). Есть ли исправление для ShellTreeView / ShellListView, чтобы исключить исключения?





Я впервые об этом слышу. Если это хоть как-то утешит, я могу воспроизвести это здесь.
Первое, что вам следует сделать, это, вероятно, отправить отчет об ошибке в Центр качества и спросить в группах новостей 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;
{ 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;
Ничего из предложенного до сих пор не помогло решить проблему ... но если я удалю компонент ShellListView из демонстрационного проекта, а затем закрою проект, исключение не будет создано. Я думаю, что проблема в компоненте ShellListView, а не в ShellTreeView.
Проблема может быть больше, чем кажется.
Проблема возникает Только во время разработки.
Вот решение для компонента 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;
Я полностью согласен - это должно быть опубликовано в QC, тогда другие смогут проголосовать за него там.