Delphi, извлекайте как видимый текст, так и скрытую гиперссылку при вставке в приложение Delphi - PullRequest
0 голосов
/ 12 мая 2019

Как я могу это сделать? Я искал по всему интернету, чтобы найти некоторые подсказки, но не смог. Вы можете щелкнуть ссылку в браузере и скопировать ее, а затем вставить ее, например, в документ Word. Я использовал tcxGrid с некоторыми полями и хочу вставить эту ссылку в поле. Поле покажет вам текст, но если вы щелкните по нему, откроется браузер с этой ссылкой. Я могу исправить все последующие части, но я не знаю, как извлечь текст и ссылку из буфера обмена. Кто-нибудь знает как это сделать?

Я нашел старую статью, которая описывает, как вы можете это сделать, но результат не очень хороший. Я получаю текст на китайском языке вместо HTML .. см. Ниже мой тестовый код:

function TForm2.clipBoardAsHTML: string;
var
  CF_HTML: UINT;
  CFSTR_INETURL: UINT;
  URL: THandle;
  HTML: THandle;
  Ptr: PChar;
begin
  CF_HTML := RegisterClipboardFormat('HTML Format');
  CFSTR_INETURL := RegisterClipboardFormat('UniformResourceLocator');
  result := '';
  with Clipboard do
  begin
    Open;
    try
      HTML := GetAsHandle(CF_HTML);
      if HTML <> 0 then
      begin
        Ptr := PChar(GlobalLock(HTML));
        if Ptr <> nil then
        try
          Result := Ptr;
        finally
          GlobalUnlock(HTML);
        end;
      end;
    finally
      Close;
    end;
  end;
end;

Данные выглядят так: 敖 獲 潩 㩮 ⸱ര 匊 慴 瑲 呈 䱍 〺〰〰〰 ㄲ ര 䔊 摮 呈 䱍 〺〰〰㈰ 㐳 ള 匊 慴 и многое другое.

Значит, с моим кодом что-то не так ..: (

Рекомендованный формат CFSTR_INETURL не существует в буфере обмена при получении копии из Firefox и Excel, поэтому я не смог получить никаких данных, используя этот формат.

==================================

Последний тест - получение имен форматов.

procedure TForm2.Button2Click(Sender: TObject);
var
  i: integer;
  s: string;
  szFmtBuf: array[0..350] of PWideChar;
  fn: string;
  fmt: integer;
begin
  Memo1.Clear;
  for i := 0 to clipBoard.FormatCount - 1 do
  begin
    fmt := clipBoard.Formats[i];
    getClipBoardFormatName(fmt,@szFmtBuf,sizeOf(szFmtBuf));
    fn := WideCharToString(@szFmtBuf);
    if fmt >= 49152 then
    Memo1.Lines.Add(fmt.ToString+ ' - '+fn);
  end;
end;

Наконец-то я заставил этот код работать :), но главный вопрос, как я получу URL из буфера обмена, все еще не решен. :( Если я перебираю все найденные форматы, я получаю от них только мусор. Форматы из Firefox выглядят так:

49161 - DataObject
49451 - text/html
49348 - HTML Format
50225 - text/_moz_htmlcontext
50223 - text/_moz_htmlinfo
50222 - text/x-moz-url-priv
49171 - Ole Private Data

1 Ответ

1 голос
/ 12 мая 2019

Это действительно зависит от того, какой формат (ы) копир решает поместить в буфер обмена. Он может помещать несколько форматов в буфер обмена одновременно.

Гиперссылка с URL и необязательным текстом может быть представлена ​​с помощью:

  • формат Shell CFSTR_INETURL (зарегистрированное имя: 'UniformResourceLocator'), содержащий URL-адрес ссылки, и формат CF_(UNICODE)TEXT, содержащий текст ссылка, если есть.

  • формат CF_HTML (зарегистрированное имя: 'HTML Format'), содержащий целые фрагменты HTML, включая <a> гиперссылки и необязательный отображаемый текст.

Класс VCL TClipboard имеет HasFormat() и GetAsHandle() методы для доступа к данным форматов, отличных от CF_(UNICODE)TEXT (которые могут можно получить с помощью свойства TClipboard.AsText).

Вам нужно использовать функцию Win32 RegisterClipboardFormat() во время выполнения, чтобы получить идентификаторы формата для CFSTR_INETURL и CF_HTML (используя строки имен, упомянутые выше), прежде чем вы сможете использовать эти идентификаторы с HasFormat() и GetAsHandle().

Вы также можете перечислить форматы, которые в настоящее время доступны в буфере обмена, используя свойства TClipboard.FormatCount и TClipboard.Formats[]. Для идентификаторов формата в диапазоне $C000..$FFFF используйте функцию Win32 GetClipboardFormatName(), чтобы получить имена, которые были первоначально зарегистрированы в RegisterClipboardFormat().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...