我要承认,不管怎么说,至少可以说,我是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(只生成并将字符串写入剪贴板)而不会弹出控制台窗口?
答案 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平台的这个技巧):
File / New...
创建新应用,在对话框的树状视图中选择Project / Application
,然后点击OK
Project / Remove from Project
,在新打开的对话框中选择unit1.pas
,然后点击OK
Project / View Project Source
打开项目源,并且项目源粘贴这样的代码(这是最短的形式):
program Project1;
uses
Interfaces, Forms, Clipbrd;
begin
Application.Initialize;
Clipboard.AsText := 'Hello, I''m a text from clipboard!';
end.