4

我马上要承认,至少可以说,我对 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

根据文档,我似乎做的一切都是正确的。虽然,我发现文档是......有时会缺少。

 

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

4

1 回答 1

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. 通过 menu 创建一个新应用程序,在对话框的树形视图中File / New...选择并通过单击创建一个新项目Project / ApplicationOK
  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.
于 2013-08-28T21:16:43.417 回答