Clipboard: Grösse abfragen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Clipboard: Grösse abfragen

Beitrag von malabarista »

Ich möchte den Inhalt des Clipboards auslesen, falls es ein Text ist.
Das funktioniert.

ABER ich habe als Beispiel auf den Lazarusseiten gefunden:

Code: Alles auswählen

 
  ...
Procedure subProzedur1;
var
  strPuffer: string;
 
begin
  ...
  strPuffer := Clipboard.AsText;
  ...
end;
  ...
 

Das geht doch daneben, wenn der Inhalt des Clipboards mehr als 256 Zeichen hat. Oder ?
Deshalb meine Frage: gibt es eine Möglichkeit die Grösse des Clipboard-Inhaltes abzufragen?

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Clipboard: Grösse abfragen

Beitrag von mse »

Normalerweise werden Lazarus-Projekte mit -gh oder {$H+} kompiliert. Dann ist string = ansistring.
https://www.freepascal.org/docs-html/cu ... 350003.2.4

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

Re: Clipboard: Grösse abfragen

Beitrag von wp_xyz »

malabarista hat geschrieben:Das geht doch daneben, wenn der Inhalt des Clipboards mehr als 256 Zeichen hat. Oder ?
Deshalb meine Frage: gibt es eine Möglichkeit die Grösse des Clipboard-Inhaltes abzufragen?

Wieso 256? Das ist doch kein ShortString.

Wenn du mit "Größe des Clipboard-Inhalts" das gesamte Clipboard mit allen Formaten meinst, weiß ich nicht, ob man das einfach abfragen kann. Wenn du an einem speziellen Format interessiert bist, liest man die binären Daten zu diesem Format in einen Stream und hat dann die Größe als Größe des Streams:

Code: Alles auswählen

function TMainForm.GetFormatSize(AClipboardFormat: TClipboardFormat): Int64;
var
  stream: TStream;
begin
  stream := TMemoryStream.Create;
  try
    try
      Clipboard.GetFormat(AClipboardFormat, stream);
      Result := stream.Size;
    except
      Result := -1;
    end;
  finally
    stream.Free;
  end;
end;

Und wenn du nur am Textformat interessiert bist, sollte Length(Clipboard.AsText) ausreichen.

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: Clipboard: Grösse abfragen

Beitrag von malabarista »

Danke, genau das wollte ich wissen.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Clipboard: Grösse abfragen

Beitrag von Warf »

Stell einfach sicher das irgendwo zwischen Unit und Interface eine der 2 Zeilen steht (groß und Kleinschreibung ist egal)

Code: Alles auswählen

{$Mode ObjFPC}{$H+}
{$Mode Delphi}

Dann musst du dir darüber keine Gedanken machen

wp_xyz hat geschrieben:Und wenn du nur am Textformat interessiert bist, sollte Length(Clipboard.AsText) ausreichen.


Auch wenn es binäre daten sind sollte Length funktionieren. Zwar sind AnsiStrings null terminiert, allerdings wird die längeninformation als separater wert gespeichert, weshalb im gegensatz zu C, alle 256 chars vorkommen können. Die Länge sollte also trozdem richtig sein.

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

Re: Clipboard: Grösse abfragen

Beitrag von wp_xyz »

Warf hat geschrieben:Stell einfach sicher das irgendwo zwischen Unit und Interface eine der 2 Zeilen steht (groß und Kleinschreibung ist egal)

Code: Alles auswählen

{$Mode ObjFPC}{$H+}
{$Mode Delphi}

Dann musst du dir darüber keine Gedanken machen

Normalerweise nicht so wichtig, denn in den Projektoptionen > Parsing ist als Default-Modus {$mode objfpc} eingetragen, und das {$H+} ist unten als letzte Checkbox markiert.

Warf hat geschrieben:
wp_xyz hat geschrieben:Und wenn du nur am Textformat interessiert bist, sollte Length(Clipboard.AsText) ausreichen.

Auch wenn es binäre daten sind sollte Length funktionieren. Zwar sind AnsiStrings null terminiert, allerdings wird die längeninformation als separater wert gespeichert, weshalb im gegensatz zu C, alle 256 chars vorkommen können. Die Länge sollte also trozdem richtig sein.

Ich meinte eher den Fall, dass Clipboard.AsText gar nichts (0) zurückliefert, wenn das Format CF_TEXT nicht in der Zwischenablage ist (z.B. bei einem Bitmap).

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: Clipboard: Grösse abfragen

Beitrag von malabarista »

Ich frage schon vorsorglich ab, ob es Text ist,der im Clipboard steht.
Also von daher tut es length().

Antworten