Текущий архив: 2003.05.19;
Скачать: CL | DM;
ВнизКак получить в Edit е перетащенный на него линк из WebBrowser а Найти похожие ветки
← →
Alekseev (2003-03-19 23:37) [0]На начало перетаскивания реакции нет (т.е. отладчик не всплывает), в Edit"е тоже нет никаких изменений. Пока страница не загружена, все нормально, как только загрузилась, ничего нету :(. Если можно исходничек какой-нибудь. Пожалуйста.
Спасибо заранее.
← →
nikkie (2003-03-20 15:01) [1]Слушай, я ж тебе все ключевые слова сказал... Если непонятно - значит надо почитать что-нибудь про COM. Если основы понимаешь, то код за час пишется...
Ну да ладно... Хочешь исходник, вот тебе.
unit Unit2;
interface
uses ActiveX, ComObj, ShlObj, Types, Windows;
type
TDropTarget = class(TComObject, IDropTarget)
private
FURLFormat: TClipFormat;
FDropEffect: Longint;
public
constructor Create;
destructor Destroy; override;
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;
end;
implementation
constructor TDropTarget.Create;
begin
FURLFormat := RegisterClipboardFormat(CFSTR_SHELLURL);
end;
destructor TDropTarget.Destroy;
begin
// check that the object is destroyed
MessageBox(0, "Destroyed", "", MB_OK);
end;
function TDropTarget.DragEnter(const dataObj: IDataObject; grfKeyState: Longint;
pt: TPoint; var dwEffect: Longint): HResult;
var
fmt: FORMATETC;
hr: HResult;
begin
fmt.cfFormat := FURLFormat;
fmt.ptd := nil;
fmt.dwAspect := DVASPECT_CONTENT;
fmt.lindex := -1;
fmt.tymed := TYMED_HGLOBAL;
hr := dataObj.QueryGetData(fmt);
if Succeeded(hr) then FDropEffect := DROPEFFECT_LINK
else FDropEffect := DROPEFFECT_NONE;
dwEffect := FDropEffect;
Result := S_OK;
end;
function TDropTarget.DragOver(grfKeyState: Longint; pt: TPoint;
var dwEffect: Longint): HResult;
begin
dwEffect := FDropEffect;
Result := S_OK;
end;
function TDropTarget.DragLeave: HResult;
begin
Result := S_OK;
end;
function TDropTarget.Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint;
var dwEffect: Longint): HResult;
var
fmt: FORMATETC;
medium: STGMEDIUM;
hr: HResult;
url: PChar;
begin
fmt.cfFormat := FURLFormat;
fmt.ptd := nil;
fmt.dwAspect := DVASPECT_CONTENT;
fmt.lindex := -1;
fmt.tymed := TYMED_HGLOBAL;
hr := dataObj.GetData(fmt, medium);
if Succeeded(hr) then begin
url := GlobalLock(medium.hGlobal);
MessageBox(0, url, "URL", MB_OK);
GlobalUnlock(medium.hGlobal);
ReleaseStgMedium(medium);
FDropEffect := DROPEFFECT_LINK;
end else begin
FDropEffect := DROPEFFECT_NONE;
end;
dwEffect := FDropEffect;
Result := S_OK;
end;
end.
Использование:
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterDragDrop(Edit1.Handle, TDropTarget.Create);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
RevokeDragDrop(Edit1.Handle);
end;
Еще нужен вызов OleInitialize. Например, в файле проекта:
begin
OleInitialize(nil);
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
OleUninitialize();
end.
← →
Alekseev (2003-03-20 21:22) [2]Спасибо nikkie.
Обязательно прочитаю все что можно про COM, я просто до этого момента не сталкивался, и плохо представляю, что это такое.
Еще раз спасибо :)
Страницы: 1 вся ветка
Текущий архив: 2003.05.19;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.007 c