Вопрос по Drag&Drop
От: Аноним  
Дата: 17.07.06 15:42
Оценка:
Добрый день.

Мне потребовалось создать приложение, которое можети принимать данные путем перетаскивания их на форму из других приложений.
Причем, если перетащили 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 формата клипбоарда ?

Заранее спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.