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(只生成并将字符串写入剪贴板)而不会弹出控制台窗口?
你做得对.这里的问题是剪贴板类不会以某种方式在控制台应用程序中使用.您的应用程序在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平台的这个技巧):
File / New...,Project / Application在对话框的树视图中选择并通过单击创建一个新项目OKProject / Remove from Project,在新打开的对话框中选择unit1.pas并单击OKProject / 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)
| 归档时间: |
|
| 查看次数: |
1246 次 |
| 最近记录: |