Autor Téma: Ulozenie obsahu schranky do suboru/DB  (Přečteno 421 krát)

Offline dee

  • Plnoletý
  • ***
  • Příspěvků: 124
  • Karma: 1
    • Verze Delphi: D7, XE7
Ulozenie obsahu schranky do suboru/DB
« kdy: 27-02-2019, 13:16:58 »
Zdar,

Je mozne v novych Delphi ulozit obsach schranky (clipboard) ci uz do suboru alebo databazy (v nejakej binarnej podobe) bez ohladu na jeho obsah, text, obrazok .... a potom ho opatovne napriklad po restarte zariadenia vratit do schranky ?

praca z textom nieje problem, jedna sa hlavne o ine formaty ktore mozu byt do schranky vlozene, pripadne aj z inych aplikacii
Kód: Delphi [Vybrat]
  1. uses
  2.    Clipbrd;
  3.  
  4. procedure TForm1.Button1Click(Sender: TObject);
  5. begin
  6. if Clipboard.HasFormat(CF_TEXT) then
  7.   Edit1.Text := Clipboard.AsText
  8. else
  9.   MessageDlg('There is no text on the Clipboard', mtInformation,
  10.         [mbOK],0);
  11.  
  12. end;

Dakujem za rady.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1721
  • Karma: 66
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Ulozenie obsahu schranky do suboru/DB
« Odpověď #1 kdy: 27-02-2019, 13:50:49 »
Pro ulozeni bych enumeroval formaty (EnumClipboardFormats), pro kazdy format ziskal data (GetClipboardData) a ukladal (GlobalLock, GlobalSize, kopie bloku pameti, GlobalUnlock) napr. do strukturovaneho streamu zaznamu (treba ve formatu Format/DataSize/DataStream).

Pro nacteni pak cetl zaznamy takoveho streamu a data vkladal do schranky (SetClipboardData).
« Poslední změna: 27-02-2019, 13:57:10 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline dee

  • Plnoletý
  • ***
  • Příspěvků: 124
  • Karma: 1
    • Verze Delphi: D7, XE7
Re:Ulozenie obsahu schranky do suboru/DB
« Odpověď #2 kdy: 27-02-2019, 13:58:33 »
vedel by si sem vlozit aj nejaky vzorovy kod ako sa to pouziva.
vyzera to celkom zaujimavo, ale zas je to z Windows API teda to nepojde pouzit na androide, ale to zas nieje az taky problem

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1721
  • Karma: 66
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Ulozenie obsahu schranky do suboru/DB
« Odpověď #3 kdy: 27-02-2019, 15:55:39 »
vedel by si sem vlozit aj nejaky vzorovy kod ako sa to pouziva.
vyzera to celkom zaujimavo, ale zas je to z Windows API teda to nepojde pouzit na androide, ale to zas nieje az taky problem

Ano, ale ne dnes (Copa del Rey); nechci to psat v browseru, byt jde u te ulohy pro Windows o pomerne snadnou zalezitost. Ohledne Android se zkusim podivat, nicmene FMX zda se pro tento mechanismus nema interface (tudiz bude treba taktez nejake rozsireni).
« Poslední změna: 27-02-2019, 16:08:52 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline dee

  • Plnoletý
  • ***
  • Příspěvků: 124
  • Karma: 1
    • Verze Delphi: D7, XE7
Re:Ulozenie obsahu schranky do suboru/DB
« Odpověď #4 kdy: 02-03-2019, 07:47:34 »
v pohode, nejako mi to neponahla

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1721
  • Karma: 66
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Ulozenie obsahu schranky do suboru/DB
« Odpověď #5 kdy: 02-03-2019, 12:55:15 »
Pro VCL (tedy Windows platformu, napr.):

Kód: Delphi [Vybrat]
  1. uses
  2.   Vcl.Clipbrd;
  3.  
  4. type
  5.   TClipboardHelper = class helper for TClipboard
  6.   public
  7.     procedure CopyToStream(Stream: TStream);
  8.     procedure PasteFromStream(Stream: TStream);
  9.   end;
  10.  
  11. implementation
  12.  
  13. { TClipboardHelper }
  14.  
  15. procedure TClipboardHelper.CopyToStream(Stream: TStream);
  16. var
  17.   Kind: UINT;
  18.   Data: LPVOID;
  19.   Size: SIZE_T;
  20.   Slot: THandle;
  21. begin
  22.   Open; // open the clipboard
  23.   try
  24.     Kind := EnumClipboardFormats(0); // start the format enumeration
  25.     while Kind <> 0 do // loop while we get valid clipboard format
  26.     begin
  27.       Slot := GetClipboardData(Kind); // get data object in the given format
  28.       if Slot <> 0 then // check if we got valid data object handle; if yes, then...
  29.       begin
  30.         Data := GlobalLock(Slot); // lock the data object
  31.         if Data <> nil then // check if the object was properly locked; if yes, then...
  32.         try
  33.           Size := GlobalSize(Slot); // get the data length
  34.           if Size <> 0 then // check if we received valid data length; if yes, then...
  35.           begin
  36.             Stream.Write(Kind, SizeOf(Kind)); // write the format kind
  37.             Stream.Write(Size, SizeOf(Size)); // write the data length
  38.             Stream.Write(Data^, Size); // write the data stream
  39.           end;
  40.         finally
  41.           GlobalUnlock(Slot); // unlock the data object
  42.         end;
  43.       end;
  44.       Kind := EnumClipboardFormats(Kind); // continue the format enumeration
  45.     end;
  46.   finally
  47.     Close; // close the clipboard
  48.   end;
  49. end;
  50.  
  51. procedure TClipboardHelper.PasteFromStream(Stream: TStream);
  52. var
  53.   Kind: UINT;
  54.   Data: LPVOID;
  55.   Size: SIZE_T;
  56.   Slot: HGLOBAL;
  57. begin
  58.   Open; // open the clipboard
  59.   try
  60.     Clear; // clear the clipboard
  61.     while (Stream.Read(Kind, SizeOf(Kind)) = SizeOf(Kind)) and (Stream.Read(Size, SizeOf(Size)) = SizeOf(Size)) do // loop while we can read data format and length
  62.     begin
  63.       Slot := GlobalAlloc(GMEM_MOVEABLE, Size); // allocate block of memory on the heap
  64.       if Slot <> 0 then // check if we got valid handle to the allocated object; if yes, then...
  65.       try
  66.         Data := GlobalLock(Slot); // lock the data object
  67.         if Data <> nil then // check if the object was properly locked; if yes, then...
  68.         try
  69.           if SIZE_T(Stream.Read(Data^, Size)) = Size then // if we could read expected amount of data, then...
  70.             if SetClipboardData(Kind, Slot) = 0 then // try to put the data object in the given format into the clipboard; if that fails, then...
  71.               RaiseLastOSError; // setting of the clipboard data failed, so raise the last OS error exception
  72.         finally
  73.           GlobalUnlock(Slot); // unlock the data object
  74.         end
  75.         else
  76.           RaiseLastOSError; // object was not locked, so raise the last OS error exception
  77.       except
  78.         GlobalFree(Slot); // in case of failure release the last allocated object
  79.         raise;
  80.       end
  81.       else
  82.         RaiseLastOSError; // memory was not allocated, so raise the last OS error exception
  83.     end;
  84.   finally
  85.     Close; // close the clipboard
  86.   end;
  87. end;

Pouziti pak napr.:

Kód: Delphi [Vybrat]
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   Stream: TStream;
  4. begin
  5.   Stream := TFileStream.Create('C:\Clipboard.bin', fmCreate);
  6.   try
  7.     Clipboard.CopyToStream(Stream); // save the clipboard content to stream
  8.   finally
  9.     Stream.Free;
  10.   end;
  11. end;
  12.  
  13. procedure TForm1.Button2Click(Sender: TObject);
  14. var
  15.   Stream: TStream;
  16. begin
  17.   Stream := TFileStream.Create('C:\Clipboard.bin', fmOpenRead);
  18.   try
  19.     Clipboard.PasteFromStream(Stream); // paste the clipboard content from stream to clipboard
  20.   finally
  21.     Stream.Free;
  22.   end;
  23. end;
« Poslední změna: 02-03-2019, 13:01:45 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!