Clipboard: Grösse abfragen

Für Fragen von Einsteigern und Programmieranfängern...

Clipboard: Grösse abfragen

Beitragvon malabarista » 2. Feb 2018, 09:44 Clipboard: Grösse abfragen

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?
malabarista
 
Beiträge: 287
Registriert: 11. Jun 2016, 11:16
Wohnort: Konstanz
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon mse » 2. Feb 2018, 09:56 Re: Clipboard: Grösse abfragen

Normalerweise werden Lazarus-Projekte mit -gh oder {$H+} kompiliert. Dann ist string = ansistring.
https://www.freepascal.org/docs-html/cu ... 350003.2.4
mse
 
Beiträge: 1967
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon wp_xyz » 2. Feb 2018, 10:06 Re: Clipboard: Grösse abfragen

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.
wp_xyz
 
Beiträge: 2616
Registriert: 8. Apr 2011, 08:01

Beitragvon malabarista » 2. Feb 2018, 10:51 Re: Clipboard: Grösse abfragen

Danke, genau das wollte ich wissen.
malabarista
 
Beiträge: 287
Registriert: 11. Jun 2016, 11:16
Wohnort: Konstanz
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 2. Feb 2018, 15:37 Re: Clipboard: Grösse abfragen

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.
Warf
 
Beiträge: 964
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon wp_xyz » 2. Feb 2018, 16:07 Re: Clipboard: Grösse abfragen

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).
wp_xyz
 
Beiträge: 2616
Registriert: 8. Apr 2011, 08:01

Beitragvon malabarista » 2. Feb 2018, 18:16 Re: Clipboard: Grösse abfragen

Ich frage schon vorsorglich ab, ob es Text ist,der im Clipboard steht.
Also von daher tut es length().
malabarista
 
Beiträge: 287
Registriert: 11. Jun 2016, 11:16
Wohnort: Konstanz
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0 | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste

porpoises-institution
accuracy-worried