HTML形式のテキストをHTMLとしてFiremonkeyのクリップボードにコピーする方法

HilalSoftware

Delphi FireMonkeyを使用して、HTML形式の文字列をDelphiのクリップボードにコピーして、貼り付けた他のアプリケーションがHTMLとして表示できるようにする必要があります。

非表示のメモコンポーネントを介して単純なテキストをコピーしようとしていますが、機能しますが、単純なテキストとしてコピーされます。HTML形式のコピーが必要です。テキストとして持つと、リッチテキストプログラムに貼り付けると、フォーマットされたテキストではなく、すべてのHTMLタグが表示されます。

テキストをクリップボードにコピーするための私の現在のアプローチは次のとおりです。

procedure TForm1.Button1Click(Sender: TObject);
var
  SourceText: string;
begin
  SourceText := 'This is a <b>bold</b> html line';
  //I can use TMemo to copy it to clipboard like:
  Memo1.lines.Text := SourceText;
  Memo1.SelectAll;
  memo1.CopyToClipboard;
end;

しかし、問題は、クリップボードにコピーしたテキストをMicrosoft Wordで貼り付けると、次のように貼り付けられることです。

  • 「これは<b>bold</b>html行です」。私が欲しいとそれは次のようになるはずです:

  • これは太字のhtml行です

注: Windowsでどのように実行できるかについて他の説明を読みましたが、クロスプラットフォームアプリケーション用のFiremonkeyソリューションが必要です。どんな助けでも大歓迎です。

fpiette

FireMonkeyを使用してクロスプラットフォームでクリップボードにデータをコピーするにはIFMXExtendedClipboardService、プラットフォームサービスを呼び出して取得したインターフェイスを使用します。

var
    Svc      : IFMXExtendedClipboardService;
begin
    if not TPlatformServices.Current.SupportsPlatformService(IFMXExtendedClipboardService, Svc) then 
        Exit;  // Not clipboard supported
    // Code using the interface

このインタフェースは、クリップボードから/へテキスト/画像を取得する/コピーする方法がありますSetTextGetTextSetImageGetImage

データの他の種類については、ユーザーがデータ・フォーマットを登録する必要があり、その後、書き込み/クリップボードから/にデータを読み込みます:RegisterCustomFormatIsCustomFormatRegisteredUnregisterCustomFormatHasCustomFormatGetCustomFormatSetCustomFormat

あなたの質問では、HTML形式のデータをクリップボードにコピーしたいとします。これを変換して、HTML形式を登録し、データを使用してストリームを作成し、SetCustomFormatを呼び出して形式とストリームを渡すことができます。

上記のインターフェース方法を使用して、任意のフォーマットを使用し、クリップボードとの間で送信することができます。以下のコードは、ストリームstream取得し、次を使用してコンテンツをクリップボードにコピーしますClipFormat

if TPlatformServices.Current.SupportsPlatformService(
                IFMXExtendedClipboardService, Svc) then begin
    if not Svc.IsCustomFormatRegistered(ClipFormat) then
        Svc.RegisterCustomFormat(ClipFormat);
    Svc.SetCustomFormat(ClipFormat, Stream);
end;

フォーマットは一度だけ登録する必要があるため、複数回のIsCustomFormatRegistered呼び出しを防ぐためにを呼び出しRegisterCustomFormatます。

形式の名前は単純な文字列であり、何でもかまいません。アプリケーションのコピーと貼り付けでは、形式名とデータ形式(データがストリームに書き込まれる方法)について合意する必要があります。

HTML形式のデータの書き込みは、スタイルが原因で難しい場合があります。完全なHTMLドキュメントの単純なコピーを作成するだけでは、スタイルが原因で正しくレンダリングされない可能性があります。

2つのアプリケーション間でクリップボードを介してデータを転送する場合は、何でもできます。ただし、アプリケーションと別のアプリケーション(質問でMicrosoft Wordについて言及した)の間でデータを転送することははるかに困難です。

Microsoft製品およびWindowsプラットフォーム上の他のすべての製品では、クリップボードのHTML形式についてここで説明します

適切にフォーマットされた後の質問での例は、次のようになります。

Version:0.9
StartHTML:00000144
EndHTML:00000218
StartFragment:00000167
EndFragment:00000205
StartSelection:00000167
EndSelection:00000205
<!DOCTYPE><HTML><BODY><P>This is a <b>bold</b> html line</P></BODY></HTML>

実際の文字列は上記のとおりで、各行の終わりにCRLFがあります。フォーマット名は「HTMLフォーマット」です。

This is a <b>bold</b> html line有効な完全なHTMLドキュメントを形成するには、文をHTMLタグで囲み、その前にいくつかのkeyword:valueペアで構成されるヘッダーを付ける必要があることがわかります文字列の場合、値はオフセットされます。キーワードは非常に自明です。文字列はUTF8であり、HTMLエンティティを使用して特殊文字を表す場合はANSIに縮小できます。

文字列全体を作成する関数を作成しました。

function FormatHtmlForClipboard(const HtmlSrc : UTF8String) : UTF8String;
const
    Header = 'Version:0.9'             + #13#10 +
             'StartHTML:00000000'      + #13#10 +
             'EndHTML:00000000'        + #13#10 +
             'StartFragment:00000000'  + #13#10 +
             'EndFragment:00000000'    + #13#10 +
             'StartSelection:00000000' + #13#10 +
             'EndSelection:00000000'   + #13#10;
var
    BodyStart : Integer;
    BodyEnd   : Integer;
    HdrLen    : Integer;
begin
    Result := Header;
    BodyStart := Pos('<BODY>', String(HtmlSrc));
    if BodyStart <= 0 then
        raise Exception.Create('<BODY> tag not found');
    Inc(BodyStart, 6);
    BodyEnd := Pos('</BODY>', String(HtmlSrc));
    if BodyEnd <= 0 then
        raise Exception.Create('</BODY> tag not found');

    HdrLen := Length(Header) - 1;
    WriteNumberIntoString(HdrLen,                   'StartHTML:',      Result);
    WriteNumberIntoString(HdrLen + Length(HtmlSrc), 'EndHTML:',        Result);
    WriteNumberIntoString(HdrLen + BodyStart,       'StartFragment:',  Result);
    WriteNumberIntoString(HdrLen + BodyEnd,         'EndFragment:',    Result);
    WriteNumberIntoString(HdrLen + BodyStart,       'StartSelection:', Result);
    WriteNumberIntoString(HdrLen + BodyEnd,         'EndSelection:',   Result);
    Result := Result + HtmlSrc;
end;

procedure WriteNumberIntoString(
    N        : Integer;
    const At : UTF8String;
    var S    : UTF8String);
var
    I : Integer;
    V : UTF8String;
begin
    I := Pos(At, S);
    if I <= 0 then
        Exit;
    I := I + Length(At);
    V := UTF8String(Format('%08.8d', [N]));
    Move(V[1], S[I], Length(V));
end;

以上で、HTML形式のデータをクリップボードにコピーする関数は次のようになります。

procedure CopyHtmlToClipboard(const HtmlSrc : UTF8String);
var
    Svc      : IFMXExtendedClipboardService;
    Stream   : TStringStream;
    HtmlData : UTF8String;
const
    ClipFormat = 'HTML format';   // This is what Windows expect
                                  // Maybe other platform want something else
begin
    HtmlData := FormatHtmlForClipboard(HtmlSrc);
    Stream   := TStringStream.Create(HtmlData);
    if TPlatformServices.Current.SupportsPlatformService(
                    IFMXExtendedClipboardService, Svc) then begin
        if not Svc.IsCustomFormatRegistered(ClipFormat) then
            Svc.RegisterCustomFormat(ClipFormat);
        Svc.SetCustomFormat(ClipFormat, Stream);
    end;
end;

次のような関数を使用する必要があります。

procedure TForm1.Button1Click(Sender: TObject);
begin
    CopyHtmlToClipboard(
        '<!DOCTYPE><HTML><BODY><P>' +
        'This is a <b>bold</b> html line' +    //<== Your actual HTML text
        '</P></BODY></HTML>');
end;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

htmlテーブルのテキストをクリップボードにコピーする方法は?

分類Dev

テキストとHTMLをクリップボードにコピーする

分類Dev

クリップボードの値を変数にコピーして既存のテキストに追加する

分類Dev

アドオンなしでVaadinのクリップボードにテキストをコピーする方法

分類Dev

JqueryとJSを使用して<code>タグと<pre>タグからクリップボードのテキストにコピーする方法は?

分類Dev

JavaScriptを使用してタグのテキストをクリップボードにコピーする

分類Dev

本文のテキストコンテンツをクリップボードにコピーする方法

分類Dev

(方法)NSMenuItemを使用して<editor>からクリップボードにテキストをコピーする

分類Dev

IAsyncQuickInfoSourceツールチップのWPFテキストボックスのテキストをクリップボードにコピーする方法

分類Dev

大量のテキストを削除するときにクリップボードに自動コピーする

分類Dev

ADBを使用してAndroidシステムのクリップボードにテキストをコピーする方法は?

分類Dev

独自の.innerHTMLテキストコンテンツをクリップボードにコピーするHTMLボタン

分類Dev

Goでクリップボードとの間でテキストをコピーする方法は?

分類Dev

ボタンがクリックされたときにクリップボードにテキストエリアのテキストをコピーする

分類Dev

KDEカレンダーの日付と時刻をテキスト形式でクリップボードにコピーします

分類Dev

KDEカレンダーの日付と時刻をテキスト形式でクリップボードにコピーします

分類Dev

HTMLのテキストボックスにオートコンプリートjqueryuiを表示する方法

分類Dev

クリップボードにコピーしたテキストをトースト内に表示する方法

分類Dev

親要素をクリックしてテキストをクリップボードにコピーする

分類Dev

キーを押したときにテキストをクリップボードにコピーする

分類Dev

html divのコンテンツをコピーしたり、そのスタイルでテキストをクリップボードに入力したりするのを防ぐ方法はありますか?

分類Dev

AndroidのTextFieldからクリップボードにテキストをコピーする方法

分類Dev

JList要素のテキストをクリップボードにコピーする方法

分類Dev

選択したツリービューノードのテキストをクリップボードにコピーしようとしていますが、クリップボードの最後のノードのみを取得しています

分類Dev

javascriptを使用してクリップボードにコピーするときに強調表示されるテキスト選択を削除する方法

分類Dev

クリップボードに複数のテキスト行をコピーして、Java以外の別のフォームに貼り付ける方法

分類Dev

PHPとJavaScriptを使用してテキストをクリップボードにコピーしますか?

分類Dev

Swiftでテキストをクリップボード/ペーストボードにコピーする方法

分類Dev

テーブル内のクリップボードにテキストを動的にコピーする

Related 関連記事

  1. 1

    htmlテーブルのテキストをクリップボードにコピーする方法は?

  2. 2

    テキストとHTMLをクリップボードにコピーする

  3. 3

    クリップボードの値を変数にコピーして既存のテキストに追加する

  4. 4

    アドオンなしでVaadinのクリップボードにテキストをコピーする方法

  5. 5

    JqueryとJSを使用して<code>タグと<pre>タグからクリップボードのテキストにコピーする方法は?

  6. 6

    JavaScriptを使用してタグのテキストをクリップボードにコピーする

  7. 7

    本文のテキストコンテンツをクリップボードにコピーする方法

  8. 8

    (方法)NSMenuItemを使用して<editor>からクリップボードにテキストをコピーする

  9. 9

    IAsyncQuickInfoSourceツールチップのWPFテキストボックスのテキストをクリップボードにコピーする方法

  10. 10

    大量のテキストを削除するときにクリップボードに自動コピーする

  11. 11

    ADBを使用してAndroidシステムのクリップボードにテキストをコピーする方法は?

  12. 12

    独自の.innerHTMLテキストコンテンツをクリップボードにコピーするHTMLボタン

  13. 13

    Goでクリップボードとの間でテキストをコピーする方法は?

  14. 14

    ボタンがクリックされたときにクリップボードにテキストエリアのテキストをコピーする

  15. 15

    KDEカレンダーの日付と時刻をテキスト形式でクリップボードにコピーします

  16. 16

    KDEカレンダーの日付と時刻をテキスト形式でクリップボードにコピーします

  17. 17

    HTMLのテキストボックスにオートコンプリートjqueryuiを表示する方法

  18. 18

    クリップボードにコピーしたテキストをトースト内に表示する方法

  19. 19

    親要素をクリックしてテキストをクリップボードにコピーする

  20. 20

    キーを押したときにテキストをクリップボードにコピーする

  21. 21

    html divのコンテンツをコピーしたり、そのスタイルでテキストをクリップボードに入力したりするのを防ぐ方法はありますか?

  22. 22

    AndroidのTextFieldからクリップボードにテキストをコピーする方法

  23. 23

    JList要素のテキストをクリップボードにコピーする方法

  24. 24

    選択したツリービューノードのテキストをクリップボードにコピーしようとしていますが、クリップボードの最後のノードのみを取得しています

  25. 25

    javascriptを使用してクリップボードにコピーするときに強調表示されるテキスト選択を削除する方法

  26. 26

    クリップボードに複数のテキスト行をコピーして、Java以外の別のフォームに貼り付ける方法

  27. 27

    PHPとJavaScriptを使用してテキストをクリップボードにコピーしますか?

  28. 28

    Swiftでテキストをクリップボード/ペーストボードにコピーする方法

  29. 29

    テーブル内のクリップボードにテキストを動的にコピーする

ホットタグ

アーカイブ