Leaderboard
Popular Content
Showing content with the highest reputation on 01/06/2020 in all areas
-
I'm creating a WebDriver tutorial
FrancescoDiMuro and one other reacted to JLogan3o13 for a topic
@Nine I agree with the first half of your statement; a tutorial as something of a "Quick-Start Guide". The explanation of concepts is great, and has a lot of value, but I would simply caution throwing in too much of that at the beginning. If someone is able to pick the UDF up and quickly get up to speed using it, they are much more likely to spend the time learning about the why and how of it. If all the theory is thrown at them first, they may get frustrated and not stick with it.2 points -
CSV file editor
AutoBert reacted to pixelsearch for a topic
Hi everybody The script below (901f) allows to wander easily through a listview, selecting any item or subitem by using the 4 direction keys. The Enter key is also managed and allows to fire an event (as double-click does) With the help of mikell (many thanks !) and after several tests based on 1000 rows & 6 columns, we succeeded to code a clear WM_NOTIFY function, which is simple (though solid) and should be reusable without any modification in other scripts dealing with basic listviews (we didn't use or check any particular style for the listview) Trapping the Enter key has been done by using a dummy control + Accelerators, though we spent the whole last week trapping it in another way, using Yashied's Wsp.dll (without any problem) . Finally we choosed the dummy control option... to have a smaller code. Version 901f (Nov 11, 2019) : the pic below shows how the selected subitem appears, with its specific background colour (light blue) Version 901f code : #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <WindowsConstants.au3> #include <WinAPIvkeysConstants.au3> Global $hGUI = GUICreate("Wandering through ListView (901f)", 460, 500) Global $idListView = GUICtrlCreateListView _ (" Col 0 | Col 1| Col 2| Col 3", 15, 60, 430, 400) Global $hListView = GuiCtrlGetHandle($idListView) For $iRow = 0 To 99 $sRow = StringFormat("%2s", $iRow) GUICtrlCreateListViewItem( _ "Row " & $sRow & " / Col 0 |" & _ "Row " & $sRow & " / Col 1 |" & _ "Row " & $sRow & " / Col 2 |" & _ "Row " & $sRow & " / Col 3", $idListView) Next Global $g_iColumnCount = _GUICtrlListView_GetColumnCount($idListView) -1 Global $g_iItem = -1, $g_iSubItem = -1 ; item/subitem selected in ListView control Global $idDummy_Dbl_Click = GUICtrlCreateDummy() Global $idDummy_Enter = GUICtrlCreateDummy() Global $aAccelKeys[1][2] = [["{ENTER}", $idDummy_Enter]] GUISetAccelerators($aAccelKeys) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUISetState(@SW_SHOW) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE GUIDelete($hGUI) Exit Case $idDummy_Dbl_Click MsgBox($MB_TOPMOST, "Double-click activated cell", _ "Row " & $g_iItem & " / Col " & $g_iSubItem) Case $idDummy_Enter If _WinAPI_GetFocus() = $hListView And $g_iItem > -1 Then MsgBox($MB_TOPMOST, "Enter activated cell", _ "Row " & $g_iItem & " / Col " & $g_iSubItem) EndIf EndSwitch WEnd ;============================================ Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam Local $tNMHDR, $hWndFrom, $iIDFrom, $iCode $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom") $iCode = DllStructGetData($tNMHDR, "Code") Static $bMouseDown = False, $bNotXP = Not (@OSVersion = "WIN_XP") Switch $hWndFrom Case $hListView Switch $iCode Case $NM_CUSTOMDRAW Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam) Local $iDrawStage = DllStructGetData($tCustDraw, "dwDrawStage") If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW If $iDrawStage = $CDDS_ITEMPREPAINT Then Return $CDRF_NOTIFYSUBITEMDRAW Local $iItem = DllStructGetData($tCustDraw, "dwItemSpec") Local $iSubItem = DllStructGetData($tCustDraw, "iSubItem") Local $iColor = 0xFF000000 ; this is $CLR_DEFAULT in ColorConstants.au3 If $iItem = $g_iItem And $iSubItem = $g_iSubItem Then $iColor = 0xFFFFC0 ; light blue for 1 subitem (BGR) EndIf DllStructSetData($tCustDraw, "clrTextBk", $iColor) Return $CDRF_NEWFONT Case $LVN_KEYDOWN If $bMouseDown Or $g_iItem = -1 Then Return 1 ; don't process Local $tInfo = DllStructCreate($tagNMLVKEYDOWN, $lParam) Local $iVK = DllStructGetData($tInfo, "VKey") Switch $iVK Case $VK_RIGHT If $g_iSubItem < $g_iColumnCount Then $g_iSubItem += 1 If $bNotXP Then _GUICtrlListView_RedrawItems($hListview, $g_iItem, $g_iItem) EndIf Case $VK_LEFT If $g_iSubItem > 0 Then $g_iSubItem -= 1 If $bNotXP Then _GUICtrlListView_RedrawItems($hListview, $g_iItem, $g_iItem) EndIf Case $VK_SPACE ; spacebar would select the whole row Return 1 EndSwitch Case $NM_RELEASEDCAPTURE $bMouseDown = True Local $iItemSave = $g_iItem Local $aHit = _GUICtrlListView_SubItemHitTest($hListView) $g_iItem = $aHit[0] $g_iSubItem = $aHit[1] If $g_iItem = -1 And $iItemSave > -1 Then _GUICtrlListView_RedrawItems($hListview, $iItemSave, $iItemSave) EndIf Case $LVN_ITEMCHANGED Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam) Local $iNewState = DllStructGetData($tInfo, "NewState") Switch $iNewState Case BitOr($LVIS_FOCUSED, $LVIS_SELECTED) $g_iItem = DllStructGetData($tInfo, "Item") _GUICtrlListView_SetItemSelected($hListview, $g_iItem, False) EndSwitch Case $NM_CLICK, $NM_RCLICK $bMouseDown = False Case $NM_DBLCLK $bMouseDown = False If $g_iItem > -1 Then GUICtrlSendToDummy($idDummy_Dbl_Click) EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY Version 901k (Dec 16, 2019) What started with a simple "wander through listview" has turned now to a functional CSV file editor, which can be useful to modify your CSV files with AutoIt : Here are the instructions to use the script, based on a CSV file starting like this : street,city,zip,state,beds,baths,sq__ft,type,sale_date,price,latitude,longitude 3526 HIGH ST,SACRAMENTO,95838,CA,2,1,836,Residential,Wed May 21 00:00:00 EDT 2008,59222,38.631913,-121.434879 51 OMAHA CT,SACRAMENTO,95823,CA,3,1,1167,Residential,Wed May 21 00:00:00 EDT 2008,68212,38.478902,-121.431028 ... 1) Import options : comma delimited (default) No need to change anything if your CSV is comma delimited (other options are Semicolon delimited, Tab delimited) 2) Import options : First row = headers (default = checked) * Keep it checked if the 1st row of your imported file contains headers (that's the case in our example) * UNcheck it if the 1st row contains data, making listview headers appear like this : Col 0 | Col 1 | Col 2 ... 3) Import your CSV file : Only now the listview will be created dynamically. As soon as it is populated, GUI becomes resizable/maximizable, which can be helpful during modifications of a listview containing many columns. 4) Selection color : light blue (default) You can change the selected cell background color by clicking the "Selection color" button : this will open Windows color picker. 5) Editing a listview cell : done by Enter key (or double-click), this is how the edited cell will appear : * Please note that the edited background color (green in the pic) depends on each computer theme. It is not related to the selected background we discussed in 4) * Validate your modification with Enter key, or cancel the modification (revert) with Escape Key 6) Edit Font size : 15 (default) 15 was good in the precedent pic, the edited cell had its content "RIO LINDA" perfectly aligned with all other cells (on my computer). Here again, the font height required depends on each computer : if you want the edited font to be bigger (or smaller), just use the updown control. 7) Chained Edit ? (default = No) * "No" => when you finish editing a cell (Enter key), the same cell stays selected. * "Horizontally" => If checked, edition will automatically continue with the cell on its right. * "Vertically" => If checked, edition will automatically continue with the cell below. This feature can be very useful when you modify cells of a whole colum (vertically) or cells by row (horizontally) 8 ) Inserting a blank line (not in Gui) : press the "Ins" key : 9) Deleting a line (not in Gui) : press the "Del" key : 10) Export CSV file : Filename automatically suggested for export will be : Filename import & actual date & actual time, for example : Import name = "Sales Results.csv" => suggested Export name = "Sales Results_2019-12-16 16:00:59.csv" Version 901m (Dec 18, 2019) Yesterday, mikell suggested to import the csv file by dropping it directly into the GUI, good idea This new version 901m allows it. Now there are 2 ways to import the csv file : * Import button * Drag and drop into the large droppable zone, as shown in the pic below (this zone will be reused to create the listview at same coords) Version 901n (Dec 20, 2019) As t0nZ got tons of csv files, pipe "|" separated, here is a new version allowing this 4th separator Version 901p (Dec 25, 2019) New functionality : now you can drag headers to reorder columns. It may help some users who need it while editing their file. Exported CSV file will be saved according to the new columns order. Version 901r (Dec 29, 2019) New functionality : Numeric sort on any column (right click on column header) It is recommended to backup (export) your file before sorting, just in case you need a copy of it, unsorted. Version 901s (Dec 30, 2019) 1 functionality added : String sort (right click on column header) Numeric sort is alright in most cases, but sometimes we also need a String sort like shown in the following picture. Both ways of sorting (numeric and string) are found in this new release. Version 901t (Jan 3, 2020) 3 functionalities added Rename Header , Insert Column , Delete Column (right click on column header to display its context menu) Version 901u (Jan 6, 2020) 1 functionality added : Natural sort. Thanks to jchd for the idea and Melba23 for his function ArrayMultiColSort() included in the script. Though this natural sort isn't fully implemented, it should work when numbers precede letters (see pic below or better, try it on the "street" column found in the downloadable csv test file below) Natural sort duration + listview update are fast, maybe because of the new function _BufferCreate() described here and now added to the script. Version 901w (Jan 10, 2020) Two functionalities added : 1) Close File button, which allows to import other csv file(s) during the same session 2) Import speed has been improved because the listview control is now populated directly by an Array and not anymore by GUICtrlCreateListViewItem() This explains why, in this version, there are no more Control id's for listview items, allowing to empty the listview content in a snap with this line of code : _SendMessage($g_hListView, $LVM_DELETEALLITEMS) That's what it took to add the Close File button and import several csv files during the same session, avoiding id leaks. Please report if any issue is encountered. Version 901x (Jan 14, 2020) One minor functionality added : number of rows is now displayed just under the listview, it may be handy sometimes. Other minor changes included (natural sort speed improved) Credits : Many thanks to Czardas for his function _CSVSplit() and guinness for his function _SaveCSV(), guys you did a great job. Thanks to Musashi : your suggestions and time passed on testing beta versions of the script, that was really helpful and challenging. Not sure I would have ended this script without your detailed reports. Mikell : the 1st step above (901f) that we wrote together, it all started from here. Your knowledge and kindness are legendary ! Not forgetting all other persons who were inspiring : LarsJ, Melba23, jpm, that list could be endless... Download link : version 901x - Jan 14, 2020 (minor update on Jan 15) 901x - CSV file editor.au3 Test csv file (986 rows/12cols) : Sacramento real estate transactions.csv1 point -
CSV file editor
jchd reacted to pixelsearch for a topic
Version 901u (Jan 6, 2020) 1 functionality added : Natural sort. Thanks to jchd for the idea and Melba23 for his function ArrayMultiColSort() included in the script. Czardas read this thread a couple of days ago and that's great, I hope he liked the way his CSV splitting function was reused Download link at the end of 1st post1 point -
StringBetween capturing multiple lines
SOCCERMOMMY reacted to Nine for a topic
@SOCCERMOMMY That should get you fast started : #include <Constants.au3> #include <IE.au3> #include <Array.au3> Opt ("MustDeclareVars", 1) Local $oIE = _IECreate ("https://www.basketball-reference.com/boxscores/?month=01&day=5&year=2020") Local $oEast = _IEGetObjById ($oIE, "divs_standings_E") Local $aEast = _IETableWriteToArray ($oEast, True) _ArrayDisplay ($aEast) Local $oWest = _IEGetObjById ($oIE, "divs_standings_W") Local $aWest = _IETableWriteToArray ($oWest, True) _ArrayDisplay ($aWest) Enjoy !1 point -
OutlookEX UDF - Help & Support (IV)
seadoggie01 reacted to water for a topic
@seadoggie01 Seems the text of your body is > 255 characters. You need to use the code as described here to access the full text: https://www.autoitscript.com/wiki/OutlookEX_UDF_-_Mail_Item#Access_full_content_of_the_Body_and_HTMLBody_property1 point -
1 point
-
a "download manager" is a program that can - among other features - download a file in parts (for whatever reason). AutoIt is not a download manager, although it does allow you to code such a feature, if you have the time, adequate knowledge, motivation, and a real reason. otherwise, use your AutoIt script to operate an existing download manager as suggested above. AutoIt is fully capable of operating a console application, see the help for the Run() function.1 point
-
ListView export speed
Musashi reacted to pixelsearch for a topic
What follows also tries to improve the speed of _GUICtrlListView_GetItemText() and _GUICtrlListView_SetItemText() ... by not calling them directly from GuiListView.au3 I'm experimenting a function _BufferCreate() that will create once only the buffer & pointers involving my Listview needs. This function will be called only once, from any function that requires it first (it could be export phase, numeric & string sorts, natural sort etc...), which means that the buffer will always stay opened during the whole script (as soon as it is created) and reused by any function that requires it. Could it be a dangerous way of scripting ? Plenty of tests will give the answer. Because if I don't do that, the same following code will appear at least 3 times within the script, making it bigger & bigger and harder to maintain As the variable $g_idListView isn't defined until a csv file is imported, then I'll have to create global variables within the function (though it may be better to define them global at the beginning of the script, then assign their values in this function, we'll see) Global $g_bBufferExist = False ... ;============================================ Func Export_csv() If Not $g_bBufferExist Then _BufferCreate() ... EndFunc ;==>_Export_csv ;============================================ Func AnyFunc_ThatNeedsIt If Not $g_bBufferExist Then _BufferCreate() ... EndFunc ;==>AnyFunc_ThatNeedsIt ;============================================ Func _BufferCreate() Global $g_bUnicode = GUICtrlSendMsg($g_idListView, $LVM_GETUNICODEFORMAT, 0, 0) <> 0 Global $g_InsertItem = ($g_bUnicode ? $LVM_INSERTITEMW : $LVM_INSERTITEMA) Global $g_SetItem = ($g_bUnicode ? $LVM_SETITEMW : $LVM_SETITEMA) Global $g_GetItemText = ($g_bUnicode ? $LVM_GETITEMTEXTW : $LVM_GETITEMTEXTA) Global $g_SetItemText = ($g_bUnicode ? $LVM_SETITEMTEXTW : $LVM_SETITEMTEXTA) Global $g_tBuffer = DllStructCreate(($g_bUnicode ? "wchar Text[4096]" : "char Text[4096]")) Global $g_tItem = DllStructCreate($tagLVITEM) Global $g_pItem = DllStructGetPtr($g_tItem) DllStructSetData($g_tItem, "Text", DllStructGetPtr($g_tBuffer)) DllStructSetData($g_tItem, "TextMax", 4096) $g_bBufferExist = True EndFunc ;==>_BufferCreate Exported files using this function (found in script a.au3 for example) will be compared to exported files not using it (script b.au3 for example). Let's cross fingers that files exported will be exactly the same after the same treatment has been applied to them (sort, headers drag, export etc...) . Beyond Compare will check that, To be continued...1 point -
[Solved] How to attach to an already running Chrome instance ?
MarkIT reacted to JohnWIlling for a topic
I found a simple solution to reconnect to an existing chromedriver. Once the driver is loaded, the "session id" is returned. Subsequent communication is via TCP to the defined port while passing in the session id. Global $sSessionFileName = "Session.ID" $sSession = _WD_CreateSession($sDesiredCapabilities) If @error <> $_WD_ERROR_Success Then Exit -1 EndIf FileWrite($sSessionFileName, $sSession & @CRLF) What I've done is to write out to a file the value of the sessionid following the call to _WD_CreateSession. Then when restarting an new app, I would call the following: Func _WD_ReAttach($Type) Local Const $sFuncName = "_WD_ReAttach" Switch $Type Case $eFireFox SetupFireFox() Case $eChrome SetupChrome() Case $eEdge SetupEdge() EndSwitch Local $pFile = FileOpen($sSessionFileName, 0) If (@error = 0) Then $sSession = FileReadLine($pFile) EndIf EndFunc ;==>_WD_ReAttach Which sets up the _WD_Option then reads in the saved session string. I can then continue interacting with the Chrome driver.... John W.1 point -
CSV file editor
Letraindusoir reacted to Musashi for a topic
Just an info : Currently I am sitting on my old notebook (Win7, AutoIt 3.3.14.0). When I run the script, the Up, Down and Enter keys are working as expected, but Left and Right keys do not. However, I strongly suspect that this has nothing to do with your great script, but is rather due to my laziness to update the notebook to AutoIt 3.3.14.5. EDIT : Thanks to @mikell as well !1 point -
I know but I have the same behavior as jplumb had. Go read.1 point
-
Looking for a tutorial for ini Files and AutoIT, really lost here
pubeoutros reacted to StringingLong for a topic
Forget about all the advice about XML for now. It will only confuse you. Master this first, and then you can move onto more complex strategies as your program design goals deem fit. Storing and retrieving data from an INI file is trivial. What Is An INI File? An INI file is a text file that is represented in easy to read human format. It consists of sections whose names are encapsulated in "[" and "]" brackets. Within each section are key = value pairs. For example:: myini.ini --------------------- [Options] maxLines=40 screenWidth=800 screenHeight=600 [user] admin=Joe In this example, there are two sections - User and Options. Within the section are key/values that are associated with the section. In the key/value pair, admin=joe, admin is the key and joe is the assigned value In the key/value pair, maxLines=40, maxLines is the key and 40 is the assigned value How To Read And Write An INI File INI files store data. They are a quick way to do so without much programming effort. They are not ideal if you have lots of data to reference. As the size of the file grows, it takes longer to find and insert things. So using INI files is not ideal for really large data sets - you should use a database instead. To retrieve data and write data in an INI file, you use the IniRead and IniWrite functions. First thing you want to do, is create one by hand with your text editor and put in default data. Give it a filename and then save it to the same dirctory as your AutoIt program. Lets take an example. Suppose your AutoIt app has a need to store the screen width, screen height, and admin name. If you need to get at the data specifically, you do this: $screenWidth = IniRead("myini.ini","Options","screenWidth",640) $screenHeight = IniRead("myini.ini","Options","screenHeight",400) If you need to save the new screen height into the myini.ini file, you do it like this: IniWrite("myini.ini","Options","screenHeight",480) Is that really hard? This is as simple as it gets to storing data into a file.1 point