Добрый день.
Мне потребовалось создать приложение, которое можети принимать данные путем перетаскивания их на форму из других приложений.
Причем, если перетащили HTML (например их ворда), то программа должа понять, что перетаскивают HTML и провести над ним
определенные оперции. Для этого я наследовал IDropTarget и реализовал необходимые функции.
type
TMainForm = class(TForm, IDropTarget)
...
private
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;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
...
В функции Drop я пишу следующее:
function TMainForm.Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult;
begin
Result := S_OK;
if dataObj = nil then Exit;
ProcessHTMLFormat(dataObj);
end;
Функция ProcessHTMLFormat:
function TMainForm.ProcessHTMLFormat(const dataObj: IDataObject) : boolean;
var aFmtEtc : TFORMATETC;
aStgMed : TSTGMEDIUM;
pData : PChar;
i, len : Integer;
begin
Result := False;
with aFmtEtc do
begin
cfFormat := 49356;
ptd := nil;
dwAspect := DVASPECT_CONTENT;
lindex := -1;
tymed := TYMED_HGLOBAL;
end;
if Succeeded(dataObj.GetData(aFmtEtc, aStgMed)) then
begin
try
pData := GlobalLock(aStgMed.hGlobal);
len := GlobalSize(aStgMed.hGlobal);
i := Pos('<',pData);
if i > 0 then
begin
i := i - 1;
CopyMemory(pData,pData + i, len - i);
len := len - i;
end;
SaveDataToFile(GetTextFromData(dataObj),'html',pData,len);
Result := True;
finally
GlobalUnlock(aStgMed.hGlobal);
ReleaseStgMedium(aStgMed);
end;
end;
end;
Обратитие внимание, что cfFormat в структуре aFmtEtc я выставил в 49356, так как не было определения этого формата нигде. Я его определил экспериментальным путем.
Все работало нормально, но беда в том, что значение это не постоянно и может меняться. Как бы узнать, какой номер у HTML формата клипбоарда ?
Заранее спасибо.
Здравствуйте, Аноним, Вы писали:
[Skip]
А>Обратитие внимание, что cfFormat в структуре aFmtEtc я выставил в 49356, так как не было определения этого формата нигде. Я его определил экспериментальным путем.
А>Все работало нормально, но беда в том, что значение это не постоянно и может меняться. Как бы узнать, какой номер у HTML формата клипбоарда ?
Может это
:
const
CF_HTML = 'HTML Format';
...
with aFmtEtc do
cfFormat := RegisterClipboardFormat(CF_HTML);
Здравствуйте, Danchik, Вы писали:
D>Может это :
D>D>const
D> CF_HTML = 'HTML Format';
D>...
D> with aFmtEtc do
D> cfFormat := RegisterClipboardFormat(CF_HTML);
D>
То есть, Вы хотите сказать, что если формат уже был зарегестрирован, то функция вернет мне его ID ?
И чему равно
CF_HTML ?
Последний вопрос отменяется. Браузер сглючил.
Здравствуйте, <Аноним>, Вы писали:
А>То есть, Вы хотите сказать, что если формат уже был зарегестрирован, то функция вернет мне его ID ?
HTML Clipboard Format... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde