Delphi 2009 ShellTreeView / ShellListView Исправление - PullRequest
3 голосов
/ 31 декабря 2008

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

Ответы [ 4 ]

3 голосов
/ 31 декабря 2008

Это первый раз, когда я услышал об этом. Если это утешит, я могу воспроизвести это здесь.

Первое, что вы должны сделать, это, вероятно, подать отчет об ошибке в 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;
0 голосов
/ 14 сентября 2009

Проблема возникает только во время разработки.

Вот решение для компонента 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;
0 голосов
/ 01 января 2009

Ничто из предложенного пока не работает, чтобы решить проблему ... но если я удаляю компонент ShellListView из демонстрационного проекта и затем закрываю проект, исключение не создается. Я думаю, что проблема в компоненте ShellListView, а не в ShellTreeView.

Проблема может быть больше, чем кажется.

0 голосов
/ 01 января 2009
{ 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;
...