Lazarus

Programming => Packages and Libraries => Topic started by: six1 on October 30, 2017, 12:57:09 pm

Title: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: six1 on October 30, 2017, 12:57:09 pm
Hi,
for a project of mine, i needed Drag&Drop inside my Software and also to and from external Windows (i.e. Explorer, Outlook...)

I didn't get that ยง$"%!& working on my own, but i found Melanders GREAT! Drag&Drop Suite.

Porting the Lib did the trick for me... there are 20 Components for doing the Drag&Drop in Melanders lib.
I got in contact with him and he allowed to publish the Lazarus fork.

Download the zip and extract it to your own components directory.
Open "DragDropLazarus.lpk" in subfolder "Source". Compile and Install it.
A new Section "DragDrop" will apear in Comonent List with 20 new Componnents.

The "DropContextMenue" Component will not work (untestet..), because there is no onOwnerDraw Event for TMenuItem in Lazarus.... (can't fix it, maybe one of you can..)

Tested DropSource and DropTarget, TVirtualFileStreamData, TFileDataFormat and it's working great!


Download Drag&Drop Suite Fork for Lazarus (https://packages.lazarus-ide.org/DragDrop.zip) 
Edit:
Package is now part of Lazarus OPM (OnlinePackageManager). Download and install it with OPM or only download Package with above Link.
DragDrop Suite was fixed for 64Bit Version of Lazarus by GetMem and tested by many others!  Thanks...

Have fun, Michael

see also: http://forum.lazarus.freepascal.org/index.php/topic,38362.0.html
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: balazsszekely on October 31, 2017, 07:52:16 am
Hi six1,

Thanks for converting the component to Lazarus. If you agree, I would like to add it to OPM(http://wiki.freepascal.org/Online_Package_Manager), but first we need to do a few modifications:
1. Fill in the missing info from package description. I did this step for you, please take a look at the attached screenshot. Is the information correct?
2. You should provide a few working examples. I did convert a 2-3 project from the Demos folder, but they are not working(maybe I'm doing something wrong)

regards,
GetMem
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: six1 on October 31, 2017, 08:41:10 am
Hi GetMem,
i will do the updates and correct the Delphi Samples for Lazarus.

best, Michael
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: six1 on November 01, 2017, 08:28:21 am
Hi,
i've translated a few Samples for Lazarus and also build a "mixed Sample"

Download for new version is  above Link.


Have fun, Michael
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: balazsszekely on November 01, 2017, 10:35:29 am
Quote
Hi,
i've translated a few Samples for Lazarus and also build a "mixed Sample"
Download for new version is above Link.
Thank you Michael, I added the component to OPM.
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: minesadorada on November 01, 2017, 02:19:58 pm
I added the component to OPM.
FYI It doesn't install in my version of Trunk.
FPCv3.1.1 Laz v1.9 SVN Rev. 56132M  Windows 10 64-bit
Message: "Cannot compile package"
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: six1 on November 01, 2017, 02:27:08 pm
Hi,
sorry, can't reproduce this, because i'm on 1.6.4 32Bit...

best, Michael
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: balazsszekely on November 01, 2017, 02:59:38 pm
@minesadorada
As always, thanks for reporting it.  :)

@six1
At some point the declaration of the function Stat(see unit dragdropformats), belonging to TStreamAdapter class, has changed from:
Code: Pascal  [Select][+][-]
  1. function Stat(out statstg: TStatStg;  grfStatFlag: Longint): HResult; override; stdcall;
to
Code: Pascal  [Select][+][-]
  1.  function Stat(out statstg: TStatStg; grfStatFlag: DWORD): HResult; virtual; stdcall;
You should find out the breaking revision then ifdef the code. I assume the changes were done in FPC 3.1.1(but this has to be checked).  So you need something like this:
Code: Pascal  [Select][+][-]
  1.     {$IF (FPC_FULLVERSION >= 30101)}
  2.     function Stat(out statstg: TStatStg; grfStatFlag: DWORD): HResult; override; stdcall;
  3.     {$ELSE}
  4.     function Stat(out statstg: TStatStg; grfStatFlag: Longint): HResult; override; stdcall;
  5.     {$ENDIF}
  6.  
and the same done in the implementation. Unfortunately trunk development sometimes break stable versions. OPM usually targets stable versions, so you don't have to correct this error but it would be nice.
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: six1 on November 01, 2017, 03:14:27 pm
Hi,
ok, updated Source with your sample GetMem... (above Download link is updated!)
Hope it works for newer Versions of FPC, as i can not test it at the moment.


best, Michael
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: JD on November 01, 2017, 08:48:16 pm
Hi,
ok, updated Source with your sample GetMem... (above Download link is updated!)
Hope it works for newer Versions of FPC, as i can not test it at the moment.


best, Michael

It works for me on Lazarus 1.8RC5 fpc 3.0.4 even before your latest modifications.

JD
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: balazsszekely on November 01, 2017, 10:04:28 pm
Quote
@JD
It works for me on Lazarus 1.8RC5 fpc 3.0.4 even before your latest modifications.
The bug mentioned by @minesadorada only occurs with FPC 3.1.1 or FPC trunk.

Quote
@six1
ok, updated Source with your sample GetMem... (above Download link is updated!)
Hope it works for newer Versions of FPC, as i can not test it at the moment.
You forget to ifdef the implementation part of the function Stat. I also modified the "Mixed demo" example.  FindFirstUTF8 was moved to lazfileutils in the latest version of Lazarus, so I had to add lazfileutils to the uses clauses. With that said DragDrop now works with: Laz: 1.6, 1.8, Trunk;  FPC: 3.0.0, 3.0.2, 3.0.4, Trunk. (https://packages.lazarus-ide.org/DragDrop.zip)
I tested each demo again, it works flawlessly on XP, Vista, Win7. On win10 however most off the demos are still not working. By not working I mean I start to drag a file from windows explorer to the designated area, but the cursor does not change, when I drop the file nothing happens. It could be some settings on my system, I did not have enough time to debug it.

@minesadorada
Can you please test it again. I know you have win10(64 bit). Install DragDrop, then open the first 1-2 demo from the LazDemos folder and see if it works on your system.

Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: six1 on November 02, 2017, 06:37:44 am
Hi GetMem,
first of all, i updated above Download with your fixed version.
I'm working with Win7 and Win10 both Lazarus 1.6.4 fpc 3.0.2
DragDrop is working on both Machines without any problems.

If starting Drag from File explorer didn't start (no Drag Icon), must be a Problem outside the Lib...


Best, Michael
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: balazsszekely on November 02, 2017, 07:02:00 am
Quote
@six1
DragDrop is working on both Machines without any problems.
OK then, I will have to figure it out what is wrong at my side.
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: minesadorada on November 02, 2017, 07:09:37 am
@minesadorada
Can you please test it again. I know you have win10(64 bit). Install DragDrop, then open the first 1-2 demo from the LazDemos folder and see if it works on your system.
Testing environment;
OS: Windows 10 64-bit
FPC 32-bit: v3.1.1
Lazarus 32-bit: v1.9 SVN:56132M

Component Re-installed via OPM.
Compiles OK
Opened project "Mixed Demo"

Win32 target: Compiles and runs OK; Drag and Drop functionality to/from Explorer OK

Win64 Target:
Compilation stalls in unit DragDropContext
Code: Pascal  [Select][+][-]
  1. DragDropContext.pas(68,22) Error: No matching implementation for interface method "GetCommandString(QWord;LongWord;PUINT;PChar;LongWord):LongInt; StdCall; found"

Linux compilation fails with "Windows" unit in unit DragDrop

HTH
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: balazsszekely on November 02, 2017, 07:18:19 am
@minesadorada
I'm afraid DragDrop component is windows only. I changed supported widgetset to win32/64 in OPM. I will investigate the Win64 target error. Thank you for testing.
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: balazsszekely on November 02, 2017, 08:16:49 am
I fixed the issue, please test again on 64bit. Thank you.
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: six1 on November 02, 2017, 08:28:23 am
Thanks GetMem!
Edited Download to https://packages.lazarus-ide.org/DragDrop.zip

Best, Michael
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: minesadorada on November 02, 2017, 09:09:37 am
I fixed the issue, please test again on 64bit. Thank you.
DragDrop V5.2.0.0  Testing environment: as before.
Target=64-bit Windows
Installs from OPM: OK
Compiles: OK
Mixed Demo; Compiles: OK
Mixed Demo; Runs: OK

All Good - congratulations, guys!
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: six1 on February 08, 2019, 03:20:50 pm
Changes for Lazarus 2.0 fpc 3.0.4

DropSource.pas Line 886 replace line with
      {$if FPC_FULlVERSION > 30003}
      {$if LCL_FULLVERSION >= 1090000}
        IsDraggingImage := ImageList_BeginDrag(FImages.ResolutionByIndex[0].Reference.Handle, FImageIndex,
      {$else}
        IsDraggingImage := ImageList_BeginDrag(FImages.Handle, FImageIndex,
      {$endif}

DropTarget.pas Line 556 replace with
          {$if FPC_FULlVERSION > 30003}
          {$if LCL_FULLVERSION >= 1090000}
            ImageList_SetDragCursorImage( FImages.ResolutionByIndex[0].Reference.Handle, 0, FImageHotSpot.x, FImageHotSpot.y);
          {$else}
            ImageList_SetDragCursorImage({FImages.Handle} , 0, FImageHotSpot.x, FImageHotSpot.y);
          {$endif}


best, michael
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: balazsszekely on February 08, 2019, 06:46:30 pm
Michael,
Are you sure it's FPC_FULLVERSION? The handle change has nothing to do with fpc. More likely LCL_FULLVERSION >= 1090000
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: six1 on February 09, 2019, 08:34:26 am
Hi GetMem,
you're absolutly right!

          {$if LCL_FULLVERSION >= 1090000}
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: balazsszekely on February 09, 2019, 08:54:21 am
Hi GetMem,
you're absolutly right!

          {$if LCL_FULLVERSION >= 1090000}

OK. I updated the package in OPM. Works both with Lazarus 2.0.0 and Trunk.
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: six1 on February 09, 2019, 10:22:15 am
Thank you for your work for the lazarus Comunity!
by the way: I love the OPM
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: avra on February 10, 2019, 06:00:41 pm
There is a compilation error for Lazarus 2.0 fixes with FPC 3.2 fixes:

Quote
Compile package DragDropLazarus 5.2: Exit code 1, Errors: 1, Warnings: 23
DragDrop.inc(220,2) Warning: Illegal identifier "UNSAFE_TYPE" for $WARN directive
DragDrop.inc(221,2) Warning: Illegal identifier "UNSAFE_CODE" for $WARN directive
DragDrop.inc(222,2) Warning: Illegal identifier "UNSAFE_CAST" for $WARN directive
DragDrop.pas(45,15) Warning: An inherited method is hidden by "SetSize(LongInt;LongInt);"
DragDrop.pas(116,14) Warning: An inherited method is hidden by "QueryInterface(constref TGuid;out <Formal type>):LongInt; StdCall;"
DragDrop.pas(139,5) Warning: Constructor should be public
DragDrop.pas(140,5) Warning: Constructor should be public
DragDrop.inc(202,2) Warning: Misplaced global compiler switch, ignored
DragDrop.inc(220,2) Warning: Illegal identifier "UNSAFE_TYPE" for $WARN directive
DragDrop.inc(221,2) Warning: Illegal identifier "UNSAFE_CODE" for $WARN directive
DragDrop.inc(222,2) Warning: Illegal identifier "UNSAFE_CAST" for $WARN directive
DragDropFormats.pas(130,14) Warning: An inherited method is hidden by "Seek(Int64;LongInt;out Int64):LongInt; StdCall;"
DragDropFormats.pas(132,14) Warning: An inherited method is hidden by "Read(Pointer;LongInt;PLongint):LongInt; StdCall;"
DragDropFormats.pas(134,14) Warning: An inherited method is hidden by "CopyTo(IStream;Int64;out Int64;out Int64):LongInt; StdCall;"
DragDrop.inc(202,2) Warning: Misplaced global compiler switch, ignored
DragDrop.inc(220,2) Warning: Illegal identifier "UNSAFE_TYPE" for $WARN directive
DragDrop.inc(221,2) Warning: Illegal identifier "UNSAFE_CODE" for $WARN directive
DragDrop.inc(222,2) Warning: Illegal identifier "UNSAFE_CAST" for $WARN directive
DropSource.pas(98,21) Error: No matching implementation for interface method "SetData(const tagFORMATETC;var TagSTGMEDIUM;LongBool):LongInt; StdCall;" found
DropSource.pas(257,12) Warning: An inherited method is hidden by "GetPerformedDropEffect:DWord;"
DropSource.pas(258,12) Warning: An inherited method is hidden by "GetLogicalPerformedDropEffect:DWord;"
DropSource.pas(259,12) Warning: An inherited method is hidden by "GetPreferredDropEffect:DWord;"
DropSource.pas(260,13) Warning: An inherited method is hidden by "SetPerformedDropEffect(const LongWord);"
DropSource.pas(261,13) Warning: An inherited method is hidden by "SetPreferredDropEffect(const LongWord);"
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: balazsszekely on February 11, 2019, 08:00:56 am
There is a compilation error for Lazarus 2.0 fixes with FPC 3.2 fixes.
Fixed. Now it works with FPC 3.2 fixes, FPC Trunk.
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: avra on February 11, 2019, 09:12:04 am
There is a compilation error for Lazarus 2.0 fixes with FPC 3.2 fixes.
Fixed. Now it works with FPC 3.2 fixes, FPC Trunk.
Confirmed. Thanks!  :D
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2"
Post by: six1 on March 13, 2019, 01:31:20 pm
Hi GetMem,
you're absolutly right!

          {$if LCL_FULLVERSION >= 1090000}

and also add in uses clause: lclversion  in Files DropTarget.pas and DropSource.pas
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: Giorgio Tani on April 01, 2019, 01:50:30 pm
Hello, in first place thank you very much for this excellent port!

I'm testing the SourceDemo example and works fine on Win32, but on Win64 (two W7 64 bit test machines with Lazarus 1.8.4 for Windows 64 bit) the instruction DropFileSource1.Execute generate an access violation error.
Running through the debugger it seems a SIGSEV event - it crashes LCL control.inc, procedure TControl.WndProc, line 2252 Dispatch(TheMessage);

Am I doing something wrong on my side or can you confirm this issue on Win64?

In any case thank you again and keep up the good work!
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: six1 on April 01, 2019, 02:52:49 pm
Sorry, but i'm on WIN10 64 bit Lazarus 32bit...
Maybe GetMem can test and solve it...
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: Giorgio Tani on April 14, 2019, 05:23:36 pm
I've tested dropping files from application to system a bit further, on Windows 64 bit with application compiled with 64 bit Lazarus.
All seems fine until it is called the DoDragDrop function from ole32.dll in unit DropSource.
The very same code works perfectly if compiled for 32 bit, both on Windows 32 bit and Windows 64 bit systems (where it calls the 32 bit version of the dll from SysWOW64).
Probably there is something in IDataObject and IDropSource definition in the library that works fine on 32 bit Windows systems but is not accepted by the 64 bit version of the dll, I'll search further for similar 32-to-64 bit issues in Delphi forums.
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: six1 on April 18, 2019, 03:22:59 pm
maybe you will have a look at the original Sources from Andres Melander?
http://melander.dk/delphi/dragdrop/#

...not excluded that I've installed a bug in the port  ::)
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: Birger52 on April 23, 2019, 12:07:01 am
Trying to use this, to drag text out of a TMemo.

Can't find any instructions anywhere.
So tried using TDropTextSource, as per the demo SourceDemo (SimpleSourceDemo).

It dies with
Project ... raised exception class 'External: SIGSEGV'.
At adress ....
as soon as dragging starts.

Click OK and execution is halted as in attached image.
Attempts to continue, gives the choise to continue and risk damage or cancel to exit.
No mater what, I get a turning circle, and the only way out of this is to use the Stop button in Lazarus.

Win 7 64bit Lazarus 1.8.4 FPC 3.0.4
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: Birger52 on April 23, 2019, 01:48:13 pm
Tried singlestepping, through starting a drag.
Error occurs in DropSource.pas
line 925:       DropResult := DoDragDrop(Self, Self, AllowedEffects, lpdword(DropEffect));
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: Giorgio Tani on April 27, 2019, 09:01:46 pm
Hello, I've tested the problem again and it seems the issue is simpler than I initially thought.

I changed the call to DoDragDrop API in DropSource.pas from
DropResult := DoDragDrop(Self, Self, AllowedEffects, lpdword(DropEffect));
to
DropResult := DoDragDrop(Self, Self, AllowedEffects, lpdword(@DropEffect));

Now dropping files from application to system works without issues, both for exe compiled with Lazarus for Win32 and ones compiled with Lazarus for Win64.

Please note it may be needed to do clean and rebuild in order DropSource.pas gets compiled again and the change takes effect.

I've not tested if similar issue exists for other parts of the library as I was focusing on DropFileSource component.
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: Birger52 on April 29, 2019, 02:12:18 pm
This makes the DragTextSource function for me.
(Win 7 64bit Lazarus 1.8.4 FPC 3.0.4)
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: Birger52 on April 29, 2019, 10:00:27 pm
Trying to use TDropTextTarget, it is not possible to use DragTypes dtMove, however.
Symbol on dragged icon is always with the + indicating copy, and pressing Shift, Ctrl or Alt has no effect.
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: Birger52 on May 01, 2019, 01:59:25 pm
dtMove does not function with TDragTextSource either
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: Giorgio Tani on May 05, 2019, 05:25:14 pm
Hello, I must thank you as I've successfully implemented standard Windows drag and drop (files from the application to the system) in my software PeaZip due this wonderful library.

While working on integration of the library in my project one I decided to place all the drag and drop related code in a DLL so 1) I had not to test all my existing project's code for Delphi syntax (it uses default FreePascal syntax) 2) it will be easier to re-use in other projects.

I named the DLL dragdropfilesdll, you can find the source code package in my spin-off projects page
http://www.peazip.org/peazip-add-ons.html#sfx_modules_spinoff_utilities

So far I've implemented two procedures to fit my needs, but any suggestion is welcome to improve the code and to make this more useful to third parts projects:

dodropfiles(winc:TWinControl; sarr: array of ansistring; dropmode:integer);
detects drag and drop event from the first parameter's wincontrol (i.e. a listview), and drop to the system all the files listed in second parameter (array of ansistring of full names), allowed drag&drop operations are encoded in third parameter

dodropvfiles(winc:TWinControl; vpath: ansistring; dropmode:integer);
works mostly as previous procedure, but waits for files being created in vpath - my application is a file archiver, so I used this procedure to wait for extraction of files, but can be used when files are being downloaded, or transferred thorough FTP etc - before finalizing the drag and drop operation

I hope this contribution may help other developers to use some of the potentialities of Drag and Drop Suite.
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: Giorgio Tani on June 14, 2019, 01:50:51 pm
Hello, I've updated the dragdropfilesdll
http://www.peazip.org/peazip-add-ons.html#sfx_modules_spinoff_utilities

dodropvfiles was improved, now it can be changed on the fly (before completing ondrop event), the "virtual" drop source location where files are created before drag and drop finalizes.
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: wp on November 03, 2020, 12:42:49 pm
I checked out this package with Laz 2.0.10 and found that it does compile but the sample project for drag and drop onto the Explorer crash with an unspecified exception.
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: six1 on November 04, 2020, 08:18:20 am
I fixed the Drag&Drop Suite and sent it to GetMem for update.

"Mixed Demo" is updated, now working with LCL scaling.
Testet with Lazarus 2.0.10 FPC 3.20
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: Giorgio Tani on March 20, 2021, 07:05:34 pm
Hello, I've published 0.12 version of dragdropfilesdll
http://www.peazip.org/peazip-add-ons.html#sfx_modules_spinoff_utilities

I've improved the dodropvfiles procedure, which waits for files being created before finalizing the drag and drop operation, i.e. waiting for extraction, ftp transfer etc.
The procedure now pass the list of files as an array of strings as expected by most of the Windows applications, so it works fine dropping files into for example 7-Zip or WinRar while previously worked only dropping files to Windows file explorer.

The other procedure dodropfiles, which works on files already existing on the filesystem, always passed the list of file this way so never had this issue.
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: robertkondner on June 19, 2021, 10:20:43 pm
Hi,

I need to copy a file to the clipboard and I understand there are such tools in the Suite.

Can anyone give me a pointer to a source file or maybe even an example?

Thanks,
Bob K.
Title: Re: Fork of Anders Melander's "Drag and Drop Suite 5.2" (WIN only!)
Post by: six1 on June 20, 2021, 04:02:29 pm
That's easy:

    DropFileSource1.EmptyClipboard;
    DropFileSource1.Files.Clear;
    DropFileSource1.Files.Add( [Your File with Path]);
// more Files, if needed...     DropFileSource1.Files.Add( [Your File with Path]);
    DropFileSource1.CopyToClipboard;
TinyPortal © 2005-2018