using SendFTP() How to copy to clipboard?

To add comments, please log in or register
Ricky
130
Ricky  
Guys i need help with coding...
The goal is to... "take screen shot" (done) and "send it to ftp server" (done) then "copy file link to windows clipboard" (problem)

This is the code i use, for the script:

//create a filename based on "year-month-day_hour minute symbol"
  string filename = TimeYear(TimeCurrent())+"-"+TimeMonth(TimeCurrent())+"-"+TimeDay(TimeCurrent())+"_"+TimeHour(TimeCurrent())+""+TimeMinute(TimeCurrent())+"-"+Symbol(); 

//take screenshot of current chart
  if(!WindowScreenShot(filename+".gif",1280,600,-1,-1,-1)) GetLastError();

//send "year-month-day_hour minute symbol.gif" to specified ftp server
  else if(!SendFTP(filename+".gif","/Journal/Current Month/")) GetLastError();

/*when send is complete and no error, copy the entire link to clipboard.
example: "http://www.someftpsite.com/someftpfolder/year-month-day_hour minute symbol.gif" is copied into the clipboard so we can paste that link text anywhere we need.
Please help me how to do this?? */
:'(
bernd
989
bernd  
The easiest way is to call Alert() with the link. You can the select the text (in the upper gray area, not in the list) and copy it into the clipboard.

Directly copying into the clipboard is possible only with some direct calls into the windows API: http://www.codeproject.com/KB/clipboard/archerclipboard1.aspx. These naked windows API calls always look like it is really great "fun" using them, especially from mql4 which has not the ability to define data structures :-/
JC
1647
JC  
ricx:
The goal is to... "take screen shot" (done) and "send it to ftp server" (done) then "copy file link to windows clipboard" (problem)
I find it a little hard to believe that there isn't a better way to achieve whatever overall aim you have in mind, but the following MQL4 code will set the clipboard with a specified piece of text:

#import "kernel32.dll"
   int GlobalAlloc(int Flags, int Size);
   int GlobalLock(int hMem);
   int GlobalUnlock(int hMem);
   int GlobalFree(int hMem);
   int lstrcpyA(int ptrhMem, string Text);
#import


#import "user32.dll"
   int OpenClipboard(int hOwnerWindow);
   int EmptyClipboard();
   int CloseClipboard();
   int SetClipboardData(int Format, int hMem);
#import

#define GMEM_MOVEABLE   2
#define CF_TEXT         1

// Copies the specified text to the clipboard, returning true if successful
bool CopyTextToClipboard(string Text)
{
   bool bReturnvalue = false;
   
   // Try grabbing ownership of the clipboard 
   if (OpenClipboard(0) != 0) {
      // Try emptying the clipboard
      if (EmptyClipboard() != 0) {
         // Try allocating a block of global memory to hold the text 
         int lnString = StringLen(Text);
         int hMem = GlobalAlloc(GMEM_MOVEABLE, lnString + 1);
         if (hMem != 0) {
            // Try locking the memory, so that we can copy into it
            int ptrMem = GlobalLock(hMem);
            if (ptrMem != 0) {
               // Copy the string into the global memory
               lstrcpyA(ptrMem, Text);            
               // Release ownership of the global memory (but don't discard it)
               GlobalUnlock(hMem);            

               // Try setting the clipboard contents using the global memory
               if (SetClipboardData(CF_TEXT, hMem) != 0) {
                  // Okay
                  bReturnvalue = true;   
               } else {
                  // Failed to set the clipboard using the global memory
                  GlobalFree(hMem);
               }
            } else {
               // Meemory allocated but not locked
               GlobalFree(hMem);
            }      
         } else {
            // Failed to allocate memory to hold string 
         }
      } else {
         // Failed to empty clipboard
      }
      // Always release the clipboard, even if the copy failed
      CloseClipboard();
   } else {
      // Failed to open clipboard
   }

   return (bReturnvalue);
}
Ricky
130
Ricky  
@7bit & jjc Thank you very much :)
there are many ways to achieve "the clipboard" goals... wow... :D

again, thanks guys.
Ray Kim
9
Ray Kim  

The following code copy text to clipboard.

I need an opposite function.

Could you help me copy text from clipboard?

string CopyTextFromClipboard()

{

}

The following code is by jjc.

jjc 2010.03.25 16:06

#import "kernel32.dll"
   int GlobalAlloc(int Flags, int Size);
   int GlobalLock(int hMem);
   int GlobalUnlock(int hMem);
   int GlobalFree(int hMem);
   int lstrcpyA(int ptrhMem, string Text);
#import


#import "user32.dll"
   int OpenClipboard(int hOwnerWindow);
   int EmptyClipboard();
   int CloseClipboard();
   int SetClipboardData(int Format, int hMem);
#import

#define GMEM_MOVEABLE   2
#define CF_TEXT         1

// Copies the specified text to the clipboard, returning true if successful
bool CopyTextToClipboard(string Text)
{
   bool bReturnvalue = false;
   
   // Try grabbing ownership of the clipboard 
   if (OpenClipboard(0) != 0) {
      // Try emptying the clipboard
      if (EmptyClipboard() != 0) {
         // Try allocating a block of global memory to hold the text 
         int lnString = StringLen(Text);
         int hMem = GlobalAlloc(GMEM_MOVEABLE, lnString + 1);
         if (hMem != 0) {
            // Try locking the memory, so that we can copy into it
            int ptrMem = GlobalLock(hMem);
            if (ptrMem != 0) {
               // Copy the string into the global memory
               lstrcpyA(ptrMem, Text);            
               // Release ownership of the global memory (but don't discard it)
               GlobalUnlock(hMem);            

               // Try setting the clipboard contents using the global memory
               if (SetClipboardData(CF_TEXT, hMem) != 0) {
                  // Okay
                  bReturnvalue = true;   
               } else {
                  // Failed to set the clipboard using the global memory
                  GlobalFree(hMem);
               }
            } else {
               // Meemory allocated but not locked
               GlobalFree(hMem);
            }      
         } else {
            // Failed to allocate memory to hold string 
         }
      } else {
         // Failed to empty clipboard
      }
      // Always release the clipboard, even if the copy failed
      CloseClipboard();
   } else {
      // Failed to open clipboard
   }

   return (bReturnvalue); 

}

Tom Sasson
266
Tom Sasson  
Ray Kim:

The following code copy text to clipboard.

I need an opposite function.

Could you help me copy text from clipboard?

string CopyTextFromClipboard()

{

}

The following code is by jjc.

jjc 2010.03.25 16:06

}

First, I know this post is old, but as I was looking for a way to copy to clipboard, I bumped into the code on this thread.

Since it helped me a lot with my program, I wanted to contribute back in order to close this thread properly without an open question.

Thanks to https://www.mql5.com/en/forum/153674, I managed to work with new version of Unicode text calls in Metatrader 4, as the above function does not work from build 600+.

So, to answer @Ray Kim's question, here it is fully  (notice the lstrcpyW function, which works in both ways, from text to pointer, and from retrieved pointer to text):

//+------------------------------------------------------------------+
//| This piece of code will copy any text we want to the clipboard   |
//+------------------------------------------------------------------+
#import "kernel32.dll"
   int GlobalAlloc(int Flags, int Size);
   int GlobalLock(int hMem);
   int GlobalUnlock(int hMem);
   int GlobalFree(int hMem);
   int lstrcpyW(int ptrhMem, string Text);
#import


#import "user32.dll"
   int OpenClipboard(int hOwnerWindow);
   int EmptyClipboard();
   int CloseClipboard();
   int SetClipboardData(int Format, int hMem);
#import

#define GMEM_MOVEABLE   2
#define CF_UNICODETEXT  13

// Copies the specified text to the clipboard, returning true if successful
bool CopyTextToClipboard(string Text)
{
   bool bReturnvalue = false;
   
   // Try grabbing ownership of the clipboard 
   if (OpenClipboard(0) != 0) {
      // Try emptying the clipboard
      if (EmptyClipboard() != 0) {
         // Try allocating a block of global memory to hold the text 
         int lnString = StringLen(Text);
         int hMem = GlobalAlloc(GMEM_MOVEABLE, lnString * 2 + 2);
         if (hMem != 0) {
            // Try locking the memory, so that we can copy into it
            int ptrMem = GlobalLock(hMem);
            if (ptrMem != 0) {
               // Copy the string into the global memory
               lstrcpyW(ptrMem, Text);            
               // Release ownership of the global memory (but don't discard it)
               GlobalUnlock(hMem);            

               // Try setting the clipboard contents using the global memory
               if (SetClipboardData(CF_UNICODETEXT, hMem) != 0) {
                  // Okay
                  bReturnvalue = true;   
               } else {
                  // Failed to set the clipboard using the global memory
                  GlobalFree(hMem);
               }
            } else {
               // Meemory allocated but not locked
               GlobalFree(hMem);
            }      
         } else {
            // Failed to allocate memory to hold string 
         }
      } else {
         // Failed to empty clipboard
      }
      // Always release the clipboard, even if the copy failed
      CloseClipboard();
   } else {
      // Failed to open clipboard
   }

   return (bReturnvalue);
}


//+------------------------------------------------------------------+
//| This piece of code will return the text from clipboard           |
//+------------------------------------------------------------------+

#import "kernel32.dll"
   int GlobalLock(int hMem);
   int GlobalUnlock(int hMem);
   int lstrcpyW(char& Text[], int ptrMem);   
#import


#import "user32.dll"
   int  OpenClipboard(int hOwnerWindow);
   int  CloseClipboard();
   int  GetClipboardData(int Format);
   bool IsClipboardFormatAvailable(uint format);
#import

#define CF_TEXT     1
#define CF_OEMTEXT  7

string GetTextFromClipboard()
{
   bool bReturnvalue = false;
   char cData[256];
   ArrayInitialize(cData,0);
   
   // Test to see if we can open the clipboard first.
   if (OpenClipboard(0) != 0) 
   {
      if (IsClipboardFormatAvailable(CF_TEXT) != 0
      || IsClipboardFormatAvailable(CF_OEMTEXT) != 0)
      {
         // Retrieve the Clipboard data (specifying that 
         // we want ANSI text (via the CF_TEXT value).
         int hMem = GetClipboardData(CF_TEXT);
         if(hMem != 0)
         {
            // Call GlobalLock so that to retrieve a pointer
            // to the data associated with the handle returned
            // from GetClipboardData.
            int ptrMem = GlobalLock(hMem);
            if(ptrMem != 0)
            {
               // Set a local string variable to the data
               lstrcpyW(cData, ptrMem);
            }
            else
            {
               //Locking did not succeed
            }
            // Unlock the global memory.
            GlobalUnlock(hMem);
          }
          else
          {
            //Clipboard data is Text, but could not retrieve.
          }
      }
      else
      { 
         Print("There is no text (ANSI) data on the Clipboard.");
      }
      // Finally, when finished I simply close the Clipboard
      // which has the effect of unlocking it so that other
      // applications can examine or modify its contents.
      CloseClipboard();
   }
   return(CharArrayToString(cData));
}
JC
1647
JC  
fridayda13:

First, I know this post is old, but as I was looking for a way to copy to clipboard, I bumped into the code on this thread.

Since it helped me a lot with my program, I wanted to contribute back in order to close this thread properly without an open question.

For completeness... There's also a relatively recent topic about copying images to the clipboard: https://www.mql5.com/en/forum/192231 

To add comments, please log in or register