Вопрос по 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 формата клипбоарда ?

Заранее спасибо.
Re: Вопрос по Drag&Drop
От: Danchik Украина  
Дата: 17.07.06 15:54
Оценка:
Здравствуйте, Аноним, Вы писали:

[Skip]

А>Обратитие внимание, что cfFormat в структуре aFmtEtc я выставил в 49356, так как не было определения этого формата нигде. Я его определил экспериментальным путем.

А>Все работало нормально, но беда в том, что значение это не постоянно и может меняться. Как бы узнать, какой номер у HTML формата клипбоарда ?

Может это :
const
  CF_HTML = 'HTML Format';
...

  with aFmtEtc do
    cfFormat := RegisterClipboardFormat(CF_HTML);
Re[2]: Вопрос по Drag&Drop
От: Аноним  
Дата: 17.07.06 19:40
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Может это :

D>
D>const
D>  CF_HTML = 'HTML Format';
D>...

D>  with aFmtEtc do
D>    cfFormat := RegisterClipboardFormat(CF_HTML);
D>


То есть, Вы хотите сказать, что если формат уже был зарегестрирован, то функция вернет мне его ID ?
И чему равно CF_HTML ?
Re[3]: Вопрос по Drag&Drop
От: Аноним  
Дата: 17.07.06 19:41
Оценка:
Последний вопрос отменяется. Браузер сглючил.
Re[3]: Вопрос по Drag&Drop
От: ekamaloff Великобритания  
Дата: 18.07.06 05:27
Оценка:
Здравствуйте, <Аноним>, Вы писали:

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