将字符串变量写入剪贴板

时间:2013-08-28 20:00:44

标签: clipboard pascal freepascal lazarus

我要承认,不管怎么说,至少可以说,我是Pascal缺乏经验的。所以,我能得到的任何帮助将不胜感激。 :)

作为更大程序的一部分,我需要将一个字符串变量写入剪贴板。我在Lazarus(版本1.0.12)中创建了一个新项目,所以我可以尝试弄清楚如何在没有由于下面包含的额外的,不必要的代码引起的复杂性的情况下这样做:

program varToClipboard;

uses Clipbrd;

var
    textToCopy:string;

begin
    textToCopy := 'Test text from Pascal';

    Clipboard.AsText := textToCopy;
end.  

使用上面的代码以及必需的LCLBase依赖项,运行已编译的EXE时,我在CMD中收到以下错误:

An unhandled exception occurred at $000000000043D45E :
EAccessViolation : Access violation
  $000000000043D45E  CLIPBOARDREGISTERFORMAT,  line 98 of ./include/lclintf.inc
  $000000000043C35B  PREDEFINEDCLIPBOARDFORMAT,  line 185 of lclintf.pas
  $0000000000415B0C  TCLIPBOARD__SETASTEXT,  line 452 of ./include/clipbrd.inc
  $0000000000401802  main,  line 12 of varToClipboard.lpr

根据the documentation,我似乎做得很对。尽管如此,我发现文档缺乏时间,而不是偶尔。

另外,我必须做什么才能运行已编译的EXE(只生成并将字符串写入剪贴板)而不会弹出控制台窗口?

1 个答案:

答案 0 :(得分:5)

你做得对。这里的问题是剪贴板类不会以某种方式在控制台应用程序中使用。您的应用程序在lclintf.inc文件的以下行中失败,该文件将访问WidgetSet对象。因为控制台应用程序不需要任何小部件,因此WidgetSet变量为nil时失败,因为控制台应用程序不需要任何小部件:

function ClipboardRegisterFormat(const AMimeType: string): TClipboardFormat;
begin
  Result := WidgetSet.ClipboardRegisterFormat(AMimeType);
end;

要解决此问题,您可以将Interfaces单元添加到uses子句中,并将LCL包依赖项添加到项目中:

program Project1;

uses
  Clipbrd,
  Interfaces;

begin
  Clipboard.AsText := 'Hello, I''m a text from clipboard!';
end.

但根据您的其他问题,您似乎想要创建应用程序,它只会将某些文本复制到剪贴板并终止。这就是控制台应用程序类型不是正确的选择,因为短时间内显示的控制台窗口。对于那种应用程序,我会制作无形窗口应用程序(请注意我只知道来自Windows平台的这个技巧):

  1. 通过菜单File / New...创建新应用,在对话框的树状视图中选择Project / Application,然后点击OK
  2. 创建新项目
  3. 现在让我们从项目中删除唯一的单元(带有表单);转到菜单Project / Remove from Project,在新打开的对话框中选择unit1.pas,然后点击OK
  4. 现在你有一个无单元(无形)应用程序,剩下的就是编写一个代码来将文本复制到剪贴板;所以现在让我们从菜单Project / View Project Source打开项目源,并且项目源粘贴这样的代码(这是最短的形式):
  5. program Project1;
    
    uses
      Interfaces, Forms, Clipbrd;
    
    begin
      Application.Initialize;
      Clipboard.AsText := 'Hello, I''m a text from clipboard!';
    end.