powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IDropTarget "глушит" Exception
2 сообщений из 2, страница 1 из 1
IDropTarget "глушит" Exception
    #39717904
Stranger484
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Набросал я небольшой код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
unit Unit1;

interface

uses
  Windows, Messages, Dialogs, SysUtils, Classes, Controls, Forms, ActiveX, ShlObj;

type
  TForm1 = class(TForm, IDropTarget)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure OpenFile(const dataObj: IDataObject);
  private
    { Private declarations }
    DropTargetHelper: IDropTargetHelper;
    function DragEnter(const dataObj: IDataObject; grfKeyState: Longint;
      pt: TPoint; var dwEffect: Longint): HResult; stdcall;
    function DragOver(grfKeyState: Longint; pt: TPoint;
      var dwEffect: Longint): HResult; stdcall;
    function DragLeave: HResult; stdcall;
    function Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint;
      var dwEffect: Longint): HResult; stdcall;

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

function TForm1.DragEnter(const dataObj: IDataObject; grfKeyState: Longint;
  pt: TPoint; var dwEffect: Longint): HResult;
begin
  Result := DropTargetHelper.DragEnter(Handle, DataObj, pt, dwEffect);
end;

function TForm1.DragLeave: HResult;
begin
  Result := DropTargetHelper.DragLeave;
end;

function TForm1.DragOver(grfKeyState: Longint; pt: TPoint;
  var dwEffect: Longint): HResult;
begin
  dwEffect := DROPIMAGE_INVALID;
  Result:=DropTargetHelper.DragOver(pt, dwEffect);
end;

function TForm1.Drop(const dataObj: IDataObject; grfKeyState: Longint;
  pt: TPoint; var dwEffect: Longint): HResult;
begin
  dwEffect:=DROPEFFECT_COPY;
  Result:=DropTargetHelper.Drop(dataObj, pt, dwEffect);
  try
    OpenFile(dataObj);
  except
    on E:Exception do
      ShowMessage(E.Message);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OleInitialize(nil);
  CoCreateInstance(CLSID_DragDropHelper, nil, CLSCTX_INPROC_SERVER,
        IDropTargetHelper, DropTargetHelper);
  RegisterDragDrop(Handle, Self);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  RevokeDragDrop(Handle);
  OleUninitialize;
end;

procedure TForm1.OpenFile(const dataObj: IDataObject);
begin
  Raise Exception.Create('Test');
end;

end.


И заметил некоторую особенность: Если не обрабатывать исключение (убрать try ... except в методе TForm1.Drop), то оно и не отобразится.
Кто может объяснить для чего это сделано, и со всеми ли интерфейсами это так, просто раньше не обращал внимания.
...
Рейтинг: 0 / 0
IDropTarget "глушит" Exception
    #39717919
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stranger484оно и не отобразитсяЕсли я правильно понял, то под термином "отобразится" подразумевается появление окна с сообщением об ошибке. В обычной для VCL ситуации с необработанным исключением оно передается в конечном итоге в Application.HandleException, где и решается вопрос с показом окна с ссобщением об ошибке. Но в случае D&D исключение ловиться внутри COM системы, которая не отображает никаких окон в таких ситуациях.

Но практика передачи исключений в сторонний код крайне не правильная. Имеем как минимум утечку памяти. При передаче интерфейсов в сторонний код лучше использовать конструкции вида

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function TMyObj.Func: HRESULT;
begin
  try
    // Job here
    Result := S_OK;
  except
    Result := E_FAIL;
  end;
end;
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IDropTarget "глушит" Exception
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]