2012-01-01 4 views
2

この質問はthisとそのaccepted answerと一緒にここに投稿されました。カスタムフォーマットのクリップボードデータをTMemoに貼り付けるには?

私はWindows APIで快適に感じません。 Topografixによって道EasyGPSを探る

は、クリップボード操作を処理し、私はそれが(GPXは正確には)という名前GPXウィッヒは、実際にプレーンXMLテキストであるカスタムクリップボード形式を使用していることを発見しました。 Clipboard.AsTextの使用は除外されています。

私はこの段階でつまずく:

program ProbeClipboard; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    Windows, 
    ClipBrd; 

var 
    CF_GPX: Cardinal; 
    ClipboardData: THandle; 

begin 
    CF_GPX:=RegisterClipboardFormat('GPX'); 

    if ClipBoard.HasFormat(CF_GPX) then 
    begin 
    Writeln('GPX format available in clipboard'); 
    // 
    OpenClipboard(0); 

    ClipboardData := GetClipboardData(CF_GPX); 

    if ClipboardData = 0 then 
     raise Exception.Create('Clipboard data Error'); 

    /// How to use GlobalLock and GlobalUnLock 
    /// so that I can paste the Clipboard data 
    /// to a TMemo instance for example 

    CloseClipboard; 
    end; 
end. 

、私はそのプログラムを修正する助けてください。

+0

FWIWあなたは 'OpenClipboard'を保護するためにここで最後に試してみる必要があります。また、 'OpenClipboard'の呼び出しでエラーチェックが必要です。 –

答えて

5

私はこのように書くと思います:私はCF_GPX形式のテスト外にクリップボードをロッククリップボードOpenコマンドを、移動

program ProbeClipboard; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    Windows, 
    ClipBrd; 

var 
    CF_GPX: Cardinal; 
    ClipboardData: Windows.HGLOBAL; 
    Ptr: Pointer; 
    Size: DWORD; 

begin 
    CF_GPX := RegisterClipboardFormat('GPX'); 

    Clipboard.Open; 
    try 
    if Clipboard.HasFormat(CF_GPX) then 
    begin 
     Writeln('GPX format available in clipboard'); 

     ClipboardData := Clipboard.GetAsHandle(CF_GPX); 
     if ClipboardData=0 then 
     RaiseLastOSError; 

     Ptr := Windows.GlobalLock(ClipboardData); 
     if Ptr=nil then 
     RaiseLastOSError; 

     try 
     Size := Windows.GlobalSize(ClipboardData); 

     //Ptr now points to a memory block of Size bytes 
     //containing the clipboard data 
     finally 
     Windows.GlobalUnlock(ClipboardData); 
     end; 
    end; 
    finally 
    Clipboard.Close; 
    end; 
end. 

注意を。それはあなたのコードに存在する競合状態を避けるためです。コードでは、HasFormatコールとOpenClipboardコールの間でクリップボードを変更できます。

私はまた、Clipboardクラスを排他的に使用しました。このクラスには必要なだけの機能があり、生のWin32クリップボードAPIを使用する必要はありません。

エラーチェックを入れても!

+0

すぐに使えるクリップボードシングルトンが仕事をしてくれたことを指摘していただきありがとうございます。私は貧弱な熟練度にもかかわらず、Windows APIに集中しすぎました。疑わしいGPXカスタムクリップボード形式は実際にはプレーンテキストなので、Pointerの代わりにPCharを使用しますか? – menjaraz

+0

文字列データを引き出す方法は、そのエンコーディングの種類によって異なります。ご存知ですか? ANSI? UTF8? UTF16?私がバッファをオーバーランしていないことを確認するために、これを行うために 'SetString'プロシージャを使用するのと同じことはすべて同じです。 –

+0

UTF8。私はあなたの答えを受け入れる。ありがとうございました。 – menjaraz

関連する問題