Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как получить ссылку и текст


Автор: Pavelbej 8.4.2008, 18:57
Здравствуйте!

Возникла необходимость переместить ссылки из браузера 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;

Автор: Pavelbej 10.4.2008, 17:24
Пока решил проблему лишь частично, вернее только ссылки могу извлечь, а вот с текстом не получается. Может кто знает как проблему решить, помогите.

Вот что удалось пока сделать:
Код

var
  FMT: FORMATETC;
  MED: STGMEDIUM;
  Size: DWORD;
  Buffer: PChar;
  Text2: string;
begin
if DataObject <> nil then
begin
      FMT.cfFormat := CF_TEXT;
      FMT.ptd := nil;
      FMT.dwAspect := DVASPECT_CONTENT;
      FMT.lindex := -1;
      FMT.tymed := TYMED_HGLOBAL;
      DataObject.GetData(FMT, MED);
      Size := GlobalSize(MED.hGlobal);
      Buffer := GlobalLock(MED.hGlobal);
      SetString(Text2, Buffer, Size);
      GlobalUnlock(MED.hGlobal);
      ReleaseStgMedium(MED);
      memo1.Lines.Add(text2);
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)