Что нового

учусь работать с массивами и координатами

  • Автор темы dreamorder
  • Дата начала
D

dreamorder

Гость
Доброго времени суток гос-да.
Не смотря на то, что с Autoit знаком уже давно, с массивами ещё не разобрался до конца.
Собственно по этому и прошу о помощи с простой задачей.
Мой (не молодой, пропитый) ум :smile: легче воспринимает примеры скрипта с пояснениями в строках для конкретной задачи,
чем отдельные описания справки Autoit. На программиста то я не учился :(

для примера:
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 615, 438, 192, 124)
$Label1 = GUICtrlCreateLabel("          ", 40, 40, 34, 17, $WS_BORDER)
$Label2 = GUICtrlCreateLabel("          ", 40, 64, 34, 17, $WS_BORDER)
$Label3 = GUICtrlCreateLabel("          ", 40, 88, 34, 17, $WS_BORDER)
$Label4 = GUICtrlCreateLabel("          ", 40, 112, 34, 17, $WS_BORDER)
$Label5 = GUICtrlCreateLabel("          ", 40, 136, 34, 17, $WS_BORDER)
$Label6 = GUICtrlCreateLabel("          ", 80, 40, 34, 17, $WS_BORDER)
$Label7 = GUICtrlCreateLabel("          ", 80, 64, 34, 17, $WS_BORDER)
$Label8 = GUICtrlCreateLabel("          ", 80, 88, 34, 17, $WS_BORDER)
$Label9 = GUICtrlCreateLabel("          ", 80, 112, 34, 17, $WS_BORDER)
$Label10 = GUICtrlCreateLabel("          ", 80, 136, 34, 17, $WS_BORDER)
$Label11 = GUICtrlCreateLabel("          ", 120, 40, 34, 17, $WS_BORDER)
$Label12 = GUICtrlCreateLabel("          ", 120, 64, 34, 17, $WS_BORDER)
$Label13 = GUICtrlCreateLabel("          ", 120, 88, 34, 17, $WS_BORDER)
$Label14 = GUICtrlCreateLabel("          ", 120, 112, 34, 17, $WS_BORDER)
$Label15 = GUICtrlCreateLabel("          ", 120, 136, 34, 17, $WS_BORDER)
$Label16 = GUICtrlCreateLabel("          ", 160, 40, 34, 17, $WS_BORDER)
$Label17 = GUICtrlCreateLabel("          ", 160, 64, 34, 17, $WS_BORDER)
$Label18 = GUICtrlCreateLabel("          ", 160, 88, 34, 17, $WS_BORDER)
$Label19 = GUICtrlCreateLabel("          ", 160, 112, 34, 17, $WS_BORDER)
$Label20 = GUICtrlCreateLabel("          ", 160, 136, 34, 17, $WS_BORDER)
$Label21 = GUICtrlCreateLabel("          ", 200, 40, 34, 17, $WS_BORDER)
$Label22 = GUICtrlCreateLabel("          ", 200, 64, 34, 17, $WS_BORDER)
$Label23 = GUICtrlCreateLabel("          ", 200, 88, 34, 17, $WS_BORDER)
$Label24 = GUICtrlCreateLabel("          ", 200, 112, 34, 17, $WS_BORDER)
$Label25 = GUICtrlCreateLabel("          ", 200, 136, 34, 17, $WS_BORDER)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd


Очень большая просьба, уважаемые программисты, покажите пожалуйста пример скрипта ( с подробными пояснениями к строкам),
где все элементы окна GUI будут в массиве, но самое главное с конкретно заданными координатами :blink:
к примеру левый верхний $label1 по координатам (33,5) и размером 20 х 10 пикселей, остальные по сетке
через 3 пикселя, такого же размера.


Заранее спасибо всем кто откликнется на эту просьбу.
 

Latoid

Знающий
Сообщения
95
Репутация
11
Код:
#include <GUIConstantsEx.au3>
#include <Array.au3> ; только для демонстрации

$Form1 = GUICreate("Form1", 615, 438, 192, 124)

Local $aLabels[10] ; объявляем пустой пока массив, содержащий 10 элементов; нумерация элементов начинается с нуля, заканчивается, соответственно 9
_ArrayDisplay ($aLabels, "Демонстрация пустого массива") ; демонстрация пустого массива

; запускаем цикл, что пробежит от 0 до 'Размерность массива - 1', т.е. от 0 до 9
; на каждой итерации цикл отрисует Label, с текстом "Label цифра", с координатами: 
;~ от левого края окна - 33 пиксела
;~ с верхнего края окна - для каждого Label по-разному:
;~ 			для 0-левой итерации - (5 + 25)*0+10 = 10 пикселов от верхнего края окна
;~ 			для 1-ой итерации - (5 + 25)*1+10 = 40 пикселов от верхнего края окна
;~ 			для 2-ой итерации - (5 + 25)*2+10 = 70 пикселов от верхнего края окна
;~ 			и т.д.
; ширина всех Label - 200 пикселов
; высота всех Label - 20 пикселов
;~ В массив записываем уникальный идентификатор каждого Label, чтоб вспоследствии к ним можно было обращаться

For $i = 0 to UBound ($aLabels) -1 
	$aLabels[$i] = GUICtrlCreateLabel ("Label " & $i, 33, (5 + 25)*$i+10, 200, 20)
Next

_ArrayDisplay ($aLabels, "Демонстрация заполненного массива, содежащего идентификаторы Label'ов ") ; демонстрация заполненного массива, содежащего идентификаторы Label'ов 

GUISetState(@SW_SHOW) ; покажем что вышло 
Sleep (1000) ; подождем секунду

GUICtrlSetData ($aLabels[5], "Текст этого Label'а изменен!") ; изменим текст Label'а №5 (или №6, если считать с единицы), обратившись к его идентификатору в массиве

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

    EndSwitch
WEnd
 
Автор
D

dreamorder

Гость
Latoid
Огромное спасибо за пример, почти всё ясно, есть ещё пара вопросов ...

Код:
For $i = 0 to UBound ($aLabels) -1 ; почему именно -1 а не 9 ?
    $aLabels[$i] = GUICtrlCreateLabel ("Label " & $i, 33, (5 + 25)*$i+10, 200, 20) ; откуда цифры 5+25 ?
Next


а как тогда будет выполнено к примеру 120 столбиков по 100 строк?
тут в Вашем примере только в 1 столбик :-\


Добавлено:
Сообщение автоматически объединено:

Код:
Local $aArray[10][5]
Local $iRows = UBound($aArray, 1) ; Обще количество строк. В данном примере 10.
Local $iCols = UBound($aArray, 2) ; Обще количество колонок. В данном примере 5.


тут всё понятно, но я никак не пойму как сделать сетку координат,
из примера Latoid узнал как задать координаты только для 1го столбца массива. :blink:
 

Latoid

Знающий
Сообщения
95
Репутация
11
For $i = 0 to UBound ($aLabels) -1 ; почему именно -1 а не 9 ?
Оператор Ubound показывает размерность массива. Если в нем 10 элементов, то Ubound = 10. Но! Нумерация этих элементов начинается с нуля. Т.е. первый элемент имеет номер ноль, последний - номер 9. Здесь мы создаем цикл, что переберет числа от 0 до 10-1, т.е. до 9, на каждой итерации цикла мы будем рисовать Label, его идентификатор писать в массив $aLabels, чтоб впоследствии к ним можно было обращаться (менять текст, шрифт, координаты, да многое чего с ними можно сделать, если знаешь их идентификаторы)

Мы не можем просто написать For $i = 0 to 9 поскольку, а вдруг мы захотим изменить размерность массива? В моем варианте кода это потребует только одной правки строки Local $aLabels[10], тогда как в твоем варианте придется изменять 2 строки:
Local $aLabels[10]
и
For $i = 0 to 9


$aLabels[$i] = GUICtrlCreateLabel ("Label " & $i, 33, (5 + 25)*$i+10, 200, 20) ; откуда цифры 5+25 ?
5+25 = 30. Т.е. каждый следующий Label стоит ниже предыдущего на 30 пикселов. Высота каждого Label - 20 пикселов + 10 - промежуток между ними.

а как тогда будет выполнено к примеру 120 столбиков по 100 строк?
тут в Вашем примере только в 1 столбик
Ну, 120*100 - это как-то многовато. В окне не поместятся. Вот пример 3*18. Другую размерность по аналогии можно сделать.

Код:
#include <GUIConstantsEx.au3>
#include <Array.au3> ; только для демонстрации

$Form1 = GUICreate("Form1", 615, 550, 192, 124)

Local $aLabels[54] ; объявляем пустой пока массив, содержащий 54 элементов; нумерация элементов начинается с нуля, заканчивается, соответственно 53
_ArrayDisplay ($aLabels, "Демонстрация пустого массива") ; демонстрация пустого массива

$iRowNum = 0 ; счетчик строк в каждой колонке, начинаем с нуля
$iColNum = -1 ; счетчик колонок, начинаем с -1

For $i = 0 to UBound ($aLabels) -1 ; запускаем цикл, что пробежит от 0 до 'Размерность массива - 1', т.е. от 0 до 53; на каждой итерации переменная $i будет увеличиваться на единицу
	If Mod ($i, 18) = 0 Then ; тут проверка: если $i делится без остатка на 18 (это условие сработает, когда $i будет равно 0, 18, 36, т.е. трижды); то пора строить новую колонку, для этого:
		$iRowNum = 0 ; обнуляем счетчик строк
		$iColNum += 1 ; счетчик колонок увеличиваем на единицу
	 Else ; Если $i не делится без остатка на 18, то начинать новую колонку не надо, т.е. просто
		$iRowNum += 1 ; увеличиваем счетчик строк на единицу
	EndIf
	
;~ 	Рисуем Label'ы
	;~ координата от левого края окна - 200*$iColNum+33, т.е. 
;~ 		для 1-ой колонки 200*0+33 = 33 пиксела от левого края
;~ 		для 2-ой колонки 200*1+33 = 233 пиксела от левого края
;~ 		для 3-ей колонки 200*2+33 = 433 пиксела от левого края
	
	;~ координата от верхнего края окна - 30*$iRowNum+10, т.е. 
;~ 		Для 1-ой строки в каждой колонке 30*0+10 = 10 пикселов от верхнего края окна
;~ 		Для 2-ой строки в каждой колонке 30*1+10 = 40 пикселов от верхнего края окна
;~ 		Для 3-ей строки в каждой колонке 30*2+10 = 70 пикселов от верхнего края окна
;~ 		и т.д.
	
	;~ Ширина Label'a - 200 пикселов
	;~ Высота Label'а - 20 пикселов
	
	$aLabels[$i] = GUICtrlCreateLabel ("Label " & $i, 200*$iColNum+33, 30*$iRowNum+10, 200, 20) ;~ В массив $aLabels записываем уникальный идентификатор каждого Label, чтоб вспоследствии к ним можно было обращаться
Next


_ArrayDisplay ($aLabels, "Демонстрация заполненного массива, содежащего идентификаторы Label'ов ") ; демонстрация заполненного массива, содежащего идентификаторы Label'ов 

GUISetState(@SW_SHOW) ; покажем что вышло 
Sleep (2000) ; подождем 2 секунды

GUICtrlSetData ($aLabels[5], "Текст этого Label'а изменен!") ; изменим текст Label'а №5 (или №6, если считать с единицы), обратившись к его идентификатору в массиве

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd
 
Автор
D

dreamorder

Гость
Latoid

Ещё раз огромное спасибо! :ok:
Вы очень хорошо всё пояснили.
:beer:

P.S. вот ещё нашёл на форуме пример и вырезал из него нужное мне:
Код:
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

$hForm = GUICreate('MyGUI', 777, 281)
Dim $Array[2000][2]
For $y = 0 To 19
    For $x = 0 To 99
        $Array[$x + 20 * $y][0] = GUICtrlCreateLabel('', 33 + 7 * $x, 11 + 7 * $y, 5, 5)
        GUICtrlSetBkColor(-1, 0x000000)
    Next
Next


$Prev = 0
GUICtrlSetState($Array[$Prev][0], $GUI_CHECKED)
GUISetState()


While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case Else
            For $i = 0 To UBound($Array) - 1
                If $Msg = $Array[$i][0] Then
                    $Prev = $i
                    ExitLoop
                EndIf
            Next
    EndSwitch
WEnd


:IL_AutoIt_1:
 
Верх