Что нового

Передача переменой в функцию.

Ярополк

Новичок
Сообщения
9
Репутация
0
Вопрос в следующем - как передать переменную в функцию чтобы переменная изменялась внутри цикла. Т.е у меня будет много кнопок, и каждая передает свой график на GUI, но, код внутри кнопок этих очень похож. Для того чтобы не захламлять код, я хочу создать одну универсальную функцию, куда можно будет передавать различные данные радиуса, радиан и т.д которые должны будут пересчитываться в этой переданной функции. У меня получается только передать одно значение в функцию, но внутри цикла этой функции оно не пересчитывается остается одним и тем же. В данном случае, нужно передать в функцию радиус архимеда так, чтобы он изменялся каждый цикл внутри созданной функции, но, допустим другая кнопка, будет вырисовывать другую фигуру, у нее уже радиус будет совсем другой и радианы другие, и точно так же эти значения должны будут пересчитываться в цикле. Т.е переменную передали, но в ней же должен происходить перерасчет другой переменной.

AutoIt код:
#include <GUIConstants.au3>
#include <Misc.au3>

$a = 0.3
$k2 = 800
$k=3
$Form = GUICreate ("ZipTechnology (С).",($k2+1),($k2+1), -1, -1,  -1, $WS_CLIPCHILDREN)
;WinSetTrans($Form, "", 150)
$Button = GUICtrlCreateButton("№1", 10, 10, 130, 30)
$Button1 = GUICtrlCreateButton("№2", 160, 10, 130, 30)
$Button2 = GUICtrlCreateButton("The spiral of Archimedes.", 310, 10, 130, 30)
$Dlina = GUICtrlCreateInput ($a, 290, 15, 20, 20, -1)
$Button3 = GUICtrlCreateButton("№4", 460, 10, 130, 30)
$Dlina2 = GUICtrlCreateInput ($k, 440, 15, 20, 20, -1)
$Button4 = GUICtrlCreateButton("Random", 620, 10, 130, 30)

$Yu = GUICtrlCreateGraphic((($k2/2)+1),(($k2/2)+1))

GUICtrlSetGraphic(-1, $GUI_GR_MOVE, 0, 0)
GUISetState()


While 1
    $msg = GUIGetMsg()
         Switch $msg
         Case $GUI_EVENT_CLOSE
            Exit
         Case $Button2
         $r = 0
         $rad = 0
         GUICtrlDelete($Yu)
         $Yu = GUICtrlCreateGraphic((($k2/2)+1),(($k2/2)+1))
         GUICtrlSetGraphic(-1, $GUI_GR_MOVE, 0, 0)
         $peredacha = GUICtrlRead($Dlina) ; передаем эту переменную в функцию ниже (она будет вместо цикла

         For $i = 0 to 2000 Step +1
         GUIRegisterMsg($WM_ERASEBKGND, "WM_ERASEBKGND")
         GUISetState()
         $r += GUICtrlRead($Dlina)
         $x=Cos($rad)*$r
         $y=Sin($rad)*$r
         GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 1)                           ;ВОТ ЗДЕСЬ БУДЕТ ФУНКЦИЮ КУДА ПЕРЕДАЛИ т.е figura($peredacha))
         GUICtrlSetGraphic(-1, $GUI_GR_PENSIZE, 3)
         GUICtrlSetGraphic(-1, $GUI_GR_LINE, -$y, +$x)
         GUICtrlSetGraphic(-1, $GUI_GR_REFRESH)
         $rad += 0.1
         if _IsPressed('01') Then
         ExitLoop
         EndIf
         Next

   EndSwitch
         GUIRegisterMsg($WM_ERASEBKGND, "")
      WEnd

Func WM_ERASEBKGND()
  Return 0
EndFunc

Func figura($R)

            GUICtrlDelete($Yu)
         $Yu = GUICtrlCreateGraphic((($k2/2)+1),(($k2/2)+1))
         GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 1)
         GUICtrlSetGraphic(-1, $GUI_GR_PENSIZE, 3)
         GUICtrlSetGraphic(-1, $GUI_GR_MOVE, 0, 0)

         For $i = 0 to 1500 Step +1
         GUIRegisterMsg($WM_ERASEBKGND, "WM_ERASEBKGND")
         GUISetState()
         ;сюда передали то, что должно изменяться.
         ;$r += $R
         $x=Cos($rad)*$r
         $y=Sin($rad)*$r                                                  ;ФУНКЦИЯ КОТОРАЯ ДОЛЖНА ВЫСЧИТЫВАТЬ ВСЕ ДАННЫЕ КОТОРЫЕ ПЕРЕДАЛИ.
         GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 1)
         GUICtrlSetGraphic(-1, $GUI_GR_PENSIZE, 3)
         GUICtrlSetGraphic(-1, $GUI_GR_LINE, -$y, +$x)
         GUICtrlSetGraphic(-1, $GUI_GR_REFRESH)
         $rad += 0.01   ;эта переменная должна изменяться в переменной $r т.к в ней она с каждым разом меняется на 0.01
         if _IsPressed('01') Then
         ExitLoop
      EndIf
   Next
EndFunc
Сообщение автоматически объединено:
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Вы либо используйте возвращаемое значение функции через Return, либо используйте ключевое слово ByRef чтобы передавать переменную по ссылке.
Код:
ByRef

Только в Вашем случае проблема в том, что просто так значения в полях не меняются, а должны быть установлены через
Код:
GUICtrlSetData
 
Автор
Я

Ярополк

Новичок
Сообщения
9
Репутация
0
Вы либо используйте возвращаемое значение функции через Return, либо используйте ключевое слово ByRef чтобы передавать переменную по ссылке.
Код:
ByRef

Только в Вашем случае проблема в том, что просто так значения в полях не меняются, а должны быть установлены через
Код:
GUICtrlSetData
Какой Return ? если это должно происходить в каждом новой цикле, на сколько знаю Return возвращает по окончанию использования функции. А мне нужно чтобы каждый цикл возвращал в оригинал новое значение $rad. Если это можно сделать через обновления "элементов" GUICtrlSetData то как ?
 
Верх