Исправление ошибки "Invalid pointer operation" при использовании интерфейса IDropTarget в Delphi 2009
Вопрос, который вы задали, связан с использованием интерфейса IDropTarget в среде разработки Delphi 2009. Ошибка "Invalid pointer operation" возникает при закрытии приложения, и, судя по всему, связана с неправильным управлением памятью. Вы привели код, который вы получили из ответа на Stack Overflow, и адаптировали его под свою среду. Все работает корректно, пока вы не пытаетесь закрыть приложение.
Описание проблемы
Вы столкнулись с ошибкой "Invalid pointer operation" после закрытия приложения, использующего интерфейс IDropTarget. Ошибка исчезает, если удалить строку Target.Free;, но это не является решением проблемы. Вы новичок в использовании интерфейсов, и после изучения материалов в интернете, так и не смогли понять, в чем заключается проблема.
Подробности кода
В вашем коде unit DragAndDrop.pas определен класс TDropTarget, который наследуется от TInterfacedObject и реализует интерфейс IDropTarget. В unit Unit1.pas создается экземпляр TDropTarget в процедуре FormCreate и освобождается в FormDestroy.
Причины ошибки
Проблема заключается в неправильном управлении объектами, которые поддерживают интерфейсы. Интерфейсы используют систему ссылочного подсчета, и при освобождении объекта, который реализует интерфейс, необходимо убедиться, что все ссылки на интерфейс были уничтожены.
Решение проблемы
Для корректного управления ссылками необходимо, чтобы объект TDropTarget управлялся компонентом, к которому он привязан. В данном случае, это должен быть компонент TMemo. Вместо того, чтобы создавать и удалять объект TDropTarget вручную, следует делегировать эту задачу самому компоненту.
Изменения в коде
В unit DragAndDrop.pas класс TDropTarget должен быть изменен так, чтобы не зависеть от HWND, а принимать обработчик события OnDrop в конструкторе. В unit Unit1.pas класс TMemo должен быть расширен, чтобы включать создание и удаление объекта IDropTarget в переопределенных методах CreateWnd и DestroyWnd соответственно.
Пример кода
unit DragAndDrop;
interface
uses
Windows, ActiveX, ShellAPI, StrUtils;
type
TDropEvent = procedure(FileNames: TArrayOfString) of object;
TDropTarget = class(TInterfacedObject, IDropTarget)
private
FOnDrop: TDropEvent;
// ... другие приватные поля ...
public
constructor Create(AOnDrop: TDropEvent);
// ... другие публичные методы ...
end;
implementation
// ... реализация класса TDropTarget ...
end.
unit Unit1;
interface
uses
// ... другие используемые модули ...
type
TMemo = class(StdCtrls.TMemo)
private
Target: IDropTarget;
FOnDrop: TDropEvent;
procedure OnFilesDrop(FileNames: TArrayOfString);
protected
procedure CreateWnd; override;
procedure DestroyWnd; override;
public
property OnDrop: TDropEvent read FOnDrop write FOnDrop;
end;
TForm1 = class(TForm)
Memo1: TMemo;
// ... другие поля формы ...
end;
implementation
{$R *.dfm}
procedure TMemo.CreateWnd;
begin
inherited CreateWnd;
if Target = nil then
Target := TDropTarget.Create(OnFilesDrop);
RegisterDragDrop(Handle, Target);
end;
procedure TMemo.DestroyWnd;
begin
RevokeDragDrop(Handle);
inherited DestroyWnd;
Target := nil;
end;
// ... другие методы класса TMemo ...
end.
Заключение
После внесения предложенных изменений в код, управление интерфейсом IDropTarget будет передано компоненту TMemo, который будет самостоятельно регистрировать и отменять регистрацию объекта TDropTarget при своем создании и уничтожении. Это позволит избежать ошибок, связанных с неправильным управлением памятью и ссылками на интерфейсы.
Пользователь столкнулся с ошибкой 'Invalid pointer operation' при работе с интерфейсом `IDropTarget` в Delphi 2009, которая возникает при закрытии приложения и связана с неправильным управлением памятью при использовании интерфейсов, поддерживающих ссыло
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.