Здравствуйте!
Возникла необходимость переместить ссылки из браузера IE в мою программу и получить эту самую ссылку и ее текст. То есть если мышкой схватить эту http://forum.vingrad.ru, и перемесить ее на мою программу, то в результате я должен получить:
Текст - ссылку ссылка - http://forum.vingrad.ru
В статье Quadr0, о компоненте VirtualTreeView, есть пример работы с Drag and Drop этого самого компонента. Так в нем реализованно то что мне нужно, но работает его код только с Mozilla, Firefox, Netscape. А вот с IE не получается. Хотелось бы узнать почему так? В чем отличие? Понятно что нужные данные передаются по другому, но как? Помогите понять!
Вот пример кода:
| Код | procedure TfrmMain.AddUnicodeText(DataObject: IDataObject; Target: TVirtualStringTree; Mode: TVTNodeAttachMode); var // Структура, которая будет запрашивать указатеь на глобальные данные FormatEtc: TFormatEtc; // Структура с данными Medium: TStgMedium; // Указатель на строку OLEData, // Для прохода цикла с целью разделения текста на строки Head, Tail: PWideChar; // Узел, получающий новую ветку TargetNode, // Новая ветка Node: PVirtualNode; // Её данные Data: PItemNode; begin if Mode <> amNowhere then begin // Заполняем струкутру для получения ЮНИКОД-текста with FormatEtc do begin cfFormat := CF_UNICODETEXT; // Нет у нас никакого девайса... ptd := nil; // Нам нужно содержание (текст в данном случае) dwAspect := DVASPECT_CONTENT; // Нет страницы для мультистраничных данных lindex := -1; // Мы будем получать указатель на данные через глобальную память tymed := TYMED_HGLOBAL; end; // Есть ли ЮНИКОД-текст для нашего запроса? if DataObject.QueryGetData(FormatEtc) = S_OK then begin // Опа, есть, можем получить данные if DataObject.GetData(FormatEtc, Medium) = S_OK then begin // Вот они: OLEData := GlobalLock(Medium.hGlobal); if Assigned(OLEData) then begin Target.BeginUpdate; // Выбираем место для вставки, если переданное = nil TargetNode := Target.DropTargetNode; if TargetNode = nil then TargetNode := Target.FocusedNode; // Разбиваем текст на строки Head := OLEData; try while Head^ <> #0 do begin Tail := Head; while not (Tail^ in [WideChar(#0), WideChar(#13), WideChar(#10), WideChar(#9)]) do Inc(Tail); if Head <> Tail then begin // Добавляем новую ноду, если есть хотя бы один символ // для строки. Node := Target.InsertNode(TargetNode, Mode); Data := Target.GetNodeData(Node); Data^.Name := Head; SetLength(Data^.Name, (Tail - Head)); end; // Пропускаем табы if Tail^ = #9 then Inc(Tail); // Символы переноса каретки и конца строки if Tail^ = #13 then Inc(Tail); if Tail^ = #10 then Inc(Tail); // Шагаем дальше Head := Tail; end; finally GlobalUnlock(Medium.hGlobal); Target.EndUpdate; end; end; // Вот это лучше не забывать делать ReleaseStgMedium(Medium); end; end; end; end;
|
|