Исправление ShellTreeView / ShellListView в Delphi 2009

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
3 501
4

Ответы 4

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

Первое, что вам следует сделать, это, вероятно, отправить отчет об ошибке в Центр качества и спросить в группах новостей 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;

Я полностью согласен - это должно быть опубликовано в QC, тогда другие смогут проголосовать за него там.

Argalatyr 01.01.2009 19:50
{ 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;

Другие вопросы по теме