Clipbrd wird nicht gefunden/Führt zu Access Error

Rund um die LCL und andere Komponenten
Antworten
Midykm
Beiträge: 18
Registriert: Di 31. Okt 2017, 21:59

Clipbrd wird nicht gefunden/Führt zu Access Error

Beitrag von Midykm »

Das kleine "Progrämmchen"

{$mode objfpc}{$H+}

uses
Clipbrd;

begin
ClipBoard.AsText := 'Test Clipboard';
end.

führt in der Lazarus IDE (Version 3.6-FPC 3.2.2, x64,Windows11, x64) zu einer
"External Access Violation reading from address $0000000000000000"
In der Datei LCLINTF.INC, Zeile 96.
Auf der Kommandozeile mit FPC bekomme ich
"project1.lpr(4,3) Fatal: Can't find unit Clipbrd used by Program
Fatal: Compilation aborted
Error: C:\lazarus\fpc\3.2.2\bin\x86_64-win64\ppcx64.exe returned an error exitcode"
Ein anderes Programm von mir, eine GUI-Anwendung, hat u.a. auch Clipbrd in der Uses-Klausel.
Hier tritt obiges Problem nicht auf.
Hilfe, bitte!

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Re: Clipbrd wird nicht gefunden/Führt zu Access Error

Beitrag von theo »

Konsolenanwendungen haben kein Clipboard.
Clipboard ist eine GUI Angelegenheit. Unter Linux ist X11 dafür verantwortlich (Oder ggf Wayland).

Ich weiss nicht, ob es da irgendwelche Tricks gibt, das zu umgehen.

Mathias
Beiträge: 6956
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Clipbrd wird nicht gefunden/Führt zu Access Error

Beitrag von Mathias »

Dies scheint nur in der LCL zu gehen.
Ich habe es mit Linux probiert, auch da knallt es.

Aber du kannst auch die WinAPI benutzen.

Code: Alles auswählen

program project1;

uses
  Windows;

  // https://stackoverflow.com/questions/73322716/setclipboarddata-and-new-operator-for-handle

const
  hello: string = 'Hello World !';
var
  h: HGLOBAL;
  pmem: pchar;
begin
  h := GlobalAlloc(GMEM_MOVEABLE, Length(hello)+1);
  if h <> 0 then begin
    pmem := PChar(GlobalLock(h));
    move(hello[1], pmem[0], Length(hello));
    GlobalUnlock(h);
    if OpenClipboard(0) then begin
      EmptyClipboard;
      if SetClipboardData(CF_TEXT, h) <> 0 then begin
        h := 0;
      end;
      CloseClipboard;
    end;
    if h <> 0 then begin
      GlobalFree(h);
    end;
  end;
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6956
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Clipbrd wird nicht gefunden/Führt zu Access Error

Beitrag von Mathias »

Ich weiss nicht, ob es da irgendwelche Tricks gibt, das zu umgehen.
Die gibt es. Da bei Windows immer die GUI bei Konsolenanwendungen läuft, kann man sich der WinAPI bedienen.

Bei Linux ist es ähnlich, aber da muss ein XServer im Hintergrund laufen. Das das ganze mit den XAtomen gesteuert wird.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Midykm
Beiträge: 18
Registriert: Di 31. Okt 2017, 21:59

Re: Clipbrd wird nicht gefunden/Führt zu Access Error

Beitrag von Midykm »

Mathias hat geschrieben: Mo 21. Okt 2024, 18:03 Dies scheint nur in der LCL zu gehen.
Ich habe es mit Linux probiert, auch da knallt es.

Aber du kannst auch die WinAPI benutzen.

Code: Alles auswählen

program project1;

uses
  Windows;

  // https://stackoverflow.com/questions/73322716/setclipboarddata-and-new-operator-for-handle

const
  hello: string = 'Hello World !';
var
  h: HGLOBAL;
  pmem: pchar;
begin
  h := GlobalAlloc(GMEM_MOVEABLE, Length(hello)+1);
  if h <> 0 then begin
    pmem := PChar(GlobalLock(h));
    move(hello[1], pmem[0], Length(hello));
    GlobalUnlock(h);
    if OpenClipboard(0) then begin
      EmptyClipboard;
      if SetClipboardData(CF_TEXT, h) <> 0 then begin
        h := 0;
      end;
      CloseClipboard;
    end;
    if h <> 0 then begin
      GlobalFree(h);
    end;
  end;
end.
Danke für den Tipp und den Code! So klappt es auch auf der Konsole mit der Zwischenablage unter Windows.

Mathias
Beiträge: 6956
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Clipbrd wird nicht gefunden/Führt zu Access Error

Beitrag von Mathias »

So klappt es auch auf der Konsole mit der Zwischenablage unter Windows.
Das Gegenstück um Daten zu holen sollte jetzt mit diesem Anhaltspunkt kein Problem mehr sein.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 5189
Registriert: Fr 8. Apr 2011, 09:01

Re: Clipbrd wird nicht gefunden/Führt zu Access Error

Beitrag von wp_xyz »

Die Unit "clipbrd" liegt im Ordner "lcl" der Lazarus-Installation. Daher kannst du sie in einem Kommandozeilen-Programm nur verwenden, wenn du das Package LCL zu den Anforderungen des Projekts hinzufügst (Rechtsklick auf "Benötigte Packages" > "Hinzufügen", dann den Eintrag "LCL" aus der Liste auswählen). Nachdem das geschehen ist, geht es ganz einfach:

Code: Alles auswählen

program Project1;
uses
  Interfaces, ClipBrd;
begin
  Clipboard.AsText := 'Das ist ein Test für die Zwischenablage.';
end. 
Die Unit "interfaces" wird noch benötigt, um das Widgetset zu initialisieren.

Midykm
Beiträge: 18
Registriert: Di 31. Okt 2017, 21:59

Re: Clipbrd wird nicht gefunden/Führt zu Access Error

Beitrag von Midykm »

Klasse! Dann braucht man die Windows API nicht. Ich werde es morgen ausprobieren.
Einstweilen Danke!

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Re: Clipbrd wird nicht gefunden/Führt zu Access Error

Beitrag von theo »

Am Ende hast du doch den ganzen GUI Zauber eingebunden.
Ich weiss nicht, ob ich das noch Konsolenanwendung nennen würde.
Aber ja, geht.

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 596
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Clipbrd wird nicht gefunden/Führt zu Access Error

Beitrag von Niesi »

theo hat geschrieben: Di 22. Okt 2024, 18:57 Am Ende hast du doch den ganzen GUI Zauber eingebunden.
Ich weiss nicht, ob ich das noch Konsolenanwendung nennen würde.
Aber ja, geht.
Tja, das ist dann die virtuelle Klickiklicki-Emulation für die, die mit Klickibunti nicht klarkommen.

Schöne neue Welt ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Midykm
Beiträge: 18
Registriert: Di 31. Okt 2017, 21:59

Re: Clipbrd wird nicht gefunden/Führt zu Access Error

Beitrag von Midykm »

Ja, es geht - in der IDE. Auf der Konsolenebene meckert FPC über die nicht gefundene Unit "Interfaces".
Außerdem, das so kompilierte Programm ist mit über 20MB wesentlich größer als die ein paar Dutzend Kilobyte großen Konsolenanwendungen. Klar, der Debugger...
Ich denke, ich bleibe bei der API.

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 596
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Clipbrd wird nicht gefunden/Führt zu Access Error

Beitrag von Niesi »

Midykm hat geschrieben: Mi 23. Okt 2024, 18:32 Ja, es geht - in der IDE. Auf der Konsolenebene meckert FPC über die nicht gefundene Unit "Interfaces".
Außerdem, das so kompilierte Programm ist mit über 20MB wesentlich größer als die ein paar Dutzend Kilobyte großen Konsolenanwendungen. Klar, der Debugger...
Ich denke, ich bleibe bei der API.
Dir ist bekannt, dass Du die vielen Megabyte für den Debugger weglassen kannst?

Dann hast Du ein sehr kleines Programm, welches trotzdem funktioniert, sofern Du alles richtig gemacht hast ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Midykm
Beiträge: 18
Registriert: Di 31. Okt 2017, 21:59

Re: Clipbrd wird nicht gefunden/Führt zu Access Error

Beitrag von Midykm »

Ja, ich weiß. Wie auch immer, ich arbeite lieber auf der Kommandozeile, sofern ich keine GUI-Anwendung mache. Und da motzt FPC über die fehlende Interfaces-Unit.
Egal. Das Problem "ClipBoard" ist so oder so gelöst, dank Eurer Hilfe!

Antworten