Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 09/28/2018 in all areas

  1. 2 points
  2. Here is my ErrorLog.au3 UDF which I use every day. ErrorLog.au3 UDF is for log program activities and errors, to different output with possibility to switch output function instantly. UDF: #include-once #AutoIt3Wrapper_Run_AU3Check=Y #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 #Tidy_Parameters=/sort_funcs /reel ; #AutoIt3Wrapper_Run_Debug_Mode=Y Global $__g_bUDF_ERRORLOG_FORCE_DEBUG = False Global $__g_sUDF_ERRORLOG_PREFIX = '--> ' Global $__g_sUDF_ERRORLOG_PREFIX_SUCCESS = '+ ' Global $__g_sUDF_ERRORLOG_PREFIX_EXTENDED = '- ' Global $__g_sUDF_ERRORLOG_PREFIX_ERROR = '! ' #Region ErrorLog.au3 - UDF Header ; #INDEX# ======================================================================================================================= ; Title .........: ErrorLog.au3 UDF - A logging Library ; AutoIt Version : 3.3.10.2++ ; Language ......: English ; Description ...: ErrorLog.au3 UDF is for log program activities and errors, to different output with possibility to switch output function instantly ; Author(s) .....: mLipok ; Modified ......: ; URL ...........: https://www.autoitscript.com/forum/topic/195882-errorlogau3-a-logging-library/ ; =============================================================================================================================== #cs UDF ChangeLog 2018/10/11 v1.0 * Added: UDF #INDEX# - mLipok * Added: UDF ChangeLog - mLipok * Added: Function: _Log_Errors_Reset() - mLipok * Renamed: Function: _Log_Errors() >> _Log_OnError() - mLipok * Changed: Function: better documentation in function headers - mLipok * Added: ErrorLog__Example.au3 - _Log_Example_1() , _Log_Example_2(), _Log_Example_3() - mLipok 2018/10/12 v1.1 * Added: Function: __Log_Wrapper() - a wrapper which put report to the output function - mLipok * Changed: Function: _Log_SetOutputFunction(Default) - return only function in any other case fires @error - mLipok * Refactored: Function: _Log() - mLipok * Refactored: Function: _Log_OnError() - mLipok * Added: GLOBAL: $__g_bUDF_ERRORLOG_FORCE_DEBUG - mLipok * Added: GLOBAL: $__g_sUDF_ERRORLOG_PREFIX_EXTENDED - mLipok * Added: GLOBAL: $__g_sUDF_ERRORLOG_PREFIX_SUCCESS - mLipok * Changed: GLOBAL: $__g_sUDF_ERRORLOG_ERROR_PREFIX >> $__g_sUDF_ERRORLOG_PREFIX_ERROR - mLipok * Added: Function: _Log_OnSuccess() - Log report to the output function but only if @error was not fired - mLipok * Added: Function: _Log_OnExtended() - Log report to the output function but only if @extended is set and @error was not fired - mLipok * Added: Function: _Log_Debug() - Log report to the output function but only if _Log_SetDebugMode(True) was used - mLipok * Added: Function: _Log_SetDebugMode() - Set the _Log_Debug() ON/OFF - mLipok * Changed: Function: much better documentation in function headers - mLipok * Added: UDF: #Region <> #EndRegion - mLipok * Added: UDF: #Tidy_Parameters=/sort_funcs /reel * Added: ErrorLog__Example.au3 - $__g_bUDF_ERRORLOG_FORCE_DEBUG - _Log_SetDebugMode() - mLipok * Added: ErrorLog__Example.au3 - _Log_Debug() - mLipok @LAST CHANGE LOG #ce UDF ChangeLog #EndRegion ErrorLog.au3 - UDF Header #Region ErrorLog.au3 - Functions ; #FUNCTION# ==================================================================================================================== ; Name ..........: _Log ; Description ...: Log report to the output function ; Syntax ........: _Log($sText[, $iError = @error[, $iExtended = @extended]]) ; Parameters ....: $sText - a string value. Textual data which should be reported to the output function ; $iError - [optional] an integer value. Default is @error. Used to store @error ; $iExtended - [optional] an integer value. Default is @extended. Used to store @extended ; Return values .: None - and set @error and @extended to stored values ; Author ........: mLipok ; Modified ......: ; Remarks .......: This function will not send log reports to output if _Log_SetOutputFunction() is not properly set ; Related .......: ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func _Log($sText = '', $iError = @error, $iExtended = @extended) __Log_Wrapper( _ (($iError Or $iExtended) ? ($__g_sUDF_ERRORLOG_PREFIX_ERROR & '[ ' & $iError & ' / ' & $iExtended & ' ] : ') : ($__g_sUDF_ERRORLOG_PREFIX)) _ & $sText _ ) Return SetError($iError, $iExtended) EndFunc ;==>_Log ; #FUNCTION# ==================================================================================================================== ; Name ..........: _Log_Change ; Description ...: Log report to the output function but only if @error or @extended occurs OR if reported data has changed ; Syntax ........: _Log_Change([$sText = ''[, $iError = @error[, $iExtended = @extended]]]) ; Parameters ....: $sText - a string value. Textual data which should be reported to the output function ; $iError - [optional] an integer value. Default is @error. ; $iExtended - [optional] an integer value. Default is @extended. ; Return values .: None - and set @error and @extended to stored values ; Author ........: mLipok ; Modified ......: ; Remarks .......: This function will not send log reports to output if there is no change and no message, or if _Log_SetOutputFunction() is not properly set ; Related .......: _Log ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func _Log_Change($sText = '', $iError = @error, $iExtended = @extended) Local Static $sText_static = '' Local Static $iError_static = 0 Local Static $iExtended_static = 0 If $sText <> '' Or $iError Or $iExtended And _ ($sText_static <> $sText Or $iError_static <> $iError Or $iExtended_static <> $iExtended) _ Then _Log($sText, $iError, $iExtended) $sText_static = $sText $iError_static = $iError $iExtended_static = $iExtended EndIf Return SetError($iError, $iExtended) EndFunc ;==>_Log_Change ; #FUNCTION# ==================================================================================================================== ; Name ..........: _Log_Debug ; Description ...: Log report to the output function but only if _Log_SetDebugMode(True) was used ; Syntax ........: _Log_Debug($sText[, $iError = @error[, $iExtended = @extended]]) ; Parameters ....: $sText - a string value. Textual data which should be reported to the output function ; $iError - [optional] an integer value. Default is @error. Used to store @error ; $iExtended - [optional] an integer value. Default is @extended. Used to store @extended ; Return values .: None - and set @error and @extended to stored values ; Author ........: mLipok ; Modified ......: ; Remarks .......: This function will not send log reports to output if _Log_SetOutputFunction() is not properly set ; Related .......: _Log ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func _Log_Debug($sText, $iScriptLineNumber = @ScriptLineNumber, $iError = @error, $iExtended = @extended) If $__g_bUDF_ERRORLOG_FORCE_DEBUG == True Then __Log_Wrapper('@@ Debug(' & $iScriptLineNumber & ') : [ ' & $iError & ' / ' & $iExtended & ' ] : ' & $sText) Return SetError($iError, $iExtended) EndFunc ;==>_Log_Debug ; #FUNCTION# ==================================================================================================================== ; Name ..........: _Log_Errors_Reset ; Description ...: Resetting @error and @extended to 0 ; Syntax ........: _Log_Errors_Reset() ; Parameters ....: None ; Return values .: None - and set @error and @extended to 0 ; Author ........: mLipok ; Modified ......: ; Remarks .......: this is only wrapper for SetError(0, 0) ; Related .......: ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func _Log_Errors_Reset() Return SetError(0, 0) EndFunc ;==>_Log_Errors_Reset ; #FUNCTION# ==================================================================================================================== ; Name ..........: _Log_Errors_ReStore ; Description ...: Restore previously stored @error and @extended ; Syntax ........: _Log_Errors_ReStore() ; Parameters ....: None ; Return values .: None - and set @error and @extended to stored values ; Author ........: mLipok ; Modified ......: ; Remarks .......: ; Related .......: _Log_Errors_Store ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func _Log_Errors_ReStore() _Log_Errors_Store(Default, Default) Return SetError(@error, @extended) EndFunc ;==>_Log_Errors_ReStore ; #FUNCTION# ==================================================================================================================== ; Name ..........: _Log_Errors_Store ; Description ...: Store @error and @extended ; Syntax ........: _Log_Errors_Store([$iError = @error[, $iExtended = @extended]]) ; Parameters ....: $iError - [optional] an integer value. Default is @error. ; $iExtended - [optional] an integer value. Default is @extended. ; Return values .: None - and set @error and @extended to stored values ; Author ........: mLipok ; Modified ......: ; Remarks .......: ; Related .......: _Log_Errors_ReStore ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func _Log_Errors_Store($iError = @error, $iExtended = @extended) Local Static $iError_static = 0, $iExtended_static = 0 If $iError = Default And $iExtended = Default Then $iError = $iError_static $iExtended = $iExtended_static $iError_static = 0 $iExtended_static = 0 Return SetError($iError, $iExtended) EndIf $iError_static = $iError $iExtended_static = $iExtended Return SetError($iError, $iExtended) EndFunc ;==>_Log_Errors_Store ; #FUNCTION# ==================================================================================================================== ; Name ..........: _Log_OnError ; Description ...: Log report to the output function but only if @error occurs ; Syntax ........: _Log_OnError($sText[, $iError = @error[, $iExtended = @extended]]) ; Parameters ....: $sText - a string value. Textual data which should be reported to the output function ; $iError - [optional] an integer value. Default is @error. Used to store @error ; $iExtended - [optional] an integer value. Default is @extended. Used to store @extended ; Return values .: None - and set @error and @extended to stored values ; Author ........: mLipok ; Modified ......: ; Remarks .......: This function will not send log reports to output if _Log_SetOutputFunction() is not properly set ; Related .......: _Log ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func _Log_OnError($sText, $iError = @error, $iExtended = @extended) If $iError Then __Log_Wrapper($__g_sUDF_ERRORLOG_PREFIX_ERROR & '@error=' & $iError & ' @extended=' & $iExtended & ' :: ' & $sText) Return SetError($iError, $iExtended) EndFunc ;==>_Log_OnError ; #FUNCTION# ==================================================================================================================== ; Name ..........: _Log_OnExtended ; Description ...: Log report to the output function but only if @extended is set and @error was not fired - mLipok ; Syntax ........: _Log_OnExtended($sText[, $iError = @error[, $iExtended = @extended]]) ; Parameters ....: $sText - a string value. Textual data which should be reported to the output function ; $iError - [optional] an integer value. Default is @error. Used to store @error ; $iExtended - [optional] an integer value. Default is @extended. Used to store @extended ; Return values .: None - and set @error and @extended to stored values ; Author ........: mLipok ; Modified ......: ; Remarks .......: This function will not send log reports to output if _Log_SetOutputFunction() is not properly set ; Related .......: _Log ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func _Log_OnExtended($sText, $iError = @error, $iExtended = @extended) If $iExtended And $iError = 0 Then __Log_Wrapper($__g_sUDF_ERRORLOG_PREFIX_EXTENDED & '[ ' & $iError & ' / ' & $iExtended & ' ] : ' & $sText) Return SetError($iError, $iExtended) EndFunc ;==>_Log_OnExtended ; #FUNCTION# ==================================================================================================================== ; Name ..........: _Log_OnSuccess ; Description ...: Log report to the output function but only if @error was not fired ; Syntax ........: _Log_OnSuccess($sText[, $iError = @error[, $iExtended = @extended]]) ; Parameters ....: $sText - a string value. Textual data which should be reported to the output function ; $iError - [optional] an integer value. Default is @error. Used to store @error ; $iExtended - [optional] an integer value. Default is @extended. Used to store @extended ; Return values .: None - and set @error and @extended to stored values ; Author ........: mLipok ; Modified ......: ; Remarks .......: This function will not send log reports to output if _Log_SetOutputFunction() is not properly set ; Related .......: _Log ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func _Log_OnSuccess($sText, $iError = @error, $iExtended = @extended) If $iError = 0 Then __Log_Wrapper($__g_sUDF_ERRORLOG_PREFIX_SUCCESS & '[ ' & $iError & ' / ' & $iExtended & ' ] : ' & $sText) Return SetError($iError, $iExtended) EndFunc ;==>_Log_OnSuccess ; #FUNCTION# ==================================================================================================================== ; Name ..........: _Log_SetDebugMode ; Description ...: Set the _Log_Debug() ON/OFF ; Syntax ........: _Log_SetOutputFunction($bForceDebug) ; Parameters ....: $bForceDebug - a boolean value. True=ON, False=OFF for _Log_Debug() ; Return values .: none or set @error to 1 ; Author ........: mLipok ; Modified ......: ; Remarks .......: ; Related .......: _Log_Debug ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func _Log_SetDebugMode($bForceDebug) If Not IsBool($bForceDebug) Then Return SetError(1) $__g_bUDF_ERRORLOG_FORCE_DEBUG = $bForceDebug EndFunc ;==>_Log_SetDebugMode ; #FUNCTION# ==================================================================================================================== ; Name ..........: _Log_SetOutputFunction ; Description ...: Set the function to which Log reports should be passed ; Syntax ........: _Log_SetOutputFunction([$fnFunction = Default]) ; Parameters ....: $fnFunction - [optional] a floating point value. Default is Default. ; Return values .: $fnFunction_static - saved output function, in any other case fires @error ; Author ........: mLipok ; Modified ......: ; Remarks .......: ; Related .......: ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func _Log_SetOutputFunction($fnFunction = Default) Local Static $fnFunction_static = Null If $fnFunction = Default And IsFunc($fnFunction_static) Then Return $fnFunction_static If Not IsFunc($fnFunction) Then Return SetError(1) $fnFunction_static = $fnFunction Return $fnFunction_static EndFunc ;==>_Log_SetOutputFunction #EndRegion ErrorLog.au3 - Functions #Region ErrorLog.au3 - Internal Functions ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __Log_Wrapper ; Description ...: a wrapper which put report to the output function ; Syntax ........: __Log_Wrapper($sText) ; Parameters ....: $sText - a string value. Textual data which should be reported to the output function ; Return values .: None or set @error = 1 in case _Log_SetOutputFunction() was not used or used not properly ; Author ........: mLipok ; Modified ......: ; Remarks .......: ; Related .......: _Log, _Log_OnError, _Log_OnExtended, _Log_OnSuccess, _Log_Change ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func __Log_Wrapper($sText) Local $fnFunction = _Log_SetOutputFunction() If @error Then Return SetError(1) $fnFunction($sText) EndFunc ;==>__Log_Wrapper #EndRegion ErrorLog.au3 - Internal Functions EXAMPLE: #include <WinAPIProc.au3> #include-once #AutoIt3Wrapper_Run_AU3Check=Y #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 ; #AutoIt3Wrapper_Run_Debug_Mode=Y ; #Tidy_Parameters=/sort_funcs /reel #include <Debug.au3> #include "ErrorLog.au3" If Not @Compiled Then $__g_bUDF_ERRORLOG_FORCE_DEBUG = True ; Pre set function to where log report is passed _Log_SetOutputFunction(ConsoleWrite) _Log_Debug("EXAMPLE 1: START" & @CRLF, @ScriptLineNumber) _Log_Example_1() ; check again for @error If @error Then MsgBox($MB_ICONERROR, 'Example 1: Error Occured', _ 'File Reading Problem.' & @CRLF & _ '@error = ' & @error & @CRLF & _ '@extended = ' & @extended _ ) _Log_Debug("EXAMPLE 2: START" & @CRLF, @ScriptLineNumber) _Log_Example_2() _Log_Debug("EXAMPLE 3: START", @ScriptLineNumber) _Log_Example_3() _Log_SetOutputFunction(_ConsoleWrite_Wrapper) _Log_Debug("EXAMPLES: END", @ScriptLineNumber) Func _Log_Example_1() ; sending description to log output _Log('Example 1: We are trying to read file.' & @CR) ; fire @error FileRead('FILE PATH WHICH NOT EXIST') ; report @error but do not change it - store it and back it again _Log_OnError('Example 1: File Reading Problem.' & @CR) Return SetError(@error, @extended) EndFunc ;==>_Log_Example_1 Func _Log_Example_2() ; set function to where log reports will be passed _Log_SetOutputFunction(_ConsoleWrite_Wrapper) ; sending description to log output _Log('Example 2: We are trying to read file.') For $iAttempt_idx = 1 To 15 _log('Example 2: $iAttempt_idx = ' & $iAttempt_idx) ; fire @error If $iAttempt_idx < 14 Then FileRead('FILE PATH WHICH NOT EXIST') ; next line will log only in step #12 and #13 - as only to step #13 , errors ocurrs If $iAttempt_idx > 11 Then _Log_OnError('Example 2: File Reading error' & @CR) ; fake @error to show what _Log_Change() will do when @error is changing If $iAttempt_idx = 5 Then SetError(2) ; fake @exteneded to show what _Log_Change() will do when @exteneded is changing If $iAttempt_idx = 10 Then SetError(@error, 2) ; string change If $iAttempt_idx > 13 Then _Log_Change('Some other log data') ; report to log output but only first unique occurance _Log_Change('Example 2: File Reading Problem.' & @CR) _Log_Errors_Reset() ; if you do not reset then @error and @extended could be followed to next loop. Next EndFunc ;==>_Log_Example_2 Func _Log_Example_3() ; set function to where log reports will be passed _Log_SetOutputFunction(_ConsoleWrite_Wrapper) ; sending description to log output _Log('Example 3: We are trying to read file.') For $iAttempt_idx = 1 To 15 ; If $iAttempt_idx = 9 change output function - from this moment log reports will be passed to _DebugOut() instead _ConsoleWrite_Wrapper() If $iAttempt_idx = 9 Then _DebugSetup("Example 3: ErrorLog.au3 - output") _Log_SetOutputFunction(_DebugOut) EndIf _log('Example 3: $iAttempt_idx = ' & $iAttempt_idx) ; fire @error If $iAttempt_idx < 14 Then FileRead('FILE PATH WHICH NOT EXIST') ; next line will log only in step #12 and #13 - as only to step #13 , errors ocurrs If $iAttempt_idx > 11 Then _Log_OnError('Example 3: File Reading error') ; fake @error to show what _Log_Change() will do when @error is changing If $iAttempt_idx = 5 Then SetError(2) ; fake @exteneded to show what _Log_Change() will do when @exteneded is changing If $iAttempt_idx = 10 Then SetError(@error, 2) ; string change If $iAttempt_idx > 13 Then _Log_Change('Example 3: Some other log data') ; report to log output but only first unique occurance _Log_Change('Example 3: File Reading Problem.' & @CR) _Log_Errors_Reset() ; if you do not reset then @error and @extended could be followed to next loop. Next EndFunc ;==>_Log_Example_3 Func _ConsoleWrite_Wrapper($sData) ConsoleWrite($sData & @CRLF) EndFunc ;==>_ConsoleWrite_Wrapper REMARKS: Documentation in function headers is currently complete
    1 point
  3. I discovered what I was doing wrong on my own, It was a simple error that I had missed. Func Defaults() $Name[0] = "Combatant" $Level[0] = 1 $Exp[0] = 0 $ExpMax = 20; <--- $Dead[0] = 0 $Health[0] = 20 $HealthMax[0] = 20 $Attack[0] = 1 $Defense[0] = 1 EndFunc I turned it from an array into a simple variable as I forgot to add a "[0]" to the end, and so $ExpMax[$i], no matter what number was put into it, would not exist as it was no longer an array.
    1 point
  4. You also could benefit of getting a sea water tank and an octopus.
    1 point
  5. jchd

    AutoIT and Redis

    Correct but I can see other arguments as well. I'm a daily reader of the SQLite mailing list, an amazing source of inspiration. A question regularly pops up there as "How can I associate SQLite and <some key-value store>?" and once the dust settles it pretty often turns out that SQLite alone is more suitable to the case exposed than some kind of "marriage of carp and rabbit" (a French saying). At times a counter-intuitive more sophisticated setup is the right choice due to uncommon requirements. SQLite is special in the SQL world. It's a zero-install, fast, small footprint, flexible, embedded RDBMS having no dependancy and being compiled and used on the largest range of hardware/software platforms ever. It was created as a [TCL] application general purpose datastore and has evolved to what it is today. A good share of developpers never having used SQL think of it as a caterpillar: a mainframe-style monster from the COBOL era, or something close to that picture. I've been there before but quickly changed my mind. There are countless occasions where you start thinking about and coding something "simple" that should be "good enough", just to realize after some time that you have to recode into a much more complex way. A common example is log files. You start with a flat text file, then store stuff with timestamp/the_rest then have to recode with timestamp/station/the_rest, then again as timestamp/station/status/the_rest, further as timestamp/station/status/error_class/the_rest, ... each time having to satisfy more and more detailled queries or statistics or whatelse, like safe concurrent accesses. Starting at once with something powerful is often a long-term guarantee.
    1 point
  6. Puls3, Thread unlocked - but it would have helped if you had stated all of that in the OP. And all you have to do to appeal is send me a PM - but no harm done. M23
    1 point
  7. What about you kick in the brain first before firing multiple posts? You are posting in this thread so you can see which forum it is in. ...and telling us this forum sucks won't help you much. Jos
    1 point
  8. juniqofficial, As the Moderation team had to move it, you obviously did not - and no-one else has ever complained about the site itself changing the destination. I suggest that it was the keyboard-chair interface at fault in this case. If you look in the Developer General Discussion forum you will see the link. Your thread has been moved - and you with it. M23
    1 point
  9. Update 1.0.1 - 2018-09-28 Saludos
    1 point
  10. Alek

    Ini in memory

    UDFs for managing Ini format in memory. They are very similar to the ini file functions (parameters and return values) I found a set of function like these on the forum (i think) that used regexp, but ran into problems when using keys/values that containd symbols (like a file dir) Bugs: -Needs more testing... #cs _IniMem_Delete(ByRef $s_ini, $s_Section, $s_key = "") _IniMem_Read($s_ini, $s_Section, $s_key, $s_default = "") _IniMem_ReadSection($s_ini, $s_Section) _IniMem_ReadSectionNames($s_ini) _IniMem_RenameSection(ByRef $s_ini, $s_Old_Sec, $s_New_Sec, $i_Flag = 0) _IniMem_Write(ByRef $s_ini, $s_Section, $s_key, $s_value) _IniMem_WriteSection(ByRef $s_ini, $s_Section, $s_data, $i_Index = 1) _IniMem_Cleanup(ByRef $s_ini) #ce ; #FUNCTION# ============================================================== ; Name...........: _IniMem_Delete ; Description ...: Deletes a value from a standard format ini string ; Syntax.........: _IniMem_Delete(ByRef $s_ini, $s_Section, [$s_key]) ; Parameters ....: $s_ini - The ini string ; $s_Section - The section you want to delete ; $s_Key - The key you want to delete (default = "") ; Return values .: Success - 1 ; Failure - 0 (cant find section or key) ; Author ........: Alek ; ========================================================================= Func _IniMem_Delete(ByRef $s_ini, $s_Section, $s_key = "") Local $s_temp_ini, $x, $i $s_temp_ini = StringSplit($s_ini, @CRLF) For $x = 1 To $s_temp_ini[0] If $s_temp_ini[$x] = "[" & $s_Section& "]" Then ExitLoop Next If $x > $s_temp_ini[0] Then Return 0 If $s_key <> "" Then For $i = $x+1 To $s_temp_ini[0] If StringLeft($s_temp_ini[$i], 1) = "[" And StringRight($s_temp_ini[$i], 1) = "]" Then ExitLoop If StringLeft($s_temp_ini[$i], StringLen($s_key)) = $s_key Then $s_temp_ini[$i] = "" ExitLoop EndIf Next Else For $i = $x To $s_temp_ini[0] If StringLeft($s_temp_ini[$i], 1) = "[" And StringRight($s_temp_ini[$i], 1) = "]" And $s_temp_ini[$i] <> "[" & $s_Section & "]" Then ExitLoop $s_temp_ini[$i] = "" Next EndIf $s_ini = "" For $x = 1 To $s_temp_ini[0] If $s_temp_ini[$x] = "" Then ContinueLoop If StringLeft($s_temp_ini[$x], 1) = "[" And StringRight($s_temp_ini[$x],1) = "]" And $x > 1 Then $s_ini &= @CRLF & $s_temp_ini[$x] & @CRLF Else $s_ini &= $s_temp_ini[$x] & @CRLF EndIf Next Return 1 EndFunc ; #FUNCTION# ============================================================== ; Name...........: _IniMem_Read ; Description ...: Reads a value from a standard format ini string ; Syntax.........: _IniMem_Read($s_ini, $s_Section, $s_key, [$s_default]) ; Parameters ....: $s_ini - The ini string ; $s_Section - The section you want to read ; $s_Key - The key you want to get ; $s_default - the return value when unable to read the key (default = "") ; Return values .: Success - value of the selected key ; Failure - $s_default ; Author ........: Alek ; ========================================================================= Func _IniMem_Read($s_ini, $s_Section, $s_key, $s_default = "") $s_ini = StringSplit($s_ini, @CRLF) For $x = 1 To $s_ini[0] If $s_ini[$x] = "[" & $s_Section & "]" Then ExitLoop Next If $x > $s_ini[0] Then Return $s_default For $i = $x+1 To $s_ini[0] If StringLeft($s_ini[$i],1) = "[" And StringRight($s_ini[$i],1) = "]" Then ExitLoop If $s_ini[$i] = "" Then ContinueLoop If StringLeft($s_ini[$i], StringLen($s_key)) = $s_key Then Return StringTrimLeft($s_ini[$i], StringLen($s_key) + 1) Next Return $s_default EndFunc ; #FUNCTION# ============================================================== ; Name...........: _IniMem_ReadSection ; Description ...: Reads all key/value pairs from a section in a standard format ini string ; Syntax.........: _IniMem_ReadSection($s_ini, $s_Section) ; Parameters ....: $s_ini - The ini string ; $s_Section - The section you want to read ; Return values .: Success - a 2 dimensional array where element[n][0] is the key and element[n][1] is the value, [0][0] is the number of elemnts ; Failure - [0][0] = 0 and sets error to 1 ; Author ........: Alek ; ========================================================================= Func _IniMem_ReadSection($s_ini, $s_Section) Local $r_Array[1][2] $s_ini = StringSplit($s_ini, @CRLF) For $x = 1 To $s_ini[0] If $s_ini[$x] = "[" & $s_Section & "]" Then ExitLoop Next If $x > $s_ini[0] Then Return SetError(1) For $i = $x+1 To $s_ini[0] If StringLeft($s_ini[$i],1) = "[" And StringRight($s_ini[$i],1) = "]" Then ExitLoop If $s_ini[$i] = "" Then ContinueLoop ReDim $r_Array[UBound($r_Array, 1) + 1][2] $r_Array[UBound($r_Array, 1) - 1][0] = StringLeft($s_ini[$i], StringInStr($s_ini[$i], "=") - 1) $r_Array[UBound($r_Array, 1) - 1][1] = StringTrimLeft($s_ini[$i], StringInStr($s_ini[$i], "=")) $r_Array[0][0] += 1 Next Return $r_Array EndFunc ; #FUNCTION# ============================================================== ; Name...........: _IniMem_ReadSectionNames ; Description ...: Reads all key/value pairs from a section in a standard format ini string ; Syntax.........: _IniMem_ReadSectionNames($s_ini) ; Parameters ....: $s_ini - The ini string ; Return values .: Success - an array of all section names in the INI string, [0] is the number of elemnts ; Failure - [0] = 0 and sets error to 1 ; Author ........: Alek ; ========================================================================= Func _IniMem_ReadSectionNames($s_ini) Local $r_Array[1] $s_ini = StringSplit($s_ini,@CRLF) For $x = 1 To $s_ini[0] If $s_ini[$x] = "" Then ContinueLoop If StringLeft($s_ini[$x],1) = "[" And StringRight($s_ini[$x],1) = "]" Then ReDim $r_Array[UBound($r_Array, 1) + 1] $r_Array[UBound($r_Array, 1) - 1] = StringTrimLeft(StringTrimRight($s_ini[$x], 1), 1) $r_Array[0] += 1 EndIf Next If $r_Array[0] = 0 Then SetError(1) Return $r_Array EndFunc ; #FUNCTION# ============================================================== ; Name...........: IniMem_RenameSection ; Description ...: Renames a section in a standard format ini string ; Syntax.........: _IniMem_RenameSection(ByRef $s_ini, $s_Old_Sec, $s_New_Sec, [$i_Flag]) ; Parameters ....: $s_ini - The ini string ; $s_old_Sec - The section you want to rename ; $s_New_Sec - The new name of the section. ; $i_Flag - 0 Fail if "new section" already exists. ; 1 Overwrite "new section". This will erase any existing keys in "new section" ; Return values .: Success - 1 ; Failure - 0 (cant find old section) ; Author ........: Alek ; ========================================================================= Func _IniMem_RenameSection(ByRef $s_ini, $s_Old_Sec, $s_New_Sec, $i_Flag = 0) Local $s_temp_ini, $x, $i If $i_Flag = 0 And StringInStr($s_ini, "[" & $s_New_Sec & "]") Then Return 0 ;$s_ini = StringReplace($s_ini,"[" & $s_Old_Sec & "]","[" & $s_New_Sec & "]", 1) $s_temp_ini = StringSplit($s_ini, @CRLF) For $x = 1 To $s_temp_ini[0] If $s_temp_ini[$x] = "[" & $s_Old_Sec & "]" Then $s_temp_ini[$x] = "[" & $s_New_Sec & "]" ExitLoop EndIf Next If $x > $s_temp_ini[0] Then Return 0 If $i_Flag = 1 Then For $i = $x + 1 To $s_temp_ini[0] If $s_temp_ini[$x] = "[" & $s_New_Sec & "]" Then ExitLoop Next If $i > $s_temp_ini[0] Then Return 0 For $x = $i+1 To $s_temp_ini[0] If StringLeft($s_temp_ini[$x], 1) = "[" And StringRight($s_temp_ini[$x], 1) = "]" Then ExitLoop $s_temp_ini[$x] = "" Next EndIf $s_ini = "" For $x = 1 To $s_temp_ini[0] If $s_temp_ini[$x] = "" Then ContinueLoop If StringLeft($s_temp_ini[$x], 1) = "[" And StringRight($s_temp_ini[$x],1) = "]" And $x > 1 Then $s_ini &= @CRLF & $s_temp_ini[$x] & @CRLF Else $s_ini &= $s_temp_ini[$x] & @CRLF EndIf Next Return 1 EndFunc ; #FUNCTION# ============================================================== ; Name...........: _IniMem_Write ; Description ...: Writes a value to a standard format ini string ; Syntax.........: _IniMem_Write(ByRef $s_ini, $s_Section, $s_key, $s_value) ; Parameters ....: $s_ini - The ini string ; $s_Section - The section name in the ini string ; $s_Key - The key name in the in the ini string ; $s_Value - The value to write/change. ; Return values .: 1 ; Author ........: Alek ; ========================================================================= Func _IniMem_Write(ByRef $s_ini, $s_Section, $s_key, $s_value) Local $s_temp_ini = StringSplit($s_ini, @CRLF) For $x = 1 To $s_temp_ini[0] If $s_temp_ini[$x] = "[" & $s_Section & "]" Then ExitLoop Next If $x > $s_temp_ini[0] Then ;$s_temp_ini[$s_temp_ini[0]] &= @CRLF & "[" & $s_Section & "]" & @CRLF & $s_key & "=" & $s_value $s_temp_ini[$s_temp_ini[0]] &= "[" & $s_Section & "]" & @CRLF & $s_key & "=" & $s_value ;looks better ;) Else For $i = $x+1 To $s_temp_ini[0] If StringLeft($s_temp_ini[$i], 1) = "[" And StringRight($s_temp_ini[$i],1) = "]" Then $x = $i-1 $i = 0 ExitLoop ElseIf StringLeft($s_temp_ini[$i], StringLen($s_key)) = $s_key Then $s_temp_ini[$i] = $s_key & "=" & $s_value ExitLoop EndIf Next If $i = 0 Then $s_temp_ini[$x] &= @CRLF & $s_key & "=" & $s_value ElseIf $i > $s_temp_ini[0] Then $s_temp_ini[$s_temp_ini[0]] &= $s_key & "=" & $s_value EndIf EndIf $s_ini = "" For $x = 1 To $s_temp_ini[0] If $s_temp_ini[$x] = "" Then ContinueLoop If StringLeft($s_temp_ini[$x], 1) = "[" And StringRight($s_temp_ini[$x],1) = "]" And $x > 1 Then $s_ini &= @CRLF & $s_temp_ini[$x] & @CRLF Else $s_ini &= $s_temp_ini[$x] & @CRLF EndIf Next Return 1 EndFunc ; #FUNCTION# ============================================================== ; Name...........: _IniMem_WriteSection ; Description ...: Writes a section to a standard format ini string ; Syntax.........: _IniMem_WriteSection(ByRef $s_ini, $s_Section, $s_data, [$i_Index]) ; Parameters ....: $s_ini - The ini string ; $s_Section - The section name in the ini string ; $s_Data - The data to write. The data can either be a string or an array. ; If the data is a string, then each key=value pair must be delimited by @LF. ; If the data is an array, the array must be 2-dimensional and the second dimension must be 2 elements. ; $i_index - If an array is passed as data, this specifies the index to start writing from. ; By default, this is 1 so that the return value of IniReadSection() can be used immediately. ; For manually created arrays, this value may need to be different depending on how the array was created. ; This parameter is ignored if a string is passed as data. ; Return values .: Success - 1 ; Failure - 0 (Invalid data format) ; Error - 1 The data array is not 2d ; Error - 2 The array is smaller then $i_Index ; Error - 3 The data array's second dimension is to small ; Author ........: Alek ; ========================================================================= Func _IniMem_WriteSection(ByRef $s_ini, $s_Section, $s_data, $i_Index = 1) Local $s_key, $s_value If IsArray($s_data) Then If UBound($s_data, 0) <> 2 Then Return SetError(1, Default, 0) If UBound($s_data, 1) - 1 > $i_Index Then Return SetError(2, Default, 0) If UBound($s_data, 2) < 2 Then Return SetError(3, Default, 0) For $x = $i_Index To UBound($s_data, 1) - 1 _IniMem_Write($s_ini, $s_Section, $s_data[$x][0], $s_data[1]) Next Else $s_data = StringSplit($s_data, @LF) If @error Then Return 0 For $x = 1 To $s_data[0] $s_key = StringLeft($s_data[$x],StringInStr($s_data[$x],"=")-1) $s_value = StringTrimLeft($s_data[$x],StringInStr($s_data[$x],"=")) If $s_key Or $s_value = "" Then ContinueLoop _IniMem_Write($s_ini, $s_Section, $s_key , $s_Value) Next EndIf Return 1 EndFunc ; #FUNCTION# ============================================================== ; Name...........: _IniMem_Cleanup ; Description ...: Cleans up a ini format string, will proberly add more features later ; Syntax.........: _IniMem_Cleanup(ByRef $s_ini) ; Parameters ....: $s_ini - The ini string ; Return values .: 1 ; Author ........: Alek ; ========================================================================= Func _IniMem_Cleanup(ByRef $s_ini) Local $s_temp_ini, $x $s_temp_ini = StringSplit($s_ini, @CRLF) $s_ini = "" For $x = 1 To $s_temp_ini[0] If $s_temp_ini[$x] = "" Then ContinueLoop If StringLeft($s_temp_ini[$x], 1) = "[" And StringRight($s_temp_ini[$x],1) = "]" And $x > 1 Then $s_ini &= @CRLF & $s_temp_ini[$x] & @CRLF Else $s_ini &= $s_temp_ini[$x] & @CRLF EndIf Next Return 1 EndFunc
    1 point
  11. #include <Array.au3> Local $a[3][2] = [[100,100],[200,200],[300,300]] While True $aTemp = $a While UBound($aTemp) $iRandom = Random(0,UBound($aTemp)-1,1) ConsoleWrite($iRandom & @CRLF) MouseClick("left",$aTemp[$iRandom][0],$aTemp[$iRandom][1]) _ArrayDelete($aTemp,$iRandom) WEnd MsgBox(1,1,1) WEnd
    1 point
  12. jchd

    AutoIT and Redis

    What I wanted to point out is that at some point in time, a number of no-SQL database-like codebases appeared and rapidly attracted a huge number of developpers. That's the "O dear, that's new and everyone's talking about it so I need to join" effect. After some time it became clear that all these datastore solutions aren't the panacea they were often claimed to be. Of course many/all of them have a good use in specific contexts. What attracted attention is that all these libraries don't enforce strict rules like SQL does, the new land of the free if you want. Again this is an illusion in many situations since both your data and relationships underneath do exist and have to be enforced somewhere. I didn't mean proprietary as "copyrighted property of some big corp", but "ad-hoc code".
    1 point
  13. Subz

    Display @CR and/or @LF

    You can always use StringInStr function to check for @CRLF first and/or @LF, if you want to have these displayed, then I would suggest using StringReplace for example: Opt("ExpandVarStrings", 0) $sRawData = "First Line" & @LF & "Second Line" & @CRLF MsgBox(4096, "Raw Data", $sRawData) $sString = StringReplace(StringReplace($sRawData, @CRLF, "@CRLF@"), @LF, "@CRLF@") MsgBox(4096, "String Data", $sString) ;~ If you want to convert it back Opt("ExpandVarStrings", 1) $sString = $sString Opt("ExpandVarStrings", 0) MsgBox(4096, "String Data Updated", $sString) PS: Its generally best practice to not have Global variables within a function.
    1 point
  14. You are responsible for the content you post on this site. Most of the site is a public forum and the private sections have only limited controls over those who can access them - this is particularly true of "Chat". So treat posting here as if you were speaking in a crowded room surrounded by strangers. Recent high-profile defamation events on other sites illustrate that there are ways in which third parties can force personal data, including contents of personal messages, to be released by site owners. Be careful - libelous/defamatory posts can and have landed members of these other sites in legal hot water. Your anonymity is not guaranteed in such situations. M23
    1 point
  15. 3.0.10 Doesn't...
    1 point
  16. MozRepl works from V3.0.x - V3.5.x
    1 point
  17. So is Firefox 3.5 ( The Beta ) or what version is required for MozRepl ?
    1 point
  18. can this UDF to control FireFox be used for embedding FF into a GUI AutoIt Script..?? If not than whats the best way to do it then..??
    1 point
  19. Hello, yes I know about it. But this thing is only working with FF V1.5! http://www.iol.ie/~locka/mozilla/mozilla.htm http://kb.mozillazine.org/ActiveX And it crashes FF V2.x. We have V3.x now ... The only other thing I found was an "An NPAPI based plugin for Firefox that enables the use of ActiveX controls": http://code.google.com/p/ff-activex-host/ but I don't know if this the right thing and it has many limits, because of the security riscs by ActiveX.
    1 point
  20. UDF to control FireFox via MozRepl: Edit-> Please see new FF.au3 Thread for updates past V0.6.0.1b-10. FF.au3 (V0.6.0.1b-10) Changelog Changes since V0.6.0.0b: V0.6.0.1b-10 - Added: __IsIP: IPV6 Support (IVP6, HexCompressed, 6Hex4Dec, Hex4DecCompressed) V0.6.0.1b-9 - Added: __FFStartProcess: 64bit support - Added: __FFIsURL: support for intranet - Changed: _FFQuit now closes FireFox with multiple windows - Fixed: Connection-limit to MozRepl V0.6.0.1b-8 (by Danp2) - Changed: _FFTabExists to allow search by href - Changed: _FFTabSetSelected to allow selection by href - Changed: SelectWin to check individual tabs - Added: FFau3.SearchTabURL helper function - Fixed: __FFStartProcess - Fixed: _FFGetPosition V0.6.0.1b-7 - New: Internal function: __FFMultiDispatchEvent: Dispatches multiple events on one element - Added: _FFDisPatchEvent can now simulate MouseEvents: click, mousedown, mouseup, mouseover, mousemove, mouseout - Added: Global constants $_FF_Event_* - Changed: Removed connection-limit to MozRepl - Optimized: __FFFilterString - Optimized: __FFB2S (Bool to string) - Optimized: __FFIsIP V0.6.0.1b-6 - Added: Internal function __FFSetTopDocument() - Changed: Default values for _FFXpath: _FFXPath($sQuery, $sAttribute = "", $iReturnType = 9, $iFilter = 0) - Changed/Fixed: _FFSearch($sSearchString[, $bCaseSensitive = False[, $bWholeWord = False[, $bSearchInFrames = True]]]) !!! Now you can use as $sSearchString RegExp, too! - Fixed: _FFAction _FFClick _FFFormSubmit _FFLoadWait _FFDisPatchEvent _FFOpenURL _FFTabAdd _FFTabClose _FFTabSetSelected now updating the FFau3.WCD-object (window.content.document) - Fixed: Different problems after _FFTabAdd - Fixed: Different problems after _FFOpenURL - Fixed: Error in _FFAu3Option() V0.6.0.1b-4 - Changed: Default values for _FFXpath: _FFXPath($sQuery, $sAttribute = "", $iReturnType = 9, $iFilter = 0) - Fixed: Different problems after _FFTabAdd - Fixed: Different problems after _FFOpenURL - Fixed: Errorin _FFAu3Option() V0.6.0.1 - Added: Option $_FF_SEARCH_MODE works now for: _FFLinkClick _FFImageClick - Added: _FFClick: Parameter $bLoadWait - Added: _FFLoadWait: Parameter $bStop = stops pageloading after timeout - Added: _FFAu3Option: "LoadWaitStop" - Added: Global var $_FF_LOADWAIT_STOP - Updated: _FFXPath: some optimizations (shorter command strings to send) - Optimized: _FFFormOptionSelect - Optimized: _FFLoadWait - Fixed: _FFGetPosition: Removed error if "MozillaContentWindowClass" is not found - Fixed: _FFSearch: Error with non-ASCII-chars - Fixed: _FFLinkClick: Error with non-ASCII-chars - Fixed: _FFImageClick: Error with non-ASCII-chars - Fixed: _FFAction("alert", ...): Error with non-ASCII-charsFor compatibily for older scripts and more functions, please use this UDF: http://thorsten-willert.de/Themen/FFau3/FF.au3/FFEx.au3 Function list: _FFAction _FFClick _FFCmd _FFConnect _FFDialogWait _FFDisConnect _FFDispatchEvent _FFFormCheckBox _FFFormGetElementsLength _FFFormOptionSelect _FFFormRadioButton _FFFormReset _FFFormSubmit _FFFrameEnter _FFFrameLeave _FFGetLength _FFGetObjectInfo _FFGetPosition _FFGetValue _FFImageClick _FFImageGetBySize _FFImageMapClick _FFIsConnected _FFLinkClick _FFLinksGetAll _FFLoadWait _FFLoadWaitTimeOut _FFObj _FFObjDelete _FFObjGet _FFObjNew _FFOpenURL _FFPrefGet _FFPrefReset _FFPrefSet _FFQuit _FFReadHTML _FFReadText _FFSearch _FFSetValue _FFStart _FFTabAdd _FFTabClose _FFTabDuplicate _FFTabExists _FFTabGetSelected _FFTabSetSelected _FFTableWriteToArray _FFWindowClose _FFWindowGetHandle _FFWindowOpen _FFWindowSelect _FFWriteHTML _FFXPath Requirement(s).: Latest Version of FireFox and the AddOn MozRepl !!! Don't forget to start MozRepl. FF-menu: Extras/Menu or check there "Activate on startup". Documentation: - English - German - Russian (by Valery) - Englisch CHM, user-calltips ... FF.au3 extensions: - _FF_DM.au3 (UDF for the FireFox Download-Manager) [Forum] - _FFEx.au3 (more functions and compatibly fixes for older scripts): ; _FFDisPatchKeyEvent ; _FFFormGetLength ; _FFGetValueById ; _FFGetValueByName ; _FFSetValueById ; _FFSetValueByName ; _FFTabCloseAll ; _FFTabGetLength ; _FFTableGetCell ; _FF_Call ; _FF_CookiesAllow ; _FF_CookiesDeny ; _FF_CookiesRemoveAll ; _FF_CookiesSetAccess ; _FF_EmptyCache ; _FF_EmptyCookies / _FF_CookiesRemoveAll ; _FF_EmptyHistory ; _FF_FormSetFileInput ; _FF_GetContentXY ; _FF_GetCurrentURL ; _FF_GetStatus ; _FF_GetTitle ; _FF_MozRepl_Detect ; _FF_ResetTitle ; _FF_TabGetAllTitles ; _FF_TabGetAllURLs ; _FF_TabReloadAll UDFs for FireFox AddOns: - _FF_FireFM [Forum] - _FF_FoxBox.au3 [Forum] - _FF_Screengrab.au3 [Forum] Misc: - _FF_AutoLogin [Forum] - _FF_RecordForm [Forum] - YouTube-API-Wrapper [Forum] Known problems: - The _FFTab* functions doesn't work, if you have the FF-AddOn TabMixPlus installed (this AddOn seems to override some internal FF-functions) More examples and stuff are on my homepage. Stilgar
    0 points
  21. Wow, 0 to petulant child in 8 minutes...
    0 points
  22. Elena

    FF.au3 (V0.6.0.1b-10)

    Hi Stilgar, Do you support "frame in frame" handling? Please help me with automation of my page. Unfortunately I cannot get a link to it as it is in our network with VPN, but I'll describe it. The page contains of different set of frames with "frame in frame" architecture: Frame "Main" is located in browser page; Frame "DataEntry" is located in frame "Main"; Form "form1" is located in frame "DataEntry"; Drop-down "PID" and text edit box "sfname" are located in form "form1". My code is: $FFInstance = _FFStart($g_sDataEntryLink) $mainFrame = _FFFrameEnter("Main", "name") $mainFrame = _FFFrameGetSelected("name") MsgBox(0, "$mainFrame", $mainFrame) $DataEntryFrame = _FFFrameEnter("DataEntry", "name") $mainFrame = _FFFrameGetSelected("name") MsgBox(0, "$DataEntryFrame", $DataEntryFrame) Sleep (5000) _FFFormOptionselect("PID", "name", "Custom HF Request", "name", "form1", "name") $First_name = _FFGetValueByName("sfname", 3,0) MsgBox(0, "$First_name", $First_name) My script opens a page, then gives message box with "Main" (so it determines the first frame correctly). Second message box returns "-1", third one returns empty string (though I fill the sfname textbox while sleeping). "Custom HF Request" option is not set in a dropdown. What I do wrongly? Thanks in advance.
    0 points
  23. @Elena: Thank you for your suggestion, I would use it (or similar) in the next version.
    0 points
  24. Elena

    FF.au3 (V0.6.0.1b-10)

    Thank you for the updated library, I'm using it and I like it. But I'd suggest changing the function __FFIsURL. Look: now all URLs like "localhost" or IP-like (XXX.XXX.XXX.XXX) are rejected by this function, and i can't even open my forst FF window. I'd suggest this one: Func __FFIsURL(ByRef $URL) Return (StringRegExp($URL, '^^((ht|f)tp(s?)\:\/\/|~/|/)([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.[\w]{3,4})?((\?\w+=\w+)?(&\w+=\w+)*)?') Or _ StringRegExp($URL,'^((ht|f)tp(s?)://)?(\d{1,3}\.){3}\d{1,3}(:[\d]{1,5})?(/.*)?$') Or _ StringLeft($URL, 6) = "about:" Or _ StringLeft($URL, 7) = "chrome:" Or _ StringLeft($URL, 10) = "localhost:" Or _ StringLeft($URL, 8) = "file:///") EndFunc ;==>__FFIsURL What do you think?
    0 points
  25. Sorry, like I said two posts bevore, this thing is for FF V1.5, it doesn't work with the current versions. And I have no other solution, yet. Only a dirty hack: _FF_CreateEmbedded.au3
    0 points
  26. could these FF functions be used to control an embedded FF Mozilla ActiveX control that's mentioned here..?? #141301
    0 points
  27. I know this method takes a different approach. But Authenticity posted a very nice link to automate FF like IE the other day... http://www.iol.ie/~locka/mozilla/control.htm If you're interested, or maybe want to expand in areas you may not have with the current setup.
    0 points
  28. Great stuff! Is this likely to be in a future release like the IE library is? This has massive potential!
    0 points
  29. Bert

    FF.au3 (V0.6.0.1b-10)

    I take it for any response on FF.au3, you should post in this thread, not the one I started and Stilgar maintained.
    0 points
×
×
  • Create New...