【问题标题】:Save text from the clipboard to a file将剪贴板中的文本保存到文件中
【发布时间】:2014-08-12 09:52:02
【问题描述】:

我正在尝试以下代码,该代码应将剪贴板文本保存到 Delphi XE6 中的文本文件中。代码运行良好,但在输出文件中仅生成垃圾值,即使剪贴板包含复制的文本片段也是如此。如何更改代码才能正常工作?

function SaveClipboardTextDataToFile(
  sFileTo : string ) : boolean;
var
  ps1,
  ps2   : PChar;
  dwLen : DWord;
  tf    : TextFile;
  hData : THandle;
begin
  Result := False;
  with Clipboard do
  begin
    try
      Open;
      if( HasFormat( CF_TEXT ) ) then
      begin
        hData :=
          GetClipboardData( CF_TEXT );

        ps1 := GlobalLock( hData );
        dwLen := GlobalSize( hData );

        ps2 := StrAlloc( 1 + dwLen );

        StrLCopy( ps2, ps1, dwLen );

        GlobalUnlock( hData );

        AssignFile( tf, sFileTo );
        ReWrite( tf );
        Write( tf, ps2 );
        CloseFile( tf );

        StrDispose( ps2 );

        Result := True;
      end;
    finally
      Close;
    end;
  end;
end;

【问题讨论】:

  • 使用TStringList ... List.Text:= Clipboard.AsText; List.SaveToFile('C:\MyFile.txt'); 会更容易
  • 你从哪里得到这个代码?这真的很恶心。永远值得记住的是,如果你从互联网上吸取 15 年前的代码,那可能是不合适的。在这种情况下,您遇到了 Unicode 和遗留 IO。以及毫无意义的低级 Win32 api 调用。哦,尝试是在错误的地方。必须在资源获取之后而不是之前。这里的教训是不要在不了解代码的情况下复制代码。

标签: delphi delphi-xe6


【解决方案1】:

您会看到垃圾,因为 CF_TEXT 是 ANSI。您请求 ANSI 文本,操作系统将剪贴板内容转换为 ANSI,然后将其放入 unicode 字符串中。对 unicode 应用程序使用 CF_UNICODETEXT

还要考虑在问题中提出的问题。

【讨论】:

    【解决方案2】:

    如果你有 Delphi XE6,那么你可以使用一些已经实现的功能

    uses
      System.SysUtils,
      System.IOUtils,
      Vcl.Clipbrd;
    
    function SaveClipboardTextDataToFile( const sFileTo : string ) : boolean;
    var
      LClipboard : TClipboard;
      LContent : string;
    begin
      // get the clipboard content as text
      LClipboard := TClipboard.Create;
      try
        LContent := LClipboard.AsText;
      finally
        LClipboard.Free;
      end;
      // save the text - if any - into a file
      if not LContent.IsEmpty
      then
        begin
          TFile.WriteAllText( sFileTo, LContent );
          Exit( True );
        end;
    
      Result := False;
    end;
    

    【讨论】:

    • 你可以只使用Clipboard单例而不是显式实例化TClipboard
    • 这段代码可以大大简化:Result := Clipboard.HasFormat(CF_UNICODETEXT); if Result then TFile.WriteAllText(sFileTo, Clipboard.AsText);
    • @RemyLebeau, [dcc32 Error] Undeclared identifier: 'CF_UNICODETEXT'
    • @Sormann CF_UNICODETEXTStandard Clipboard Format。如果你的 Delphi 版本没有定义它,你可以在你自己的代码中定义它。它的数字版本是 13。
    • @RemyLebeau,这样吗? -> Const CF_UNICODETEXT = 13;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    相关资源
    最近更新 更多