grimta

$GUI_DROPACCEPTED Function / SEPARATION

18 posts in this topic

#1 ·  Posted

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?

Share this post


Link to post
Share on other sites



#3 ·  Posted

When I drag two files into the field, I have: " files1|file2" and what I need is: "file1;file2"

Share this post


Link to post
Share on other sites

#5 ·  Posted

I do not know why (I have tried it already) , but it does not work, any possibility to show any sample for this solution?

Share this post


Link to post
Share on other sites

#6 ·  Posted

StringReplace('file1|file2', '|', ';')

 


AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Spoiler

My contributions to the AutoIt Community

Some messages & Apologizes:

If I hurt you, Please accept my apologies, I never (regardless of the situation) mean to hurt anybody!!!

Also, I am very busy with my project so I will appear in the last row of the online list, if you want to contact me: Email@TheDcoder.xyz

Or you can have a nice chat with me in freenode, I use the same nick on freenode too!

3fHNZJ.gif

PLEASE JOIN ##AutoIt AND HELP THE IRC AUTOIT COMMUNITY!

Share this post


Link to post
Share on other sites

#7 ·  Posted

50 minutes ago, TheDcoder said:
StringReplace('file1|file2', '|', ';')

 

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

 

Does not work

Share this post


Link to post
Share on other sites

#8 ·  Posted

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


AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Spoiler

My contributions to the AutoIt Community

Some messages & Apologizes:

If I hurt you, Please accept my apologies, I never (regardless of the situation) mean to hurt anybody!!!

Also, I am very busy with my project so I will appear in the last row of the online list, if you want to contact me: Email@TheDcoder.xyz

Or you can have a nice chat with me in freenode, I use the same nick on freenode too!

3fHNZJ.gif

PLEASE JOIN ##AutoIt AND HELP THE IRC AUTOIT COMMUNITY!

Share this post


Link to post
Share on other sites

#9 ·  Posted

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)

Share this post


Link to post
Share on other sites

#10 ·  Posted

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


Visit the SciTE4AutoIt3 Download page for the latest versions  - Beta files                                How to post scriptsource        Forum Rules
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Share this post


Link to post
Share on other sites

#11 ·  Posted

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 "|"

 

Share this post


Link to post
Share on other sites

#12 ·  Posted (edited)

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
2 people like this

Share this post


Link to post
Share on other sites

#13 ·  Posted (edited)

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

AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

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

Share this post


Link to post
Share on other sites

#14 ·  Posted

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.

Share this post


Link to post
Share on other sites

#15 ·  Posted

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


AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Spoiler

My contributions to the AutoIt Community

Some messages & Apologizes:

If I hurt you, Please accept my apologies, I never (regardless of the situation) mean to hurt anybody!!!

Also, I am very busy with my project so I will appear in the last row of the online list, if you want to contact me: Email@TheDcoder.xyz

Or you can have a nice chat with me in freenode, I use the same nick on freenode too!

3fHNZJ.gif

PLEASE JOIN ##AutoIt AND HELP THE IRC AUTOIT COMMUNITY!

Share this post


Link to post
Share on other sites

#16 ·  Posted (edited)

@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
1 person likes this

Share this post


Link to post
Share on other sites

#17 ·  Posted

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.


AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

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

Share this post


Link to post
Share on other sites

#18 ·  Posted

 

@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

 

1 person likes this

Share this post


Link to post
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