将字符串变量写入剪贴板

myt*_*lon 4 clipboard pascal freepascal lazarus

我马上就承认,至少可以说,我是帕斯卡尔缺乏经验的.所以,我能得到的任何帮助将不胜感激.:)

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

program varToClipboard;

uses Clipbrd;

var
    textToCopy:string;

begin
    textToCopy := 'Test text from Pascal';

    Clipboard.AsText := textToCopy;
end.  
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,以及所需的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
Run Code Online (Sandbox Code Playgroud)

根据文档,我似乎做得很对.尽管如此,我发现文档缺乏时间.

 

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

TLa*_*ama 5

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

function ClipboardRegisterFormat(const AMimeType: string): TClipboardFormat;
begin
  Result := WidgetSet.ClipboardRegisterFormat(AMimeType);
end;
Run Code Online (Sandbox Code Playgroud)

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

program Project1;

uses
  Clipbrd,
  Interfaces;

begin
  Clipboard.AsText := 'Hello, I''m a text from clipboard!';
end.
Run Code Online (Sandbox Code Playgroud)

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

  1. 通过菜单创建一个新应用程序File / New...,Project / Application在对话框的树视图中选择并通过单击创建一个新项目OK
  2. 现在让我们从你的项目中删除唯一的单位(带有表格); 转到菜单Project / Remove from Project,在新打开的对话框中选择unit1.pas并单击OK
  3. 现在你有一个无单元(无形)的应用程序,剩下的就是编写一个代码来将文本复制到剪贴板; 所以现在让我们从菜单中打开项目源,Project / View Project Source并且当项目源粘贴这样的代码时(这是最短的形式):

program Project1;

uses
  Interfaces, Forms, Clipbrd;

begin
  Application.Initialize;
  Clipboard.AsText := 'Hello, I''m a text from clipboard!';
end.
Run Code Online (Sandbox Code Playgroud)