Что нового

Значение переменной как имя для другой переменной

Anton

Твори! Пусть завистники твои захлебываются пылью!
Сообщения
69
Репутация
3
Есть функция которая считывает ini файл и создает элементы GUICtrlCreateCheckbox
так вот каждый из них как бы должен быть в переменной, ну типа:
$var = GUICtrlCreateCheckbox("текст", 20, 20)
а как сделать чтоб вместо $var было значение переменной $IniSections[$i]


Код:
Func CreateCheakBoxOrIniFile($IniFileName)
	Local $IniSections = IniReadSectionNames($IniFileName)
	If @error Then 
		MsgBox(4096, "Ошибка!!!", "Не найден файл конфигураций.")
	Else
		For $i = 1 To $IniSections[0]
			$NameButton = IniRead($IniFileName, $IniSections[$i],"Name","Ошибка!!!")
			msgbox(0,"",$NameButton)

			GUICtrlCreateCheckbox($NameButton, 20, $iTop)

			$iTop += 25
			$iScrollInfoMax += 1.6
		Next
	EndIf
EndFunc

надеюсь понятно объяснил задачу
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
что-то типа?
Код:
$value1 = "текст с переменной 1"
$i= Eval ("value" & "1")
MsgBox (0, "", $i)

хотя неее... наверное не то. тебе нужно чтоб все твои контролы были в одном массиве? я во одно своём скрипте делал так:
Код:
;--------- рисуем цифры начало ---------
Global $Digits[5][41] ; объявляем массив для лейблов
$posx = 5 ; начальная позиция по оси X
$posy = 5 ; начальная позиция по оси Y
$dig = 1 ; текущая цифра
For $i = 1 to 40 ; крутим цикл столько раз сколько пикселей в 1 цифре
 If $i = 9 Then ; если сейчас 9 круг, то
 $posx += 21 ; переход на следующий ряд
 $posy = 5 ; поднимаемся на начальную позицию
 EndIf
 If $i = 17 Then ; если сейчас 17 круг, то
 $posx += 21 ; переход на следующий ряд
 $posy = 5 ; поднимаемся на начальную позицию
 EndIf
 If $i = 25 Then ; если сейчас 25 круг, то
 $posx += 21 ; переход на следующий ряд
 $posy = 5 ; поднимаемся на начальную позицию
 EndIf
 If $i = 33 Then ; если сейчас 33 круг, то
 $posx += 21 ; переход на следующий ряд
 $posy = 5 ; поднимаемся на начальную позицию
 EndIf
 $Digits[$dig][$i] = GUICtrlCreateLabel("0", $posx, $posy, 20, 20, $SS_CENTER )
 GUICtrlSetBkColor ($Digits[$dig][$i], "0xFFFFFF"); фон белый
 GUICtrlSetColor ($Digits[$dig][$i], "0x80FFFF"); шрифт голубой 80FFFF, обратный цвет:0000FF
 $posy += 21 ; после каждого создания, сдвиг вниз на 1 позицию
 If $i = 40 Then ; если сейчас последний круг, то
	 If $dig = 4 Then ExitLoop ; если цифра 4, то выход из цикла
 $i = 0 ;начинаем сначала
 $posx += 25 ; начальная позиция по оси X
 $posy = 5 ; начальная позиция по оси Y
 $dig += 1 ; прибавляем 1
 EndIf
Next
;--------- рисуем цифры конец ---------

получилось вот что: _http://img259.imageshack.us/img259/6866/1111li.png
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Попробуй так
Код:
Func CreateCheakBoxOrIniFile($IniFileName)
    Local $IniSections = IniReadSectionNames($IniFileName)
    If @error Then
        MsgBox(4096, "Ошибка!!!", "Не найден файл конфигураций.")
    Else
        For $i = 1 To $IniSections[0]
            $NameButton = IniRead($IniFileName, $IniSections[$i],"Name","Ошибка!!!")
            $sName = $NameButton
            ;msgbox(0,"",$NameButton)

            Assign($NameButton, GUICtrlCreateCheckbox($sName, 20, $iTop))

            $iTop += 25
            $iScrollInfoMax += 1.6
        Next
    EndIf
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Anton [?]
как сделать чтоб вместо $var было значение переменной $IniSections[$i]

Код:
Func CreateCheakBoxOrIniFile($IniFileName)
	Local $IniSections = IniReadSectionNames($IniFileName)
	If @error Then Return MsgBox(4096, "Ошибка!!!", "Не найден файл конфигураций.")
	
	$iTop = 20
	$iScrollInfoMax = 0
	
	For $i = 1 To $IniSections[0]
		$NameButton = IniRead($IniFileName, $IniSections[$i], "Name", "Ошибка!!!")
		;MsgBox(0, "", $NameButton)
		
		Assign($IniSections[$i], GUICtrlCreateCheckbox($NameButton, 20, $iTop), 2)
		
		$iTop += 25
		$iScrollInfoMax += 1.6
	Next
EndFunc


Хотя это будет считаться “неграммотным” кодингом ;)
 
Автор
A

Anton

Твори! Пусть завистники твои захлебываются пылью!
Сообщения
69
Репутация
3
ynbIpb, спасибо за ответ но это совсем не то что мне нужно :(
Kaster, Ваш вариант почти то что нужно, я его подправил, хотел написать что получилось и увидел сообщение от CreatoR'а, который написал в точности такое же как у меня получилось. :smile:

Хотя это будет считаться “неграммотным” кодингом
CreatoR, а почему это не грамотно??? :blink:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Anton [?]
почему это не грамотно?
Потому что динамические переменные сложно отслеживать (нужно всё время проверять переменные), повышается риск сбоя в скрипте. Лучше объявить массив который и будет содержать идентификаторы элементов.
 

Kinex

Новичок
Сообщения
19
Репутация
2
Ну для тех кто пишет для получения удовольствия такие переменные это самая надежная конструкция, Это элегантно. И именно эту элегантную точку в коде для правки и запомнишь.
 

gora

Знающий
Сообщения
315
Репутация
19
Вопрос у меня полностью соответствует теме, но решение своего вопроса я в ней не нашел. :(
Имею ini файл, но он не соответствует структуре "стандартного" ini файла и привести его в нужное состояние сложно. Мне удается из него считать нужные мне параметры, но как их использовать ума не приложу.
У меня получается:
$lineP[1] - содержит, например, modecomp, часть имени будущей переменной без лидирующего символа $
$lineP[2] - содержит, например, LZMA, значение этой переменной

Требуется выполнить следующее:
$modecomp = LZMA

т.е. создать новую переменную с именем $modecomp и присвоить ей значение LZMA.
 

SyDr

Сидра
Сообщения
651
Репутация
158
Код:
Assign("modecomp", "LZMA")
If IsDeclared("modecomp") Then MsgBox(4096, Default, "Переменная существует, её значение:" & @CRLF & Eval("modecomp")


Assign для создания
IsDeclared для проверки существования
Eval для получения значения
 

gora

Знающий
Сообщения
315
Репутация
19
SyDr
Вы меня не поняли. У меня нет ни modecomp, ни LZMA в непосредственном виде, я их не знаю в скрипте, они считываются из ini файла. У меня есть только $lineP[1] и $lineP[2] в которых и содержатся имя и значение переменной которую я должен создать и использовать в скрипте.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
gora
Код:
$sFile = @ScriptDir & '\test.txt'
If Not FileExists($sFile) Then
	MsgBox(16, 'Error', 'Файл настроек не найден.')
	Exit
EndIf
$aVar = StringSplit(StringStripCR(FileRead($sFile)), @LF)
If Mod($aVar[0], 2) Then
	MsgBox(16, 'Error', 'Число строк должно быть кратно 2')
	Exit
EndIf
For $i = 1 To $aVar[0] - 1 Step 2
	If Assign($aVar[$i], $aVar[$i + 1], 2) Then
		If IsDeclared($aVar[$i]) Then
			MsgBox(64, '', 'Переменная ' & $aVar[$i] & ' существует. Ее значение: ' & Eval($aVar[$i]))
		EndIf
	EndIf
Next
MsgBox(0, '', $aVar[1] & '=' & Eval($aVar[1]) & @CRLF & $aVar[3] & '=' & Eval($aVar[3]))
Файл test.txt:
Код:
sFirst
gora
sSecond
madmasles
 

gora

Знающий
Сообщения
315
Репутация
19
AZJIO

Я на аналогичное вышел путем "научного тыка", но не понимаю, почему я не могу вывести эту переменную?
Код:
$modecomp = ""
...
While 1
...
	$lineP[1] = "$" & $lineP[1]
	Assign ($lineP[1], $lineP[2], 2)
	$key=MsgBox( 1, Eval($lineP[1]), $lineP[1] & "=" & $lineP[2] & @CRLF & "$modecomp=" & $modecomp)
	If $key = 2 Then ExitLoop
...
Wend


Во второй строке в окне я не вижу значения этой переменной
 

NoMad73rus

Продвинутый
Сообщения
124
Репутация
80
Не нужно добавлять $ к имени, это за вас сделает Assign
 

gora

Знающий
Сообщения
315
Репутация
19
CreatoR [?]
А зачем там "$" перед именем переменной?

Потому, что далее в скрипте будет использоваться переменная $modecomp

madmasles, так а почему она пустая? Я же ее переопределяю далее:
Код:
Assign ($lineP[1], $lineP[2], 2)

NoMad73rus [?]
Не нужно добавлять $ к имени, это за вас сделает Assign
Понял, спасибо, все заработало.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Если с $:
Код:
$modecomp = ''
$sLine_1 = 'modecomp'
$sLine_2 = 'gora'
$modecomp = $sLine_1
Assign($sLine_1, $sLine_2, 2)
MsgBox(64, '', '$modecomp=' & $modecomp)
 

SyDr

Сидра
Сообщения
651
Репутация
158
gora
Вы надо мной издеваетесь? Разве нельзя в качестве параметров функций использовать непосредственно переменные, а не строковые константы? Я ведь просто показал пример применения функций.
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Не могу говорить о правильности архитектуры скриптов AutoIt - я в нем сам из новеньких...
но смело могу вас заверить что в более низкоуровневых языках таких как C++ или C# вообще отсутсвует возможность програмно создавать сингулярные переменные, а в более высокоуровневых таких как Python, Ruby ; где любая переменная это сущьность (объект в принципе) ;
Такая практика не приветсвуется и считается крайне ненадежной...
Если затронуть культуру кода... то есть такое негласное правило - Объявлять все действующие переменные еще перед полезным кодом...
 
Верх