2

テキストのコピーと貼り付けは TMemo に組み込まれているので簡単ですが、テキストしか扱えないようです。ただし、あらゆる種類のデータを文字列として表すことができるようです。別のプログラムから任意のデータをコピーして TMemo に貼り付けたい場合、Delphi に生の文字列として受け入れさせるにはどうすればよいですか?

4

4 に答える 4

6

「別のプログラムから任意のデータをコピーしてTMemoに貼り付けたい場合、Delphiに生の文字列として受け入れさせるにはどうすればよいですか?」だからあなたの質問を明確にするために、あなたは:

  • 他のアプリケーション(コードがないアプリケーション、通常のアプリ)を使用して、その中に何かをコピーしたい
  • このコピーされたデータ(非テキストを含む任意の形式)をメモのテキストとして貼り付けたい。

あれは正しいですか?その場合、使用できません。クリップボードにClipboard.AsTextその形式のデータがある場合にのみテキストを返します。CF_TEXTクリップボードAPIを直接使用する必要があります。クリップボードにはフォーマットコード付きのデータが保持されており、そのデータへのポインタとサイズを取得して、文字列または任意の方法で処理できます。

それで:

  • 貼り付けたいフォーマットを見つけます。を介して現在クリップボードにあるすべての形式を反復処理するEnumClipboardFormatsか、事前定義された定数(テキスト、画像、音声など)の1つを使用できます。クリップボードは一度に多くの形式のデータを保持できるため、多くの形式のどれを選択するかを選択できます。あなたが使う。
  • この形式のデータがクリップボードにある場合は、クリップボードを開きます。このコードをaでラップし、句try/finallyのクリップボードを閉じていることを確認してください。finallyクリップボードを閉じないと、他のアプリケーションがクリップボードを使用できなくなるため、アプリケーションがクラッシュした場合でもクリップボードを閉じる必要があります。
  • GetClipboardDataその形式のデータへのハンドルを取得するために呼び出します。上の(または後でコピーを実装する場合はに与えられる)データはを介して割り当てられるGlobalAllocため、ハンドルをロックしてポインタを取得する必要がありますGlobalLock(完了したら、でロックを解除しGlobalUnlockます)。データはクリップボードによって所有されているため、使用しないでください。使用後は解放してください。このデータのサイズをバイト単位で見つけるには、を使用しますGlobalSize
  • これにより、既知のサイズのデータ​​へのポインタが得られます。この時点で、あなたはそれであなたがやりたいことを何でもすることができます。文字列として扱うことは1つのオプションです。アプリはデータを所有していないため、直接操作するのではなく、コピーする必要があります。

コードは、データが特定のサイズであり、おそらくnullで終了しない(またはnullが含まれる可能性がある)ことを認識している必要があります。したがって、文字列に変換するときは、バッファーをオーバーランしないようにしてください。sなどを避けるためにエンコードすることができNULLます。このような詳細が必要な場合は、別の質問をする価値があります(または任意のデータを文字列としてエンコードすることを検索します)。最も簡単な方法は、データをサイズ+にコピーすることです。 1バッファ、最後のバイトをnullに設定し、最後を除くすべてのバイトを繰り返し、印刷できない文字(バイト値<32)の場合は「。」に変更します。または他のキャラクター。次に、このバッファへAnsiStringのポインタをのコンストラクタに渡し、としてキャストします。PAnsiChar。(これにより、データがバイトサイズの文字列として扱われるようになります。ネイティブの文字列型はUnicodeであるため、D2009 +を使用している場合は注意が必要です。)別の文字列型はですRawByteString。文字列を取得したら、それをメモに追加します。

MSDNに特定の形式のデータを貼り付ける良い例(Cでは申し訳ありません)があります。これを開始点として使用して、データの独自のカスタム処理を追加することができます。文字列として貼り付けることは、任意のバイナリデータを表示するための最良の方法ではない可能性があります。16進エディタコンポーネントまたはその他のビジュアライザーを使用して、データをより適切に表示できます。

于 2009-11-15T01:14:06.577 に答える
2

メイソン私はあなたの答えを理解しているかどうかわかりませんが、はい、clipbrd を uses 句に追加するだけで avar が言ったように Clipboard.AsText を使用できます。文字列のどこかに null 文字がある場合、KAZAM 文字列は最初から null 文字 #0 まで貼り付けられることに注意してください。別のアプローチとして、メモリ マップ ファイルまたはメッセージを使用して、アプリケーション間でデータを送信する方法があります。

于 2009-11-14T05:49:40.527 に答える
1

あなたのtmemoと「別のプログラム」の間でclipbaord.astextを使用しようとしましたか?

于 2009-11-14T01:59:23.190 に答える
0

「あらゆる種類のデータを文字列として表すことができる」というあなたの声明が意味があるかどうかはわかりません。バイナリ データには null が埋め込まれている場合があり、データを文字列として扱うのに干渉します。また、たとえばビットマップ イメージの文字列表現にはどのような値があるのでしょうか?

クリップボードを設定して、クリップボード情報の形式を決定するのは、アプリケーション次第です。アプリケーションがテキスト以外の情報 (たとえば、画像のファイル名など) をテキスト表現で提供できるよう十分に配慮されている場合は、その文字列情報を使用できます。そうでなければ、その情報を TMemo に貼り付けることが何を意味するのかさえ明確ではありません。

于 2009-11-15T01:28:13.393 に答える