Jump to content

$GUI_DROPACCEPTED Function / SEPARATION


Recommended Posts

Hi everyone,

I have not found anything related to my question, so will try to ask here, maybe someone will know.  $GUI_DROPACCEPTED - Accept drag/drop function for selected field.

My question is about separator. When I drop 2 files they separated by "|" (Pipe) and I need t will be separated by ";" any way of work around, or I have missed the simple solution for this?

Link to comment
Share on other sites

18 minutes ago, TheDcoder said:

Well... $filesSet_REP_BEFORE is a control ID so why would it work? You should be using something like @GUI_DragFile

Sorry, I have like this

$filesSet_REP_BEFORE = GUICtrlCreateInput("", 30, 140, 400, 20)
$filesSet_REP = StringReplace($filesSet_REP_BEFORE, '|', ';')

GUICtrlSetState($filesSet_REP_BEFORE, $GUI_DROPACCEPTED)

Link to comment
Share on other sites

  • Developers
3 hours ago, grimta said:

but it does not work, any possibility to show any sample for this solution?

What about you show what you tried that isn't working... sound much simpler to me! ;)

Jos

SciTE4AutoIt3 Full installer Download page   - Beta files       Read before posting     How to post scriptsource   Forum etiquette  Forum Rules 
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Link to comment
Share on other sites

31 minutes ago, Jos said:

What about you show what you tried that isn't working... sound much simpler to me! ;)

Jos

This is what I have tried:

$filesSet_REP_BEFORE = GUICtrlCreateInput("", 30, 140, 400, 20)
GUICtrlSetState($filesSet_REP_BEFORE, $GUI_DROPACCEPTED)
$filesSet_REP = StringReplace($filesSet_REP_BEFORE, '|', ';')

Ideally I need that when client will drag files to the field it will be display already with ";" and not with "|"

 

Link to comment
Share on other sites

33 minutes ago, grimta said:

Ideally I need that when client will drag files to the field it will be display already with ";" and not with "|"

OK, the only way I can - currently - think of is this one  :)

#include <GUIConstantsEx.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>

OnAutoItExitRegister('OnAutoItExit')

; Create GUI
Local $hForm = GUICreate('Test ' & StringReplace(@ScriptName, '.au3', '()'), 500, 100)
Global $input = GUICtrlCreateInput("", 10, 40, 480, 20)
$hInput = GuiCtrlGetHandle($input)

_WinAPI_DragAcceptFiles($hInput)

; Allow WM_DROPFILES to be received from lower privileged processes (Windows Vista or later)
#cs
If IsAdmin() Then
    _WinAPI_ChangeWindowMessageFilterEx($hInput, $WM_COPYGLOBALDATA, $MSGFLT_ALLOW)
    _WinAPI_ChangeWindowMessageFilterEx($hInput, $WM_DROPFILES, $MSGFLT_ALLOW)
EndIf
#ce

; Register input window proc
Global $g_hDll = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
Global $g_pDll = DllCallbackGetPtr($g_hDll)
Global $g_hProc = _WinAPI_SetWindowLong($hInput, $GWL_WNDPROC, $g_pDll)

GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
     EndSwitch
WEnd

Func _WinProc($hWnd, $iMsg, $wParam, $lParam)
    Switch $iMsg
        Case $WM_DROPFILES
             Local $aFileList = _WinAPI_DragQueryFileEx($wParam)
             If not @error  Then 
                  Local $list
                  For $i = 1 To $aFileList[0]
                        $list &= $aFileList[$i] & ";"
                  Next
                  GuiCtrlSetData($input, StringTrimRight($list, 1))
                  _WinAPI_DragFinish($wParam)
                  Return 0
             EndIf
    EndSwitch
    Return _WinAPI_CallWindowProc($g_hProc, $hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>_WinProc

Func OnAutoItExit()
    _WinAPI_SetWindowLong($hInput, $GWL_WNDPROC, $g_hProc)
    DllCallbackFree($g_hDll)
EndFunc   ;==>OnAutoItExit

 

Edited by mikell
Link to comment
Share on other sites

3 hours ago, grimta said:

$filesSet_REP_BEFORE = GUICtrlCreateInput("", 30, 140, 400, 20)
$filesSet_REP = StringReplace($filesSet_REP_BEFORE, '|', ';')

GUICtrlSetState($filesSet_REP_BEFORE, $GUI_DROPACCEPTED)

$filesSet_REP_BEFORE is not the content of the Input field, it is the ID of the input field.

You need to read the content of that control (field) using the ID.

i.e. $filesSet_REP = GUICtrlRead($filesSet_REP_BEFORE)

Then you can work with the value.

i.e. $filesSet_REP = StringReplace($filesSet_REP, "|", ";")

Altogether, you should have.

$filesSet_REP_BEFORE = GUICtrlCreateInput("", 30, 140, 400, 20)
$filesSet_REP = GUICtrlRead($filesSet_REP_BEFORE)
$filesSet_REP = StringReplace($filesSet_REP, "|", ";")

But if you are wanting to work with $GUI_DROPACCEPTED you are doing it all wrong anyway.

TheDcoder gave you a clue to go on with, using the Help file .... @GUI_DragFile

But I really think you could benefit from doing some simple AutoIt tutorials, before learning to fly, as the concepts of reading and setting data are not evident in your understanding as displayed.

Edited by TheSaint

Make sure brain is in gear before opening mouth!
Remember, what is not said, can be just as important as what is said.

Spoiler

What is the Secret Key? Life is like a Donut

If I put effort into communication, I expect you to read properly & fully, or just not comment.
Ignoring those who try to divert conversation with irrelevancies.
If I'm intent on insulting you or being rude, I will be obvious, not ambiguous about it.
I'm only big and bad, to those who have an over-active imagination.

I may have the Artistic Liesense ;) to disagree with you. TheSaint's Toolbox (be advised many downloads are not working due to ISP screwup with my storage)

userbar.png

Link to comment
Share on other sites

OK, the only way I can - currently - think of is this one  :)

#include <GUIConstantsEx.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>

OnAutoItExitRegister('OnAutoItExit')

; Create GUI
Local $hForm = GUICreate('Test ' & StringReplace(@ScriptName, '.au3', '()'), 500, 100)
Global $input = GUICtrlCreateInput("", 10, 40, 480, 20)
$hInput = GuiCtrlGetHandle($input)

_WinAPI_DragAcceptFiles($hInput)

; Allow WM_DROPFILES to be received from lower privileged processes (Windows Vista or later)
#cs
If IsAdmin() Then
    _WinAPI_ChangeWindowMessageFilterEx($hInput, $WM_COPYGLOBALDATA, $MSGFLT_ALLOW)
    _WinAPI_ChangeWindowMessageFilterEx($hInput, $WM_DROPFILES, $MSGFLT_ALLOW)
EndIf
#ce

; Register input window proc
Global $g_hDll = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
Global $g_pDll = DllCallbackGetPtr($g_hDll)
Global $g_hProc = _WinAPI_SetWindowLong($hInput, $GWL_WNDPROC, $g_pDll)

GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
     EndSwitch
WEnd

Func _WinProc($hWnd, $iMsg, $wParam, $lParam)
    Switch $iMsg
        Case $WM_DROPFILES
             Local $aFileList = _WinAPI_DragQueryFileEx($wParam)
             If not @error  Then 
                  Local $list
                  For $i = 1 To $aFileList[0]
                        $list &= $aFileList[$i] & ";"
                  Next
                  GuiCtrlSetData($input, StringTrimRight($list, 1))
                  _WinAPI_DragFinish($wParam)
                  Return 0
             EndIf
    EndSwitch
    Return _WinAPI_CallWindowProc($g_hProc, $hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>_WinProc

Func OnAutoItExit()
    _WinAPI_SetWindowLong($hInput, $GWL_WNDPROC, $g_hProc)
    DllCallbackFree($g_hDll)
EndFunc   ;==>OnAutoItExit

This way does work, thank you very much for this. I thought initially, it should simpler solution for this kind of things O_o

 

1 hour ago, TheSaint said:

$filesSet_REP_BEFORE is not the content of the Input field, it is the ID of the input field.

You need to read the content of that control (field) using the ID.

i.e. $filesSet_REP = GUICtrlRead($filesSet_REP_BEFORE)

Then you can work with the value.

i.e. $filesSet_REP = StringReplace($filesSet_REP, "|", ";")

Altogether, you should have.

$filesSet_REP_BEFORE = GUICtrlCreateInput("", 30, 140, 400, 20)
$filesSet_REP = GUICtrlRead($filesSet_REP_BEFORE)
$filesSet_REP = StringReplace($filesSet_REP, "|", ";")

But if you are wanting to work with $GUI_DROPACCEPTED you are doing it all wrong anyway.

TheDcoder gave you a clue to go on with, using the Help file .... @GUI_DragFile

But I really think you could benefit from doing some simple AutoIt tutorials, before learning to fly, as the concepts of reading and setting data are not evident in your understanding as displayed.

I have tried to look for some help related to  @GUI_DragFile , but I'm not sure where exactly take information from.

This is only things I have found:

https://www.autoitscript.com/trac/autoit/ticket/1870
https://www.autoitscript.com/forum/topic/90806-gui_dragfile/

If you have any good source to read, will be appreciated.

Link to comment
Share on other sites

1 minute ago, grimta said:

If you have any good source to read, will be appreciated.

Surprising that you didn't know about the help file! Just press F1 in SciTE :D

EasyCodeIt - A cross-platform AutoIt implementation - Fund the development! (GitHub will double your donations for a limited time)

DcodingTheWeb Forum - Follow for updates and Join for discussion

Link to comment
Share on other sites

@GUI_DragFile will not bring more benefit for the desired action than a simple GuiCtrlRead, as reading @GUI_DragFile gives file names also separated by a pipe
OTOH , setting Opt(GUIDataSeparatorChar, ";") doesn't work for this

So for an instant display in the input using ";" as separator,  the only way is to intercept the message before writing in the input  :P

Edited by mikell
tie paw
Link to comment
Share on other sites

On 28/7/2017 at 0:02 AM, grimta said:

I thought initially, it should simpler solution for this kind of things

The simpler way, is to treat the result from drag & drop as an array, either from GUICtrlRead or the @GUI_DragFile, and separate out the elements that way.

Mikell has provided you a beautiful example of the clever way, that is understandably more complex for beginners to understand.
If however, you want to get down and dirty and understand/learn/grow more easily from a simpler approach, then investigate arrays and probably the StringSplit command in particular.

Make sure brain is in gear before opening mouth!
Remember, what is not said, can be just as important as what is said.

Spoiler

What is the Secret Key? Life is like a Donut

If I put effort into communication, I expect you to read properly & fully, or just not comment.
Ignoring those who try to divert conversation with irrelevancies.
If I'm intent on insulting you or being rude, I will be obvious, not ambiguous about it.
I'm only big and bad, to those who have an over-active imagination.

I may have the Artistic Liesense ;) to disagree with you. TheSaint's Toolbox (be advised many downloads are not working due to ISP screwup with my storage)

userbar.png

Link to comment
Share on other sites

 

@grimta

On 27/7/2017 at 4:32 PM, grimta said:

I thought initially, it should simpler solution for this kind of things

And in fact you were not totally wrong  :)

My code above does the modification before writing in the input. Pretty nice correct and all, but as TheSaint pointed out, not so easy to handle.
So the easiest workaround is to make the modification in the input  just after writing, so fast than you can't see
Example #1, using $GUI_EVENT_DROPPED :

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Local $hForm = GUICreate('Test', 500, 100, -1, -1, -1, $WS_EX_ACCEPTFILES)
Global $input = GUICtrlCreateInput("", 10, 40, 480, 20)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
    Case $GUI_EVENT_DROPPED
           If @GUI_DropId = $input Then
               GuiCtrlSetData($input, StringReplace(GUICtrlRead($input), "|", ";") )
           EndIf
     EndSwitch
WEnd

Example #2 using GUIRegisterMsg :

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>

Local $hForm = GUICreate('Test', 500, 100, -1, -1, -1, $WS_EX_ACCEPTFILES)
Global $input = GUICtrlCreateInput("", 10, 40, 480, 20)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUISetState()

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
     EndSwitch
WEnd

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    Local $iIDFrom = BitAND($wParam, 0xFFFF)
    Local $iCode = BitShift($wParam, 16)
    Switch $iIDFrom
        Case $input
            Switch $iCode
               Case $EN_UPDATE ;$EN_CHANGE 
                    GuiCtrlSetData($input, StringReplace(GUICtrlRead($input), "|", ";") )
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...