Что нового

Инициализация переменой с помощью Assign

edyapd

Осваивающий
Сообщения
380
Репутация
30
Есть два десятка изображений. Хочу их присвоить переменным. Организовал массив [переменная][имя файла].
Но вот такая конструкция не проходит
Код:
For $i = 0 To UBound($aAraray) - 1
	Assign($aAraray[$i][0], _WinAPI_LoadImage(0, $aAraray[$i][1], $IMAGE_BITMAP, 0, 0, $LR_LOADFROMFILE), 1)
Next

Нельзя использовать в качестве имени элемент массива, т.е. переменная не будет создана/изменена, если имя содержит символ "[".
Можно это как-то обойти?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
edyapd,
А зачем Вам Assign? ИМХО, так лучше:
Код:
For $i = 0 To UBound($aAraray) - 1
	$aAraray[$i][0] = _WinAPI_LoadImage(0, $aAraray[$i][1], $IMAGE_BITMAP, 0, 0, $LR_LOADFROMFILE)
Next
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
edyapd [?]
вот такая конструкция не проходит
Что находится в $aAraray[$i][0]? Если имя переменной, то оно не должно содержать символ '['.
Из примера ниже видно что оно работает без проблем:

Код:
Dim $aVars[2] = ['test', 'test2']

Assign($aVars[0], '1')
Assign($aVars[1], '2')

ConsoleWrite(Eval('test') & @LF)
ConsoleWrite(Eval('test2') & @LF)
 
Автор
E

edyapd

Осваивающий
Сообщения
380
Репутация
30
madmasles, я бы хотел в дальнейшем обращаться к переменной по имени. А так надо будет держать в уме (или постоянно сверяться), что у меня в какой ячейке массива находится.

CreatoR, так уже что-то. Но получается, что к переменной я смогу обратиться только через Eval. А просто записать $test уже не получится.

OffTopic:
Изначально, когда увидел команду Assign, думал это типа указателя. Скажем есть переменная $test, а Assign('test', ...) это как отсылает к этой переменной. Понравилась тем, что можно использовать как раз в цикле. Assign('test' & $i, ...)
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
лучше использовать Scripting.Dictionary
в русской справке есть дополнение, где описано как с этим работать. тогда все будет просто
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
edyapd [?]
я бы хотел в дальнейшем обращаться к переменной по имени
Код:
Global $aArr[3] = ['red', 'blue', 'green'], $oSC = ObjCreate('Scripting.Dictionary')

For $sTmp In $aArr
	$oSC.Item($sTmp) = Random(1000, 1000000, 1);_WinAPI_LoadImage(0, @ScriptDir & '\' & $sTmp & '.bmp', $IMAGE_BITMAP, 0, 0, $LR_LOADFROMFILE)
Next

ConsoleWrite($oSC.Item('red') & @LF)
ConsoleWrite($oSC.Item('green') & @LF)
ConsoleWrite($oSC.Item('blue') & @LF)
 
Автор
E

edyapd

Осваивающий
Сообщения
380
Репутация
30
Спасибо. Буду разбираться.
OffTopic:
Бросил программирование (изучал самостоятельно), когда вместо понятного Pascal появился объектно-ориентированый Delphi. А тут и до AutoIt эти объекты добрались ;D
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
В последнее время пошла какая-то мода на неоправданное усложнение кода вплоть до полного абсурда. Зачем вам Assign()? Создаете одномерный массив и помещаете в него хэндлы картинок. Все. А для того чтобы не запутаться существуют комментарии. Не вставайте на темную сторону, пишите код правильно.

P.S

Да, и не забывайте, что такие конструкции как Assign(), Eval(), Execute() могут существовать только в интерпритируемых ЯП. Так что не используйте их без четкого понимания зачем вам это нужно.
 
Автор
E

edyapd

Осваивающий
Сообщения
380
Репутация
30
Yashied, так я и прошу примера, как можно в массив засунуть эти хендлы. Но желательно чтобы инициализацию элементов можно было сделать в цикле. И при этом, чтобы обращаться в дальнейшем можно было по имени, а не через безликую $а[$0]. Просто с помощь Assign() можно это хоть как-то сделать. Теперь буду знать, что это можно сделать и через объект. Хотя слабо разбираюсь где у них свойсва, где методы.
Так же готов расмотреть и ваш пример, как это можно сделать.
P.S. я не волшебник, я только учусь
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
edyapd, вот посмотрите ради интереса как я оформляю большую часть своих библиотек. Комментарии здесь являются неотъемлемой частью. Кроме того, комментарий зачастую говорит намного больше, нежели сокращенное название переменной. У вас же всего навсего несколько битмапов, и "безликая" $a[0] здесь будет более уместна. Добавьте комментарий, к чему относится тот или иной битмап, и все готово.

Код:
Global $skData[1][19] = [[0, 0, 0, 0, 0, 0, DllCallbackRegister('_sk_IconProc', 'ptr', 'hwnd;uint;wparam;lparam'), 0, 0, DllCallbackRegister('_sk_EnumProc', 'int', 'hwnd;lparam'), 0, 0, 0, 0, 0, 0, 0, 0, 0]]

#cs

WARNING: DO NOT CHANGE THIS ARRAY, FOR INTERNAL USE ONLY!

$skData[0][0 ]    - Number of items in array
       [0][1 ]    - Current item (0 - No item)
       [0][2 ]    - State (0 - Normal, 1 - Hover, 2 - Click)
       [0][3 ]    - Hold down item (0 - None, (-1) - Hold down outside)
       [0][4 ]    - Hold down jumping update control flag
       [0][5 ]    - Handle to the GDI+ DLL
       [0][6 ]    - Handle to the _sk_IconProc()
       [0][7 ]    - Pointer to the original window procedure
       [0][8 ]    - Focus mode control flag
       [0][9 ]    - Handle to the _sk_EnumProc()
       [0][10]    - Keyboard mode control flag
       [0][11-18] - Don't used

$skData[i][0 ]    - Handle to the icon for "Normal" state
       [i][1 ]    - Handle to the icon for "Hover" state
       [i][2 ]    - Handle to the icon for "Click" state
       [i][3 ]    - Handle to the icon for "Disable" state (Optional)
       [i][4 ]    - Handle to the parent window
       [i][5 ]    - Handle to the Icon control
       [i][6 ]    - ID of the Icon control
       [i][7 ]    - ID of the Button control
       [i][8 ]    - Handle to the GDI+ alpha bitmap
       [i][9 ]    - Disable control flag
       [i][10]    - Hold down control flag
       [i][11]    - Focus control flag
       [i][12]    - Focus rectange (RECT structure)
       [i][13]    - Focus drawing control flag
       [i][14]    - The x-coordinate of the Icon control
       [i][15]    - The y-coordinate of the Icon control
       [i][16]    - The width of the Icon control
       [i][17]    - The height of the Icon control
       [i][18]    - Reserved

#ce
 
Автор
E

edyapd

Осваивающий
Сообщения
380
Репутация
30
Спасибо, приму к сведенью. Но на данный момент пожалуй остановлюсь на последнем коде предложеным madmasles. Как наиболее понятном для меня.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Обычно в таких случаях используют константы.
Код:
const $red = 0
const $blue = 1
const $green = 2
Global $aArr[3]

For $sTmp=0 to 2
    $aArr[$sTmp] = Random(1000, 1000000, 1);_WinAPI_LoadImage(0, @ScriptDir & '\' & $sTmp & '.bmp', $IMAGE_BITMAP, 0, 0, $LR_LOADFROMFILE)
Next

ConsoleWrite($aArr[$red] & @LF)
ConsoleWrite($aArr[$green] & @LF)
ConsoleWrite($aArr[$blue] & @LF)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
edyapd, не буду излишне давить, но все же хочу вас отговорить от вашей затеи. Вы по-сути ухудшаете алгоритм, добавляете объекты и т.д. ради удобства восприятия кода. В результате как минимум программа будет работать медленнее, что уже совсем нехорошо.

Кстати, если уж очень хочется ясности, то можете использовать такой подход (часто используется в публичных UDF):

Код:
Global Enum $BMP_A, $BMP_B, $BMP_C

Global $aArray[3]

For $i = $BMP_A To $BMP_C
	$aArray[$i] = ...
Next

ConsoleWrite($aArray[$BMP_A] & @CRLF)
ConsoleWrite($aArray[$BMP_B] & @CRLF)
ConsoleWrite($aArray[$BMP_C] & @CRLF)


В этом примере обращение к массиву происходит по переменной со смысловым названием ($BMP_*).
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Prog, нет, в таких случаях используются ассоциативные массивы, но поскольку в autoit такого формата нет (MAPS не довели до ума) то правильный вариант предложил madmasles. А трюк с константами подойдет, если заранее будет известно количество элементов.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
inververs сказал(а):
Prog, нет, в таких случаях используются ассоциативные массивы, но поскольку в autoit такого формата нет (MAPS не довели до ума) то правильный вариант предложил madmasles. А трюк с константами подойдет, если заранее будет известно количество элементов.
madmasles предложил правильный вариант, но он совершенно неподходящий в данной ситуации.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Очень даже подходящий, когда нужно обратиться к переменной по имени, но имя создается динамически (как у автора - имя переменной это имя файла).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
inververs сказал(а):
Очень даже подходящий, когда нужно обратиться к переменной по имени, но имя создается динамически (как у автора - имя переменной это имя файла).
Вот только зачем? Зачем добавлять в код объекты, если они только ухудшат выполнение кода. Да, я согласен, если бы в AutoIt были реализованы ассоциативные массивы, то вопрос был бы открыт, а так... только ради того, чтобы "не запутаться"... Первым делом нужно думать об оптимизированности кода.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Конкретно этот объект - очень даже полезный. В нем очень удобно хранить индексы массива.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
inververs сказал(а):
Конкретно этот объект - очень даже полезный. В нем очень удобно хранить индексы массива.
Удобно, когда точно представляешь зачем оно нужно, но использовать его в примере ТС, IMHO, это полный бред.
 
Верх