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あるため、これは失敗します:WidgetSetnil

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. プロジェクトから唯一のユニット (フォームを含む) を削除しましょう。メニューに移動し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 に答える