MajicDesigns / MD_MAX72XX

LED Matrix Library
GNU Lesser General Public License v2.1
307 stars 122 forks source link

The Excel Font Generator Tool "copy to clipboard" doesn't work on windows 10. But I found a solution. #58

Open Cherianpaul opened 11 months ago

Cherianpaul commented 11 months ago

IMPORTANT

Before submitting this issue [] Have you tried using the latest version of the library? [] Have you checked this has not already been submitted and/or resolved? [ ] If you are requesting help a better choice may be the Arduino forum

Subject of the issue

The Excel Font Generator Tool "copy to clipboard" doesn't work on windows 10. But I found a solution.

Your Environment

Library Version: Arduino IDE version: Host OS and Version: CPU Hardware model/type: Matrix hardware model/type: [ ] Parola [ ] Generic [ ] ICStation [*] FC-16 [ ] Custom (describe how wired)

Steps to Reproduce

It is not with Arduino code, it is about the Excel Font Generator Tool.

Expected Behaviour

It should copy the generated array into clipboard.

Actual Behaviour

It does not copy as obj.PutInClipboard does not work on windows 10.

Code Demonstrating the Issue

MyDataObj.PutInClipboard
Cherianpaul commented 11 months ago

Solution found from this link : https://chandoo.org/forum/threads/clipboard-copy-vba-code-not-working-in-windows-10.37126/post-223256

Option Explicit

If Mac Then

' ignore

Else

#If VBA7 Then
    Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
    Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
    Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
                                                         ByVal dwBytes As LongPtr) As LongPtr

    Declare PtrSafe Function CloseClipboard Lib "User32" () As Long
    Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hwnd As LongPtr) As LongPtr
    Declare PtrSafe Function EmptyClipboard Lib "User32" () As Long

    Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
                                                     ByVal lpString2 As Any) As LongPtr

    Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat _
                                                            As Long, ByVal hMem As LongPtr) As LongPtr
#Else
    Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
    Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
    Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
                                                 ByVal dwBytes As Long) As Long

    Declare PtrSafe Function CloseClipboard Lib "User32" () As Long
    Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
    Declare PtrSafe Function EmptyClipboard Lib "User32" () As Long

    Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
                                             ByVal lpString2 As Any) As Long

    Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat _
                                                    As Long, ByVal hMem As Long) As Long
#End If

End If

Public Const GHND = &H42 Public Const CF_TEXT = 1 Public Const MAXSIZE = 4096

Sub ClipBoard_SetData(MyString As String)

If Mac Then

    With New MSForms.DataObject
        .SetText MyString
        .PutInClipboard
    End With
#Else
    #If VBA7 Then
        Dim hGlobalMemory As LongPtr
        Dim hClipMemory   As LongPtr
        Dim lpGlobalMemory    As LongPtr
    #Else
        Dim hGlobalMemory As Long
        Dim hClipMemory   As Long
        Dim lpGlobalMemory    As Long
    #End If

    Dim x                 As Long

    ' Allocate moveable global memory.
    '-------------------------------------------
    hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)

    ' Lock the block to get a far pointer
    ' to this memory.
    lpGlobalMemory = GlobalLock(hGlobalMemory)

    ' Copy the string to this global memory.
    lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)

    ' Unlock the memory.
    If GlobalUnlock(hGlobalMemory) <> 0 Then
        MsgBox "Could not unlock memory location. Copy aborted."
        GoTo OutOfHere2
    End If

    ' Open the Clipboard to copy data to.
    If OpenClipboard(0&) = 0 Then
        MsgBox "Could not open the Clipboard. Copy aborted."
        Exit Sub
    End If

    ' Clear the Clipboard.
    x = EmptyClipboard()

    ' Copy the data to the Clipboard.
    hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)

OutOfHere2:

    If CloseClipboard() = 0 Then
        MsgBox "Could not close Clipboard."
    End If
#End If

End Sub

then call it like this: Code: ClipBoard_SetData "your text here"

MajicDesigns commented 11 months ago

This will need fixing. I don't have easy access to Microsoft Office any more so it may take a while. Are you able to implement a fix and submit?

Cherianpaul commented 11 months ago

Parola MD_MAX72xx Font Builder v4.zip Sure. No problem. I attached it here.

MajicDesigns commented 11 months ago

Better you email the excel file directly to me.

Cherianpaul commented 11 months ago

Your email?

MajicDesigns commented 11 months ago

Oops, forgot that I made it private here. OK, try and attach the file to one of these comments. The toolbar above the text as you type has a paperclip for attachment. Not sure if there is a size limit.