AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Clipboard temporär speichern

Ein Thema von Codehunter · begonnen am 23. Mär 2010 · letzter Beitrag vom 9. Aug 2016
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Clipboard temporär speichern

  Alt 23. Mär 2010, 10:55
Hallo alle zusammen!

Ich habe folgendes Problem: Eine ActiveX-Komponente kann ausschließlich über die Zwischenablage Text einfügen (hat kein Interface mit dem man Strings übergeben könnte). Beim Einfügen übernimmt die Komponente die Textformatierungen welche in der Zwischenablage enthalten sind. Um das zu umgehen hole ich mir zur Laufzeit erstmal mit Clipboard.AsText den unformatierten Text in eine String-Variable, leere dann mit Clipboard.Clear die Zwischenablage und füge dann mit Clipboard.AsText:= Variable den Klartext wieder ein. Dann wird die ActiveX-Komponente angewiesen, den Inhalt der Zwischenablage einzufügen.

Soweit funktioniert das auch ganz gut. Nur möchte ich, daß nach der ganzen Aktion der originale Inhalt der Zwischenablage wieder hergestellt wird. TClipboard hat (zumindest in D5) keine Methode wie z.B. SaveToFile oder .SaveToStream. Gibt es eine Möglichkeit, eine Zwischenablage komplett zwischenzuspeichern und wiederherzustellen? Quasi die Rohdaten, unabhängig der Format-Container die da enthalten sind?

Danke schon mal
Cody
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.536 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Clipboard temporär speichern

  Alt 23. Mär 2010, 11:00
Ich weiß nicht, ob es funktioniert, aber ich habe das hier gefunden.

Hth
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Clipboard temporär speichern

  Alt 23. Mär 2010, 11:51
Vielen Dank für die schnelle Hilfe. Vier Augen sehen eben mehr als zwei

Ich kann bestätigen daß der verlinkte Code funktioniert, auch mit Clipboard-Containerformaten die Delphi 5 noch nicht kennt. Ich habs nur noch dahingehend optimiert daß eine temporäre Datei mit zufallsgeneriertem Namen erzeugt wird die im System-Temp-Verzeichnis liegt (Vista/7-Kompatibilität) und die automatisch wieder gelöscht wird.

Frage beantwortet und Thread geschlossen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Clipboard temporär speichern

  Alt 23. Mär 2010, 11:52
Sollte sie nicht besser im Temporärenverzeichnis des Benutzers liegen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Clipboard temporär speichern

  Alt 24. Mär 2010, 07:11
Mit System-Temp meinte ich das Verzeichnis das bei jeder Windows-Version in %TEMP% definiert ist. Das ist bei den neueren NTs eben das Temp-Verzeichnis im jeweiligen Profilpfad und bei den Win 9x das globale Verzeichnis. Bekommt man auch mit Windows.GetTempPath wenn man nicht mit den alten Variablen arbeiten will.
  Mit Zitat antworten Zitat
handyotto

Registriert seit: 6. Aug 2012
10 Beiträge
 
#6

AW: Re: Clipboard temporär speichern

  Alt 9. Aug 2016, 10:40
Ich weiß nicht, ob es funktioniert, aber ich habe das hier gefunden.

Ja, alter Thread, ich weiß ja... aber leider hat der Link etwas Entscheidendes verloren... seinen Inhalt.
Und wo ich auch Suche, immer wieder werde ich dorthin verwiesen...

Hat das noch jemand parat?

Ich kann bestätigen daß der verlinkte Code funktioniert... nur noch ... optimiert ...
Natürlich gerne auch optimiert...


Danke!
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.108 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Clipboard temporär speichern

  Alt 9. Aug 2016, 11:00
Etwas Geduld vorausgesetzt hilft die Internet Wayback Machine mit einer Zeitreise zurück ins selige Jahr 2005 als die Seite noch ging:

http://web.archive.org/web/200505141...ode.php?id=945
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.760 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Clipboard temporär speichern

  Alt 9. Aug 2016, 12:40
Und weil auch das Webarchiv irgendwann einmal den Weg alles irdischen gegangen sein könnte:

Zitat:
...copy the clipboard to a stream and restore it again?
Autor: P. Below
Homepage: http://www.teamb.com

Delphi-Quellcode:
uses
  clipbrd;

procedure CopyStreamToClipboard(fmt: Cardinal; S: TStream);
var
  hMem: THandle;
  pMem: Pointer;
begin
  Assert(Assigned(S));
  S.Position := 0;
  hMem := GlobalAlloc(GHND or GMEM_DDESHARE, S.Size);
  if hMem <> 0 then
  begin
    pMem := GlobalLock(hMem);
    if pMem <> nil then
    begin
      try
        S.Read(pMem^, S.Size);
        S.Position := 0;
      finally
        GlobalUnlock(hMem);
      end;
      Clipboard.Open;
      try
        Clipboard.SetAsHandle(fmt, hMem);
      finally
        Clipboard.Close;
      end;
    end { If }
    else
    begin
      GlobalFree(hMem);
      OutOfMemoryError;
    end;
  end { If }
  else
    OutOfMemoryError;
end; { CopyStreamToClipboard }

procedure CopyStreamFromClipboard(fmt: Cardinal; S: TStream);
var
  hMem: THandle;
  pMem: Pointer;
begin
  Assert(Assigned(S));
  hMem := Clipboard.GetAsHandle(fmt);
  if hMem <> 0 then
  begin
    pMem := GlobalLock(hMem);
    if pMem <> nil then
    begin
      try
        S.Write(pMem^, GlobalSize(hMem));
        S.Position := 0;
      finally
        GlobalUnlock(hMem);
      end;
    end { If }
    else
      raise Exception.Create('CopyStreamFromClipboard: could not lock global handle ' +
        'obtained from clipboard!');
  end; { If }
end; { CopyStreamFromClipboard }

procedure SaveClipboardFormat(fmt: Word; writer: TWriter);
var
  fmtname: array[0..128] of Char;
  ms: TMemoryStream;
begin
  Assert(Assigned(writer));
  if 0 = GetClipboardFormatName(fmt, fmtname, SizeOf(fmtname)) then
    fmtname[0] := #0;
  ms := TMemoryStream.Create;
  try
    CopyStreamFromClipboard(fmt, ms);
    if ms.Size > 0 then
    begin
      writer.WriteInteger(fmt);
      writer.WriteString(fmtname);
      writer.WriteInteger(ms.Size);
      writer.Write(ms.Memory^, ms.Size);
    end; { If }
  finally
    ms.Free
  end; { Finally }
end; { SaveClipboardFormat }

procedure LoadClipboardFormat(reader: TReader);
var
  fmt: Integer;
  fmtname: string;
  Size: Integer;
  ms: TMemoryStream;
begin
  Assert(Assigned(reader));
  fmt := reader.ReadInteger;
  fmtname := reader.ReadString;
  Size := reader.ReadInteger;
  ms := TMemoryStream.Create;
  try
    ms.Size := Size;
    reader.Read(ms.memory^, Size);
    if Length(fmtname) > 0 then
      fmt := RegisterCLipboardFormat(PChar(fmtname));
    if fmt <> 0 then
      CopyStreamToClipboard(fmt, ms);
  finally
    ms.Free;
  end; { Finally }
end; { LoadClipboardFormat }

procedure SaveClipboard(S: TStream);
var
  writer: TWriter;
  i: Integer;
begin
  Assert(Assigned(S));
  writer := TWriter.Create(S, 4096);
  try
    Clipboard.Open;
    try
      writer.WriteListBegin;
      for i := 0 to Clipboard.formatcount - 1 do
        SaveClipboardFormat(Clipboard.Formats[i], writer);
      writer.WriteListEnd;
    finally
      Clipboard.Close;
    end; { Finally }
  finally
    writer.Free
  end; { Finally }
end; { SaveClipboard }

procedure LoadClipboard(S: TStream);
var
  reader: TReader;
begin
  Assert(Assigned(S));
  reader := TReader.Create(S, 4096);
  try
    Clipboard.Open;
    try
      clipboard.Clear;
      reader.ReadListBegin;
      while not reader.EndOfList do
        LoadClipboardFormat(reader);
      reader.ReadListEnd;
    finally
      Clipboard.Close;
    end; { Finally }
  finally
    reader.Free
  end; { Finally }
end; { LoadClipboard }


// Examples:


{ Save Clipboard }

procedure TForm1.Button1Click(Sender: TObject);
var
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  try
    SaveClipboard(ms);
    ms.SaveToFile('c:\temp\ClipBrdSaved.dat');
  finally
    ms.Free;
  end; { Finally }
end;

{ Clear Clipboard }

procedure TForm1.Button2Click(Sender: TObject);
begin
  clipboard.Clear;
end;

{ Restore Clipboard }

procedure TForm1.Button3Click(Sender: TObject);
var
  fs: TfileStream;
begin
  fs := TFilestream.Create('c:\temp\ClipBrdSaved.dat',
    fmopenread or fmsharedenynone);
  try
    LoadClipboard(fs);
  finally
    fs.Free;
  end; { Finally }
end;
Sherlock
- bevor Fragen aufkommen: Die Delphipraxis ist ewig...
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann

Geändert von Sherlock ( 9. Aug 2016 um 12:44 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz