Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2008, 14:48   #1
AnalogXP
Пользователь
 
Аватар для AnalogXP
 
Регистрация: 11.01.2008
Сообщений: 42
По умолчанию Переместить ссылки из браузера

Здравствуйте!

Хочу в свою программу получить ссылки и их описание (текст) через перетаскивание.
То есть в браузере нажимаю на текст ссылки и перетаскиваю на мою программу, в результате получаю текст и его ссылку.
Как это реализовать? Дайте идею.
AnalogXP вне форума Ответить с цитированием
Старый 10.03.2008, 17:28   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Если это в принципе возможно (перетаскивание ссылок), то идея такая - при бросании ссылки на окно, программа получит сообщение от системы с параметрами, как при перетаскивании файлов.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 10.03.2008, 19:28   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вот вам код для получения ссылки с описанием из IE по нажатию кнопки. Если вам нужно осуществить именно DragDrop, возьмете только нужный кусок.
Код:
procedure TFVMZWebDB.GetIEUrl;
var Cliente_DDE: TDDEClientConv;
    temp:PChar;
    i: integer;
    tmp,tmps,tmpd: string;
    ie: hwnd;
    buff: array [0..127] of Char;
begin
try
Cliente_DDE:= TDDEClientConv.Create( nil );
with Cliente_DDE do
try
SetLink( 'IExplore','WWW_GetWindowInfo');
temp := RequestData('1');
if temp>'' then
begin
tmp:=StrPas(temp);
for i:=2 to Length(tmp) do
if tmp[i]<>'"' then
tmps:=tmps+tmp[i] else
break;
ie:=FindWindow(pchar('IEFrame'),nil);
GetWindowText(ie, buff, sizeof(buff));
tmp:=StrPas(buff);
for i:=1 to Length(tmp) do
if tmp[i]<>'-' then
tmpd:=tmpd+tmp[i] else
break;
tmpd:=TrimRight(tmpd);
ListBox2.Items.Append(tmps+';'+tekind+';'+tmpd+';'+'5');
edurl:=True;
end;
finally
StrDispose(temp);
CloseLink;
end;
Cliente_DDE.Free;
except
ShowMes(12,332,'Error V001');
Application.ProcessMessages;
if snd then
PlaySound('ERROR',0,SND_RESOURCE or SND_SYNC);
end;
end;
Тут есть немного лишнего, некогда вычищать, думаю сами разберетесь...
mihali4 вне форума Ответить с цитированием
Старый 11.03.2008, 12:08   #4
AnalogXP
Пользователь
 
Аватар для AnalogXP
 
Регистрация: 11.01.2008
Сообщений: 42
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
Если это в принципе возможно (перетаскивание ссылок), то идея такая - при бросании ссылки на окно, программа получит сообщение от системы с параметрами, как при перетаскивании файлов.
Возможно. Есть такой набор компонентов как "DragDrop". Вот как все это делается, я и хочу узнать. У VirtualStringTree есть пример с Drag and Drop. Так вот, там передается вроде через Буфер обмена (пока не понял - при перетаскивании чего либо, оно помещяется сначал в буфер?). И дальше обрабатывается CF_UNICODETEXT, в результате чего получаем и текст ссылки и саму ссылку.

вот пример:

Код:
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;
Цитата:
Вот вам код для получения ссылки с описанием из IE по нажатию кнопки.
mihali4, я имел ввиду то, что все ссылки которые в данный момент есть на этой странице (текстов и картинок - на которые можно кликнуть), можно было переместить в мою программу.
AnalogXP вне форума Ответить с цитированием
Старый 11.03.2008, 12:13   #5
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Цитата:
mihali4, я имел ввиду то, что все ссылки которые в данный момент есть на этой странице (текстов и картинок - на которые можно кликнуть), можно было переместить в мою программу.
А на кой здесь dragndrop тебе mihali4 показал как забрать активный урл из браузера, забирай урл, и парси его как душе угодно, чтож ты пользователя еще и заставляешь ссылки таскать
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 11.03.2008, 12:49   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от Квэнди Посмотреть сообщение
А на кой здесь dragndrop ... забирай урл, и парси его как душе угодно, чтож ты пользователя еще и заставляешь ссылки таскать
Совершенно верно. Мне нравится как сделано, например, в DownLoad Master-е - выбираешь "Загрузить все с помощью DownLoad Master", он показывает список всех имеющихся в тексте страницы ссылок, ставим "птицы" против нужных ссылок и т.д.
Мне кажется, вам нужно именно такой подход реализовать. Вы представляете, юзер открыл страничку с парой сотен порнофотографий и ему почему-то (?!) захотелось все их скопировать к себе на диск... Вы хотите предложить ему делать две сотни перетаскиваний???
Да он и вас, и вашу примочку проклянет!

Последний раз редактировалось mihali4; 11.03.2008 в 12:53.
mihali4 вне форума Ответить с цитированием
Старый 11.03.2008, 14:51   #7
AnalogXP
Пользователь
 
Аватар для AnalogXP
 
Регистрация: 11.01.2008
Сообщений: 42
По умолчанию

А зачем качать? Например нашли адрес на статью, инфо, новость. Что же, качать из за одного адреса все ссылки из окна? Хранить где-то целые страницы? Пользователь сам сохранит что ему нужно. Я же хочу помочь сохнить адрес.
Большинство менеджеров закладок имеют плавающего окошка, на котором можно бросать ссылки прямо из окна.

Цитата:
Вы хотите предложить ему делать две сотни перетаскиваний???
Только одну - на эту страницу.

Последний раз редактировалось AnalogXP; 11.03.2008 в 14:56.
AnalogXP вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как переместить курсор DBGrid1 / Table1 1900s БД в Delphi 3 28.05.2008 17:49
Как переместить DXImageList ? SG13 Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 30.03.2008 11:54
переместить память из TMemoryStream в промежуточный буфер и в буфере найти слова Дядя Фёдор Общие вопросы Delphi 2 02.10.2007 00:20
перехват ссылки из браузера Scorpeon Общие вопросы Delphi 6 21.06.2007 19:08
Как переместить картинку? Костя Помощь студентам 2 23.12.2006 17:53