Что нового

Как создать шаблон массива

Сообщения
80
Репутация
-1
Нужно создать шаблон примерно известной размерности.

Длинна массива неизвестна, значения дефолтные и скорее временные.
Данные будут загружаться после из настроек.

Пока нашёл такое решение, есть вариант проще ?
В том плане что сначало объявлять, а потом задавать как уж размашисто.
Код:
Dim $windowTabs=2 ; значение из настроек

Dim $info[$windowTabs+1],$mpath[$windowTabs+1],$name[$windowTabs+1]

For $i = 0 To $windowTabs
   $info[$i] = "tabs " & $i
   $mpath[$i] = "/dir" & $i
   $name[$i] = "file"
Next

_loadini() ; загрузка настроек
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Вы можете объявить массив "0" размера и при необходимости внести данные увеличиваете размер массива при помощи
Код:
ReDim
 
Автор
W
Сообщения
80
Репутация
-1
Оно вроде работает, но когда на массиве весь GUI держится, при попытке его увеличения он падает.
Скрипт большой, файлов дофига, суть примерно такая
Код:
$windowTabs=4 ;объявляю переменную

; внезапно костыль
Select ;читаю его из ini на случай если он больше
Case FileExists($myini)
_readTab()
EndSelect

Func _readTab()
   $windowTabs = IniRead ($myini,"system","tabs", 1)
   If $windowTabs > 15 Then $windowTabs = 15
EndFunc

Global $info[$windowTabs+1],$server[$windowTabs+1] ; вот только теперь объявляю массивы

Func _iniLoad() ; читаю  настройки
Select
   Case FileExists($myini)
_readTab()

   For $i = 0 To $windowTabs
Local $process = "pro"
$info[$i] = IniRead ($myini,$process & $i,"info", $i)
If $info[$i] = "" Then $info[$i] = $i  ; ещё портянка
$server[$i] = IniRead ($myini,$process & $i,"server", Null) ;куча переменных
;...
  Next

Case Else
   _iniSave() ; если ini файла нет, создаст с дефолтным $windowTabs=4
EndSelect
EndFunc
и это даже работало пока не потребовалось менять это на ходу.

Код:
Opt("GUIOnEventMode", 1)
Global $iBtnStart[$windowTabs+1] ; показалось что перед ним стоило сделать _iniLoad() , но не суть
_iniLoad(); загружаю настройки с прошлого файла

_Main()

While 1
Sleep(10)
WEnd

Func _Main()
$hGUI = GUICreate($NameGUI & " " & $version & $nGUI,$WWidth,$WHeight)
GUISetOnEvent($GUI_EVENT_CLOSE, '_ProExit', $hGUI)

$iTab = GUICtrlCreateTab(5, 5, $WWidth-10, $WHeight-10) 
GUICtrlCreateTabItem("Статичная вкладка")

$btnST = GUICtrlCreateButton("Настройки", 494, $WHeight-66, 150, 40)
GUICtrlSetOnEvent(-1, "btnST") ; создаёт окно настроек

For $t = 0 To $windowTabs
GUICtrlCreateTabItem($info[$t]) ; Вкладки

;одинаковые элементы на вкладках
$iBtnStart[$t] = GUICtrlCreateButton("Старт", 14, $THeight+35 , 80, 25, $BS_DEFPUSHBUTTON)
GUICtrlSetOnEvent(-1, "StartPressed")

Next
GUISetState(@SW_SHOW, $hGUI)
EndFunc

Func btnST() ; окно настроек

GUICtrlCreateButton("Сохранить и выйти", 23, 32, 120, 30)
GUICtrlSetOnEvent(-1, "SetsSave")

$stTabs = GUICtrlCreateInput($windowTabs+1, $snTabs1, $snTabs2, 40, 20); настройка параметра

GUISetState(@SW_SHOW)
EndFunc


Func SetsClose(); закрыть окно настроек
GUIDelete(@GUI_WinHandle);@GUI_WinHandle ;$hSETUP
WinSetState ( $hGUI, Null, @SW_ENABLE )
WinSetState ( $hGUI, Null, @SW_SHOW )
WinActivate ( $hGUI, Null )
EndFunc

Func SetsSave()
   $windowTabs = GUICtrlRead($stTabs)-1

   _iniSave()
; и вот тут GUI падает
   SetsClose()
EndFunc
Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$iBtnStart[$t] = GUICtrlCreateButton("?????", 14, $THeight+35 , 80, 25, $BS_DEFPUSHBUTTON)
^ ERROR

Я так понял пока _Main работает в нём уже объявлен размер, так что подобные костыли не работают
Код:
Func SetsSave()
   $windowTabs = GUICtrlRead($stTabs)-1

   _iniSave()

_reDimTbs()

   SetsClose()
EndFunc

Func _reDimTbs()
ReDim $info[GUICtrlRead($stTabs)]
ReDim $server[GUICtrlRead($stTabs)]
;...
EndFunc

Пока из решений вижу только временную переменную из которой будет писатся в настройку или сразу писать в настройку не применяв этот параметр, а прогу потом перезапускать из файла.
Наверно так даже лучше, redim стирает настройки в файле
 
Верх