Jump to content

Recommended Posts

@jpm

Maps variable type has been be in beta for years, and only recently it became officially supported.

I like the idea of object-oriented maps, and I like the features and simplicity it offers.

However, in practice it's too easy to confuse with arrays and other object type, like dictionary. When run some tests, I also encounter the same errors listed here:

After some thinking, I think we really do need to distinguish a map from an array. We cannot just use the same "[]" to reference different types of variables.

So my propose is like this:

=====

To declare a map, you need to declare like this:

 

local $map:[]

; or even simplier:

local $map:

":" indicate that this is a map, not an array, and the difference is enough to be seen right away. You can define the number of elements inside.

local $map:5

; Not: local $map:[5] which means create a map with 5 as the first key

; Or
$number = 5;

local $map:$number

means there are 5 empty elements already in the map.

=====

To set a map element, you just follow the same rule:

$map:0 = "item 1"  ; Set the first map element to be "item 1", with or without a key.

$map:["key 1"] = "item with key"  ; Set a map element with key "key 1" to "item with key", if this key doesn't exist, add a new item in the map.

$map:"key 1" = "item with key" ; It's the same as above.

$map:[0] = "itme with 0 as key" ; You can use 0 as the key.

=====

To reference a map element, you can either use a zero-based index, or a string as the key:

$item = $map:0   ; It will return the first item in the map, with or without a key

$item = $map:[0] ; It will return a item with key 0

$item = $map:["key 1"]    ; It will return the item with key "key 1"

$item = $map:"key 1"    ; Same as above.

===== more about the number referencing:
$number = 5
$item6 = $map:$number  ; It will return the 6th item in the map (zero based)
$item = $map:[$number]      ; It will return the item with the key "5"

=======================

The reason we need to add ":" before the "[",  is to distinguish what we want to get. Do we want to get the map, or an array?

Suppose there is a scenario like this:

local $map[] ; declare a map

local $array[5] ; declare an array

$map[0] = $array

$map[0][0] = 123  ; Error here.

The above statement "$map[0][0]" created an confusion that's difficult to process. it can mean either:

"Set $array[0] to 123 " or "Set $map[0] with key '0' with a new value 123"

It will make the program hard to understand, and error prone.

So if we adopt the new syntax, the purpose will become easy:

$map:0:0 = 123  ; Set the first element $map, which is a map, to first element with value 123
$map:[0]:[0] = 123  ; Set the map element with key 0, which is a map, to element with key 0 to value 123

$map:0[0] = 123  ; Set the first element $map, which is an array, to first data be value 123
$map:[0][0] = 123  ; Set the element in $map with key 0, which is an array, to first data be value 123

$map[0][0] = 123 ; Set the 2D array $map's first data to be 123

$map[0]:0 = 123 ; Set the 1D array $map's first data, which is a map, its first element to be value 123, with or without a key.
$map[0]:[0] = 123 ; Set the 1D array $map's first data, which is a map, its element with key 0 to be value 123.

To reference map's elements by keys are also easy:

$map:"Key 1":"Key 2" = 123 ; Referencing $map["key 1"]["key 2"]

$map.key1:"Key 2" = 123; Reference a dictionary object $map's item("key 1"), to have a map with "key 2" value set to 123

$map:key1.key2 = 123 ; Referencing a map element with a key string, which value is key1.key2, and set this element to 123.

$map:["key1"].key2 = 123 ; Referencing a map elment with key "key1", which is an object, and set its key2 property to 123.

$map.key1.key2 = 123 ; Referencing an object map's property key1.key2, and set it to 123

$map:0:0    ; Referencing the first element in map, which is also a map, the first element

 

 

I think when doing like this, it will be much easier for Jon to program the maps variable, and we will have a much more precise way to reference and set map and array values.

Please leave your comments for this proposal. Thank you !

 

 

 

 

 

 

 

 

Edited by philpw99
Link to post
Share on other sites

In AutoIt it is suggested to use the hungarian notation for variables.
Arrays use "a" and Maps use "m" as the the first character.
This way it is quite easy to distinguish them.

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to post
Share on other sites

It's not about the name conversion, but how to define and referencing maps.

The way maps works now is not good, quite confusing, and very easy to have program error.

for example, if I give you something like this:

$var["key"]

How do you know the $var is referencing to a dict object, or a map?

$var[0]

How do you know $var is a 1D array, or just map with 0 as the key?

It gets much more complicated once the referencing 2D to 3D  mixture of array, dict and maps variables.

like $var[0][0][0]

which one is array, which one is map with 0 as key, which one is dict object with 0 as key ?

Edited by philpw99
Link to post
Share on other sites

If I had to answer it would be simple: know your data and have the lead over the datatypes you deal with. You're the programmer after all, aren't you?

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Link to post
Share on other sites
9 hours ago, philpw99 said:

How do you know $var is a 1D array, or just map with 0 as the key?

Lets assume you need to process some employee data.
Using the hungarian notation I would name a map $mEmployee and an array $aEmployee. Problem solved ;)

If you really need to know wether it is a map or an array use functions IsMap or IsArray. Function VarGetType helps as well.
 

6 hours ago, jchd said:

You're the programmer after all, aren't you?

I second that.

 

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to post
Share on other sites
6 hours ago, jchd said:

If I had to answer it would be simple: know your data and have the lead over the datatypes you deal with. You're the programmer after all, aren't you?

I tend to agree with your statement @jchd in general, as long as the project isn't shared with several developers (collaboration project). Then it should be definitely clear what's going on in the code without long onboarding etc. But this brings me to @waters statement that I agree with, too:

27 minutes ago, water said:

[...] Using the hungarian notation I would name a map $mEmployee and an array $aEmployee [...] If you really need to know wether it is a map or an array use functions IsMap or IsArray. Function VarGetType helps as well [...]

 

As addition I can say that modern IDEs like VSCode supports you by the variable hover tooltip which show up the data type information.
Unfortunately not yet for AutoIt in VSCode, but loganch and other working on it 😀 .

Best regards
Sven

Edited by SOLVE-SMART

Stay innovative!

Spoiler

🌍 Au3Forums

🎲 AutoIt (en) Cheat Sheet

📊 AutoIt limits/defaults

💎 Code Katas: [...] (comming soon)

🎭 Collection of GitHub users with AutoIt projects

🐞 False-Positives

🔮 Me on GitHub

💬 Opinion about new forum sub category

📑 UDF wiki list

✂ VSCode-AutoItSnippets

📑 WebDriver FAQs

👨‍🏫 WebDriver Tutorial (coming soon)

Link to post
Share on other sites

Guys, you completely misunderstood the purpose of my proposal.

This is not about how to know your own program's variables. This is about making AutoIt program itself better and less error prone.

Please, take a look at the post again:

 

Please , read that post and understand the problem. It's NOT about how to let programmer know which variable is which type, it's about how to let AutoIt know which variable is which type.

The AutoIt program generate errors at some places, like $map1.bar["baz"] will give you an error, while $map1.bar.baz works just fine. The problem is: sometimes is very hard for AutoIt to know what the programmer intents, therefore there are errors in some strange ways. And this is why maps has been in beta for years, and it's still not stable.

The proposal here is to let Maps become more specific, more precise and more stable.

Maybe I post this one in the wrong place. This is not belong to general technical discussion?

Link to post
Share on other sites
29 minutes ago, philpw99 said:

The AutoIt program generate errors at some places, like $map1.bar["baz"] will give you an error, while $map1.bar.baz works just fine.

Sounds like a bug in the parser/interpreter to me, this is definitely fixable without any syntax change and it should be fixed. Tagging @jpm so that we can get his opinion on the issue as an AutoIt developer :)

Edited by TheDcoder

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 post
Share on other sites

This is just a common misunderstanding of the priorities between dot and [].

In $map1.bar["baz"] the first part evaluated is bar["baz"], which obviously raises an error.

There are many possible valid syntaxes:

Local $m[], $p[]

$m["foot"] = 123
$p["bare"] = $m

ConsoleWrite($p.bare.foot & @LF)
ConsoleWrite(($p.bare)["foot"] & @LF)
ConsoleWrite(($p["bare"]).foot & @LF)
ConsoleWrite($p["bare"].foot & @LF)
ConsoleWrite(($p["bare"])["foot"] & @LF)
ConsoleWrite($p["bare"]["foot"] & @LF)

What makes you think that the Map datatype isn't "stable"?

Edited by jchd

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Link to post
Share on other sites
2 hours ago, philpw99 said:

it's about how to let AutoIt know which variable is which type.

The interpreter knows that very well!

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Link to post
Share on other sites

$map1.bar["baz"] has two meanings:

* Referencing $map1's element "bar" 's element "baz"

* Referencing $map1's element by using bar["baz"] as the key.

We programmer obviously know bar["baz"] doesn't exist, so it must be the first meaning, but how do AutoIt know?

Jchd: try this, maybe you can fix it?

Local $m[], $p[]

$m["foot"] = 123
$p["bare"] = $m

$p.bare.foot = 345          ; OK
$p.bare["foot"] = 345       ; Error here
$p["bare"].foot = 345       ; OK
$p["bare"]["foot"] = 345    ; OK

 

Edited by philpw99
Link to post
Share on other sites
Quote
$p.["bare"].foot = 345          ; Error here
$p.["bare"]["foot"] = 345       ; Error here

Use the dot format xor the square braket format. Using both is an error IFAIK.

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Link to post
Share on other sites

Sorry, I see that now. Correct it. Still has errors.

Remember this is a very simple example. When the program grows big, when maps grow like a big tree , this will become very problematic.

$p.bare["foot"] = 345       ; Error here
Edited by philpw99
Link to post
Share on other sites
3 hours ago, TheDcoder said:

Sounds like a bug in the parser/interpreter to me, this is definitely fixable without any syntax change and it should be fixed. Tagging @jpm so that we can get his opinion on the issue as an AutoIt developer :)

Thank you for pointing me to a great direction ! Just edited my post and tagged Jon.

In my opinion, this create too much of confusion.

* Array use "[]", dictionary and others objects use "." , map use both "[]" and "."  

* All of them can be expressed as $v[0]

* Both Dictionary and Maps can be expressed as $v["key"]

Even the program can run fine, it will be quite difficult to troubleshoot problem related to dict, array and maps using together.

As @SOLVE-SMART, @jchd and @water previously stated, we can use Hungarian notation to reduce the confusion. Yet sometimes we humans think one way, and the machine interpret it another way. If we use the notation wrong, or machine thinks differently, it will create even more difficulties for troubleshooting.

Edited by philpw99
Link to post
Share on other sites

Also, my proposal solves the referencing maps with number index problem.

Right now, you cannot access maps by just the first element, second element... You have to access it by a key. It reduce maps flexibility a lot.

We cannot write a simple $map[0] to indicate we want to use the first element. We have to use MapKeys() then get the first one in the array. It's not efficient and need extra coding if all we want is to get the first few elements.

In my proposal, $map:0 means the first element, $map:[0] means a element with key "0". Both has important uses in programming, and we need to distinguish them and enable both of them in a concise and precise way.

Edited by philpw99
Link to post
Share on other sites

A Map is a dictionary, and map elements don't have an index: they're accessed thru their key.

What you're dreaming of is a combination of an [indexed] array and a dictionary (aka an associative array). Also note that an AutoIt Map key can be a string or an integer. In the latter case, this isn't an index.

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Link to post
Share on other sites
On 1/13/2023 at 1:21 PM, jchd said:

What you're dreaming of is a combination of an [indexed] array and a dictionary (aka an associative array).

Why this must be a dream ? In computer everything is indexed, every object is indexed, all you can see on this screen, all the text, buttons, tags, inputs are indexed.

Then why maps cannot be indexed ? Why maps has to follow the rules of dictionary ?

If maps cannot be indexed, then the advantage of using maps is reduced to:

1. We can use $map.key instead of $map("key") .

2. We don't need dict object creation.

I don't know how maps are implemented. If AutoIt really uses dictionary object, then I got nothing to say, but if it's implemented using its own methods, index should be a good thing to have.

Edited by philpw99
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
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By t0nZ
      I was searching for a way to highlight zones (regions, provinces, counties, etc) on a map, and I don't need  super precise maps so I wrote this script, based on picking up black and white maps (2 colors BW .png or .gif tested) and filling them with colors, writing down a sqlite database to associate zones with names (and other data as well), and reuse the map and the DB to display data, in my example reading a simple .txt file.
      It's all based on this thread  and this other thread.

      So I have two modes:
      The Map "creation mode" : you provide a map image and you start to pick up colors, set "upper level" region/state, and by clicking on a region you fill it and you name it, and all the data are saved on a sqlite DB (auto-created) when you have the map image and a DB with the correct associations, you can switch the "mode" to "show" (as by .ini file) and the script tries to read a "datafile" showing the zone names listed in datafile. The code:
      #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Icon=Icone\mapFlooder.ico #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ;MAP Flooder ;(C) NSC 2021 #include <GUIConstants.au3> #include <_GOLLOG.au3> #include <SQLite.au3> #include <SQLite.dll.au3> #include <Misc.au3> #include <GDIPlus.au3> Opt("mousecoordmode", 2) Global $prgname = "MAP Flooder", $ver = "V.0.7", $Buttoncolor = "0xFF00FF", $MPini = @ScriptDir & "\MapFlooder.ini", $btest Global $dbfullpath, $dbtable, $dbFields, $mapfile, $FloodMode, $datafile Global $HDC, $hBrush, $hGraphics, $obj_orig Global $Pic1, $gui, $width, $height, $bColor, $realtimeCoords, $lastclickcoords, $inputSup, $zonecountNum,$labeltest #Region program Gollog(">>>>>> Start MAP Flooder " & $ver) ctrlini() Gui() SQLiteDBcreate() If $FloodMode = "createdb" Then Gollog("CreateDB Mode") DBFlooder() Else Gollog("Show MAP mode") MapShow("show") EndIf Close() #EndRegion program #Region funcS Func Gui() _GDIPlus_Startup() $Pic1 = _GDIPlus_BitmapCreateFromFile($mapfile) $width = _GDIPlus_ImageGetWidth($Pic1) $height = _GDIPlus_ImageGetHeight($Pic1) If $FloodMode = "createdb" Then $gui = GUICreate($prgname & " " & $ver, $width + 150, $height) $labelLoadedMap = GUICtrlCreateLabel("Loaded Map", $width + 10, 5) $labelLoadedMap2 = GUICtrlCreateLabel(_FileToFileName($mapfile), $width + 10, 25) $labeldim = GUICtrlCreateLabel("Width*Height", $width + 10, 45) $labeldim2 = GUICtrlCreateLabel($width & " * " & $height, $width + 10, 65) $lastclickcoordslabel = GUICtrlCreateLabel("Last Click Coords", $width + 10, 100) $lastclickcoords = GUICtrlCreateLabel("xx - xx", $width + 10, 120, 180, 20) $realtimeCoordslabel = GUICtrlCreateLabel("Real Time Coords", $width + 10, 140) $realtimeCoords = GUICtrlCreateLabel("Real Time Coords", $width + 10, 160, 80, 20) $SuPzonelabel = GUICtrlCreateLabel("Supzone (region-state)", $width + 10, 200) $inputSup = GUICtrlCreateInput("sup", $width + 10, 220, 80, 20) $bColor = GUICtrlCreateButton($Buttoncolor, $width + 10, 250, 130, 30) GUICtrlSetBkColor($bColor, $Buttoncolor) $zonecountlabel = GUICtrlCreateLabel("Done Zone Count:", $width + 10, 320, 100, 20) $zonecountNum = GUICtrlCreateLabel("x", $width + 10, 340, 100, 20) $btest = GUICtrlCreateButton("TEST MAP", $width + 10, 380, 130, 30) $labeltest = GUICtrlCreateLabel("", $width + 10, 420, 130, 30) Else $gui = GUICreate($prgname & " " & $ver, $width, $height) EndIf GUISetState() $HDC = _WinAPI_GetDC($gui) $hGraphics = _GDIPlus_GraphicsCreateFromHDC($HDC) _GDIPlus_GraphicsDrawImageRect($hGraphics, $Pic1, 0, 0, $width, $height) EndFunc ;==>Gui Func MapShow($showmode) ; reading a simple text file with zone names, searching for names in DB and fill the map using stored coordinates If $showmode = "show" Then Local $aLines = FileReadToArray($datafile) Local $iLineCount = @extended EndIf If $showmode = "test" Then $iLineCount = 1 If @error Then MsgBox(48, "MapFlooder", "There was an error reading the data file. @error: " & @error) ; Gollog("There was an error reading the data file. @error: " & @error) Close() Else Gollog("start filling zones") _SQLite_Startup() _SQLite_Open($dbfullpath) ; open Database with zone definitions Local $hQuery, $aRow For $i = 0 To $iLineCount - 1 If $showmode = "show" Then _SQLite_Query(-1, "SELECT * FROM " & $dbtable & " where zone = '" & $aLines[$i] & "' ORDER BY zone ASC;", $hQuery) ; the query EndIf If $showmode = "test" Then _SQLite_Query(-1, "SELECT * FROM " & $dbtable & " ORDER BY zone ASC;", $hQuery) ; the query EndIf While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK $hBrush = DllCall("gdi32.dll", "long", "CreateSolidBrush", "int", $aRow[2]) ; fill color read from DB $obj_orig = DllCall("gdi32.dll", "int", "SelectObject", "int", $HDC, "int", $hBrush[0]) DllCall("gdi32.dll", "int", "FloodFill", "int", $HDC, "int", $aRow[3], "int", $aRow[4], "int", 0x000000) If $showmode = "test" Then GUICtrlSetData($labeltest,$aRow[0]) Sleep(200) GUISetState() EndIf WEnd _SQLite_QueryFinalize($hQuery) Next _SQLite_Close() _SQLite_Shutdown() EndIf While 1 $msg = GUIGetMsg() If $msg = $GUI_EVENT_CLOSE Then ExitLoop WEnd EndFunc ;==>MapShow Func DBFlooder() $zonecount = 0 While 1 $mp = MouseGetPos() GUICtrlSetData($realtimeCoords, $mp[0] & " - " & $mp[1]) $msg = GUIGetMsg() If $msg = $GUI_EVENT_CLOSE Then ExitLoop If $msg = $bColor Then colorP() If $msg = $btest Then MapShow("Test") If $mp[0] < $width And $mp[1] < $height And _IsPressed("01") And WinActive($gui) Then $mp = MouseGetPos() GUICtrlSetData($lastclickcoords, $mp[0] & " - " & $mp[1]) $hBrush = DllCall("gdi32.dll", "long", "CreateSolidBrush", "int", $Buttoncolor) ; fill color ok $obj_orig = DllCall("gdi32.dll", "int", "SelectObject", "int", $HDC, "int", $hBrush[0]) DllCall("gdi32.dll", "int", "FloodFill", "int", $HDC, "int", $mp[0], "int", $mp[1], "int", 0x000000) Local $Zone = InputBox("Map Floode", "Zone ?") If $Zone = "" Or @error = 1 Then ; when manage wrong click, possibility to repeat ; set 'temp' color to highlight the 'wrong' click $hBrush = DllCall("gdi32.dll", "long", "CreateSolidBrush", "int", 0x4ccfc6) ; fill color wrong $obj_orig = DllCall("gdi32.dll", "int", "SelectObject", "int", $HDC, "int", $hBrush[0]) DllCall("gdi32.dll", "int", "FloodFill", "int", $HDC, "int", $mp[0], "int", $mp[1], "int", 0x000000) ; restore color $hBrush = DllCall("gdi32.dll", "long", "CreateSolidBrush", "int", $Buttoncolor) ; fill color ok $obj_orig = DllCall("gdi32.dll", "int", "SelectObject", "int", $HDC, "int", $hBrush[0]) Else _SQLite_Startup() _SQLite_Open($dbfullpath) ; open Database Local $SupZone = GUICtrlRead($inputSup) Local $data = '"' & $Zone & '","' & $SupZone & '","' & $Buttoncolor & '",' & $mp[0] & "," & $mp[1] _SQLite_Exec(-1, "INSERT INTO " & $dbtable & "(" & $dbFields & ") VALUES (" & $data & ");") If @error = -1 Then GOLLOG("Error insert record") MsgBox(48, "Error", "insert record") EndIf $zonecount += 1 GUICtrlSetData($zonecountNum, $zonecount) _SQLite_Close() _SQLite_Shutdown() EndIf EndIf WEnd EndFunc ;==>DBFlooder Func Close() Gollog("<<<<<<< closing...") _WinAPI_ReleaseDC($gui, $HDC) _GDIPlus_GraphicsDispose($hGraphics) _GDIPlus_Shutdown() Exit EndFunc ;==>Close Func SQLiteDBcreate() ;complete path e filename If Not FileExists($dbfullpath) Then GOLLOG("perform SQLite DB creation") Local $dbfolder = _FileToFilePath($dbfullpath) ;Local $dbfile = _FileToFileName($dbfullpath) If Not FileExists($dbfolder) Then DirCreate($dbfolder) ; =====================>>>>> START SQL DLL _SQLite_Startup() _SQLite_Open($dbfullpath) ; open Database ; creating first table If _SQLite_Exec(-1, "CREATE TABLE " & $dbtable & " (" & $dbFields & ");") = $SQLITE_OK Then GOLLOG("DB table - " & $dbtable & " - creation ok") Else GOLLOG("Error creating DB table : " & @error) EndIf _SQLite_Close() _SQLite_Shutdown() Else Gollog("DB already exist") EndIf EndFunc ;==>SQLiteDBcreate ; #FUNCTION# ==================================================================================================================== ; Name ..........: _FileToFilePath ; Description ...: Returns a folder path from a FQPN (Fully Qualified Path Name) ; Syntax ........: _FileToFilePath($sPath) ; Parameters ....: $sPath - a string value. ; Return values .: Success - String ; Failure - Empty string as returned from StringLeft() ; Author ........: Sam Coates ; =============================================================================================================================== Func _FileToFilePath($sPath) Local $sReturn = StringLeft($sPath, StringInStr($sPath, "\", 0, -1) - 1) Return ($sReturn) EndFunc ;==>_FileToFilePath ; #FUNCTION# ==================================================================================================================== ; Name ..........: _FileToFileName ; Description ...: Returns a filename from a FQPN (Fully Qualified Path Name) ; Syntax ........: _FileToFileName($sPath[, $bIncludeExtension = True]) ; Parameters ....: $sPath - a string value. ; $bIncludeExtension - [optional] a boolean value. Default is True. ; Return values .: Success - String ; Failure - Empty string as returned from StringLeft() ; Author ........: Sam Coates ; =============================================================================================================================== Func _FileToFileName($sPath, $bIncludeExtension = True) Local $sReturn = StringTrimLeft($sPath, StringInStr($sPath, "\", 0, -1)) If $bIncludeExtension = False Then $sReturn = StringLeft($sReturn, StringInStr($sReturn, ".", 0, -1) - 1) Return ($sReturn) EndFunc ;==>_FileToFileName Func colorP() ; modified for BGR color GOLLOG("Color Picker") Local $color = _ChooseColor(2) If $color = -1 Then GOLLOG("no color selected") Else Local $sCr = Hex($color, 6) Local $RGB_Buttoncolor = '0x' & StringMid($sCr, 1, 2) & StringMid($sCr, 3, 2) & StringMid($sCr, 5, 2) GUICtrlSetBkColor($bColor, $RGB_Buttoncolor) ; BGR color $Buttoncolor = '0x' & StringMid($sCr, 5, 2) & StringMid($sCr, 3, 2) & StringMid($sCr, 1, 2) GUICtrlSetData($bColor, $Buttoncolor) GOLLOG("new color " & $Buttoncolor & " selected") EndIf EndFunc ;==>colorP Func ctrlini() ;ini read If FileExists($MPini) Then GOLLOG("found: " & $MPini) $mapfile = IniRead($MPini, "map", "mapfile", "") $datafile = IniRead($MPini, "map", "datafile", "") $dbfullpath = IniRead($MPini, "db", "dbfullpath", "") $dbtable = IniRead($MPini, "db", "dbtable", "") $dbFields = IniRead($MPini, "db", "dbfields", "") $FloodMode = IniRead($MPini, "mode", "mode", "") Else GOLLOG($MPini & " NOT found..") Close() EndIf EndFunc ;==>ctrlini #EndRegion funcS All the needed files plus some example (image maps and DBs)
      Link to all demo files
      To test, copy all in a single folder and adjust the mapflooder.ini, also you can add to you includes the _gollog.au3 (used for log, you can avoid it deleting all Gollog() lines)
       
       
       
       
       
    • By MarcoMonte
      Hello Everyone,
      Hoping someone can help me,
      I am totally stuck on this problem,

      I cannot reach the textarea and the button in a maps page that I get by clicking on a button in a previus page, the only way I can interact with this is using tab and mouseclick but this is a danger method as  you know.

      I get the handle by using: $Posizione = _IEAttach("Ricerca Indirizzo su mappa")

      then I tried a lot of things but nothing works, can someone give me a hint?
      --------------------
      WinWait("Ricerca Indirizzo su mappa")
      sleep(1000)
      $Posizione = _IEAttach("Ricerca Indirizzo su mappa")
      WinSetState ("Ricerca Indirizzo su mappa", "", @SW_MAXIMIZE  )
      WinActivate("Ricerca Indirizzo su mappa")
      sleep(500)
      ;~ $oForm = _IEFormGetObjByName($Posizione, "form1");Punta il Form
      $oText = _IEFormElementGetObjByName($Posizione,"indirizzo")
      $oText = _IEFormElementGetObjByName($Posizione,"writeAddress")

      ;~ $LenteTestoMess = _IEFormElementGetValue($oText);Inserisce il PrimoRepertorio nella variabile
      ;~ _IELinkClickByText($Posizione, $oForm);Clicca su Aggiorna ed invia il form
      _IEFormElementSetValue ($oText,"via Ravenna 12" );Completamento campo testo
      ----------------------------------------------------
      Mappa.odt Ricerca Indirizzo su mappa.htm
    • By qsek
      Im not sure if this is intended but normally Autoit variables are always passed as copies (except objects i think).
      But below i observed an unconsistency when copying maps with nested maps inside.
      Issue:
      If you create a nested map1 and copy it to a new map2, changing a nested value in map2 will also change the nested value in map1
      Dim $player[] Dim $sub[] $player.test1 = 1 $player.test2 = $sub $player.test2.child1 = "org" $player.test2.childext = $sub $player.test2.childext.child1 = "org2" $playerold = $player ; make a copy of the whole map ConsoleWrite("player.test2.child1 : "& $player.test2.child1 & @CRLF); original nested value in $player $playerold.test2.child1 = "changed" ; edit a nested value in $playerold ConsoleWrite("player.test2.child1 : "& $player.test2.child1 & @CRLF) ; original nested value in $player changed ConsoleWrite("---------------------" & @CRLF) ConsoleWrite("player.test2.childext.child1 : "& $player.test2.childext.child1 & @CRLF); original level2 nested value in $player $playerold.test2.childext.child1 = "changed2" ; edit a level2 nested value in $playerold ConsoleWrite("player.test2.child1 : "& $player.test2.child1 & @CRLF); original level1 nested value in $player stayed the same ConsoleWrite("player.test2.childext.child1 : "& $player.test2.childext.child1 & @CRLF); original level2 nested value in $player changed  
    • By qsek
      Can somebody try to reproduce this bug?
      It would be helpful to know if this issue appeares on other environments too.
      Issue:
      Sometimes values of certain keys will return empty even if expicitly assigned a value before.
      Conditions:
      Map is bigger than ~50 key/values pairs value is being worked with in a Function where a loop is iterating through the Map before retrieving the value there is a isMap/MapKeys/MapAppend/MapRemove check on the Map value. Dim $mMap[] ; Generate random key strings For $i = 0 To 100 $RndKey = "" For $i2 = 0 To 4 $RndKey &= Chr(Random(65,90,1)) Next $mMap[$RndKey] = 999 next ConsoleWrite("-----------1-------------" & @CRLF); Unpredictable blank values MapDisplay1($mMap) ConsoleWrite("-----------2-------------" & @CRLF); ByRef always works MapDisplay2($mMap) ConsoleWrite("-----------3-------------" & @CRLF); not in a function always works For $i In MapKeys($mMap) isMap($mMap[$i]) ConsoleWrite($i&": "&$mMap[$i]&@CRLF) Next Func MapDisplay1( $m_Map ) For $i In MapKeys($m_Map) isMap($m_Map[$i]) ;same problem with isMap($m_Map[$i]), MapKeys($m_Map[$i]), MapAppend/MapRemove but NOT with MapExists($m_Map,$i) ConsoleWrite($i&": "&$m_Map[$i]&@CRLF) Next EndFunc Func MapDisplay2( ByRef $m_Map ) For $i In MapKeys($m_Map) isMap($m_Map[$i]) ConsoleWrite($i&": "&$m_Map[$i]&@CRLF) Next EndFunc  
      The value is not lost or overwritten on the global map, only on the local map inside the function.
       
    • By TheDcoder
      Hello Again! I previously stumbled upon a topic asking for maps datatype's instructions... I too wasn't sure what a map is until I tried it... So I am making this topic to help other newbies (and some oldbies) better understand the Maps datatype of AutoIt! Lets start!
      A Note for Readers
      The maps datatype is still in development and is currently in Alpha Stage (More Risky than Beta) and its unstable, so AutoIt can crash indefinably while using Maps! I can't guarantee if this will be implemented in stable versions, this is a fairly new thing to AutoIt coders & in my honest opinion I don't see any use for it Maps are the best datatype in AutoIt, Very Useful ... Not hurting anyone though .  Also the maps datatype is DISABLED IN STABLE VERSIONS, So you need to install the latest beta version of AutoIt to make maps work . If you find any bugs while using a map, please report it in the Official Bug Tracker
      Introduction To Maps
      Maps are just like arrays, instead they use "keys" to access elements inside them... A key can be either a string or an integer (Other datatypes work too but they are converted to a integer [Equivalent to Int($vKey)] before assignment [Source]). Although Integers don't represent the order of elements in a map unlike in an array...
      Declaring Maps
      Its similar to declaring an Array:
      ; This is the only way to declare a map ; You must have a declarative keyword like Dim/Global/Local before the declaration unless the map is assigned a value from a functions return Local $mMap[] ; Don't insert any numbers or strings it! Simple, Isn't it?
      Using Maps
      Using maps is similar to arrays (again!):
      Local $mMap[] ; Lets declare our map first! ; Adding data to maps is easy... ; This is our key ; | ; v $mMap["Key"] = "Value" ; <--- And our value! ; A key is Case-Sensitive meaning "Key" is not same as "key"! $mMap["key"] = "value" ; Not the same as $mMap["Key"]! ; There are 2 different ways to access an element in a map $mMap["Key"] ; 1st Method $mMap.Key ; 2nd Method  Enumerating Maps
      Its quite easy to enumerate through arrays but what about maps? how can I enumerate through them!?
      #include <MsgBoxConstants.au3> ; Lets create our map first Local $mMap[] ; Lets add some information to the map, feel free to modify & add new elements $mMap["Name"] = "Damon Harris" $mMap["Alias"] = "TheDcoder" $mMap["Gender"] = "Male" $mMap["Age"] = 14 $mMap["Location"] = "India" $aMapKeys = MapKeys($mMap) ; MapKeys function returns all the keys in the format of an array Local $sProfile = "Profile of " & $mMap["Name"] & ':' & @CRLF ; We will use this string later For $vKey In $aMapKeys ; We use this to get the keys in a map :) $sProfile &= @CRLF & $vKey & ': ' & $mMap[$vKey] ; Add some details to the profile string using our map! Next MsgBox($MB_ICONINFORMATION + $MB_OK, "Profile", $sProfile) ; Finally display the profile :) It is easy as always
      Multi-Dimensional Maps
      Now now... I know that you are a little confused that how can an multi-dimensional maps exist... Although I am not 100% sure if its called that but lets continue:

      #include <MsgBoxConstants.au3> ; Multi-Dimensional maps are just maps in a map Local $mMapOfMapsvilla[] ; This map will store an other map Local $mParkMap[] ; This Park map will be inserted in the Mapsvilla's map :P $mMapOfMapsvilla["Map Item 1"] = "Town Hall" $mMapOfMapsvilla["Map Item 2"] = "Police Station" $mMapOfMapsvilla["Map Item 3"] = "Shopping Mall" $mMapOfMapsvilla["Map Item 4"] = "Residential Area" $mMapOfMapsvilla["Map Item 5"] = "Park" $mParkMap["Map Item 1"] = "Cottan Candy Stand" $mParkMap["Map Item 2"] = "Public Toilet" $mParkMap["Map Item 3"] = "Woods" $mMapOfMapsvilla.Park = $mParkMap MsgBox($MB_OK, "Map Location", $mMapOfMapsvilla["Map Item 1"]) ; Will display Town Hall MsgBox($MB_OK, "Map Location", $mMapOfMapsvilla.Park["Map Item 1"]) ; Will display Cottan Candy Stand I am sure its easy for you to understand now
      Frequently Asked Questions (FAQs) & Their answers
      Q #1. Help! My code does not respond to anything (or) I get an "Variable subscript badly formatted" error on the line of declaration...
      A. DONT USE F5 or Go, Instead use Alt + F5 or Tools -> Beta Run in SciTE (Make sure that you have Beta installed)
      Q #2. Why are you using "m" in-front of every map variable?
      A. Best coding Practices: Names of Variables 
      Q #3. What are "Elements" which you mention frequently???
      A. This is a newbie question (I have no intention of insulting you ), so I guess you are new to programming. "Elements" are data slots inside a Map (or an Array), you can imagine elements as individual variable which are stored in a Map. You can access them using "keys", Please refer to "Introduction to Maps" section at the starting of this post
      Q #4. Are Maps faster than Arrays?
      A. You need to understand that Maps have different purpose than Arrays. Maps are designed to store data dynamically (like storing information for certain controlIDs of GUI) and Arrays are designed to store data in a order (for instance, Storing every character of a string in an element for easy access). If you still want to know then if Maps are faster, then the answer is maybe... Maps are *supposed* (I am not sure ) to be faster in addition of elements (while Arrays are painfully slow while adding or removing elements). Here (Post #24) is a benchmark (Thanks kealper! )
       
      More FAQs coming soon! Feel free to ask a question in the mean while
×
×
  • Create New...