Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Скопировать HTML-код в буфер обмена

Delphi , ОС и Железо , Буфер обмена

Скопировать HTML-код в буфер обмена

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  If you've ever tried sticking html into the clipboard using the usual CF_TEXT 
  format then you might have been disappointed to discover that wysiwyg html 
  editors paste your offering as if it were just text, 
  rather than recognising it as html. For that you need the CF_HTML format. 
  CF_HTML is entirely text format and uses the transformation format UTF-8. 
  It includes a description, a context, and within the context, the fragment. 

  As you may know one can place multiple items of data onto the clipboard for 
  a single clipboard entry, which means that the same data can be pasted in a 
  variety of different formats in order to cope with target 
  applications of varying sophistocation. 

  The following example shows how to stick CF_TEXT (and CF_HTML) 
  into the clipboard. 
}

 { 
  Vielleicht hast du schon mal probiert, HTML-formatierter Text in die 
  Zwischenablage zu kopieren mit dem gewцhnlichen CF_TEXT Format. 
  Wenn man dann z.B in Word (Bearbeiten, Inhalte Einfьgen) auswдhlt, 
  gibt's das HTML Format aber nicht zur Auswahl. 
  Lцsung: Mit RegisterClipboardFormat das Format CF_HTML registrieren, 
  dann einen String so formatieren, wie es auf der Microsoft Seite beschrieben 
  ist (Siehe Link unten) und ihn dann mit der SetClipboardData API in 
  die Zwischenablage kopieren. 
  Das folgende Beispiel zeigt, wie man zwei verschiedene Formate (Text und HTML) 
  in die Zwischenablage einfьgen kann. 
}

 function FormatHTMLClipboardHeader(HTMLText: string): string;
 const
   CrLf = #13#10;
begin
  Result := 'Version:0.9' + CrLf;
   Result := Result + 'StartHTML:-1' + CrLf;
   Result := Result + 'EndHTML:-1' + CrLf;
   Result := Result + 'StartFragment:000081' + CrLf;
   Result := Result + 'EndFragment:°°°°°°' + CrLf;
   Result := Result + HTMLText + CrLf;
   Result := StringReplace(Result, '°°°°°°', Format('%.6d', [Length(Result)]), []);
 end;

 //The second parameter is optional and is put into the clipboard as CF_HTML. 
//Function can be used standalone or in conjunction with the VCL clipboard so long as 
//you use the USEVCLCLIPBOARD conditional define 
//($define USEVCLCLIPBOARD} 
//(and clipboard.open, clipboard.close). 
//Code from http://www.lorriman.com 
procedure CopyHTMLToClipBoard(const str: string; const htmlStr: string = '');
 var
   gMem: HGLOBAL;
   lp: PChar;
   Strings: array[0..1] of string;
   Formats: array[0..1] of UINT;
   i: Integer;
 begin
   gMem := 0;
   {$IFNDEF USEVCLCLIPBOARD}
   Win32Check(OpenClipBoard(0));
   {$ENDIF}
   try
     //most descriptive first as per api docs 
    Strings[0] := FormatHTMLClipboardHeader(htmlStr);
     Strings[1] := str;
     Formats[0] := RegisterClipboardFormat('HTML Format');
     Formats[1] := CF_TEXT;
     {$IFNDEF USEVCLCLIPBOARD}
     Win32Check(EmptyClipBoard);
     {$ENDIF}
     for i := 0 to High(Strings) do
     begin
       if Strings[i] = '' then Continue;
       //an extra "1" for the null terminator 
      gMem := GlobalAlloc(GMEM_DDESHARE + GMEM_MOVEABLE, Length(Strings[i]) + 1);
       {Succeeded, now read the stream contents into the memory the pointer points at}
       try
         Win32Check(gmem <> 0);
         lp := GlobalLock(gMem);
         Win32Check(lp <> nil);
         CopyMemory(lp, PChar(Strings[i]), Length(Strings[i]) + 1);
       finally
         GlobalUnlock(gMem);
       end;
       Win32Check(gmem <> 0);
       SetClipboardData(Formats[i], gMEm);
       Win32Check(gmem <> 0);
       gmem := 0;
     end;
   finally
     {$IFNDEF USEVCLCLIPBOARD}
     Win32Check(CloseClipBoard);
     {$ENDIF}
   end;
 end;

 // Example: 

procedure TForm1.Button1Click(Sender: TObject);
 begin
   CopyHTMLToClipBoard('SwissDelphiCenter', 'SwissDelphiCenter');
 end;

Программа на Delphi, которая копирует текст в формате HTML в буфер обмена с использованием формата CF_HTML. Процедура CopyHTMLToClipBoard принимает два параметра: str и htmlStr. Параметр str является опциональным, если он не предоставлен, то по умолчанию используется пустая строка.

Распаковка кода:

  1. Функция FormatHTMLClipboardHeader форматирует текст HTML в соответствии с спецификацией Microsoft для CF_HTML.
  2. Процедура CopyHTMLToClipBoard создает массив строк и массив форматов, затем циклично проходит по этим массивам, устанавливая данные буфера обмена для каждого формата с помощью API SetClipboardData.
  3. Если условная директива USEVCLCLIPBOARD не определена (то есть она не определена), код вызывает функции OpenClipBoard и CloseClipBoard, чтобы открыть и закрыть буфер обмена.

Пример кода в процедуре Button1Click демонстрирует использование этой функции, копируя два строки ("SwissDelphiCenter" и тот же HTML-текст) в буфер обмена с помощью форматов CF_HTML и CF_TEXT.

Код может быть полезен при необходимости копирования форматированного текста HTML в буфер обмена, например, для вставки в веб-страницу или электронное письмо. Определение нескольких форматов в данных буфера обмена обеспечивает корректную обработку данных целевым приложением, независимо от его уровня сложности.

Альтернативное решение с использованием встроенного компонента TStringList Delphi:

procedure CopyHTMLToClipBoard(const str: string; const htmlStr: string = ''); 
var 
  ClipBoard: TStringList;
begin
  ClipBoard := TStringList.Create;
  try
    ClipBoard.Add(FormatHTMLClipboardHeader(htmlStr));
    ClipBoard.Add(str);
    Clipboard.AsText := '';
    for i := 0 to ClipBoard.Count - 1 do
      Clipboard.AsText := Clipboard.AsText + ClipBoard[i] + #13#10;
  finally
    ClipBoard.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject); 
begin
  CopyHTMLToClipBoard('SwissDelphiCenter', 'SwissDelphiCenter');
end;

В этом альтернативном решении мы создаем объект TStringList и добавляем форматированный текст HTML и строку в список. Затем очищаем буфер обмена с помощью свойства AsText и проходим по списку, добавляя каждый элемент в буфер обмена с новой строкой (#13#10) в конце каждого элемента.

Альтернативное решение более простое и компактное, чем оригинальный код, но может не быть столь гибким или надежным в определенных ситуациях.

Скопировать HTML-код в буфер обмена: программа на Delphi, которая позволяет записать код HTML в буфер обмена и затем его можно вставить в любое приложение, поддерживающее формат CF_HTML.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Буфер обмена ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 15:59:30/0.0035748481750488/0