Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Вызов одной формы из другой (http://forum.oszone.net/showthread.php?t=267694)

eus_deus 08-09-2013 13:03 2214554

Вызов одной формы из другой
 
Всем привет! Следующий вопрос - как вызвать одну форму из другой, чтобы обе формы взаимно видели элементы друг друга. Я думал, чтобы не загромождать код двумя формами, разделить его и вызывать по необходимости. Дошел только до #include одного скрипта в другой. Думал, будет как по аналогии с бейсиком - форма1.Поле1=Форма2.Поле1... ну как то так, давно это было... Или это не возможно в принципе?

Creat0R 08-09-2013 21:55 2214749

Цитата:

Цитата eus_deus
как вызвать одну форму из другой, чтобы обе формы взаимно видели элементы друг друга »

Как то так:

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hForm1 = GUICreate('Form1', 300, 200, 100, 100)
$hForm2 = GUICreate('Form2', 300, 200, 450, 100)

$aForm1_Elements = _FormElements($hForm1)
$aForm2_Elements = _FormElements($hForm2)

GUISetState(@SW_SHOW, $hForm1)
GUISetState(@SW_SHOW, $hForm2)

While 1
    $iMsg = GUIGetMsg()

    Switch $iMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $aForm1_Elements[1] To $aForm1_Elements[$aForm1_Elements[0]]
            MsgBox(64, 'Event', 'Event from element (' & GUICtrlRead($iMsg, 1) & ') in form 1', 0, $hForm1)
        Case $aForm2_Elements[1] To $aForm2_Elements[$aForm2_Elements[0]]
            MsgBox(64, 'Event', 'Event from element (' & GUICtrlRead($iMsg, 1) & ') in form 2', 0, $hForm2)
    EndSwitch
WEnd

Func _FormElements($hForm)
    GUISwitch($hForm)

    Local $aRet[3] = [2]

    $aRet[1] = GUICtrlCreateButton('Button1', 20, 20, 60, 20)
    $aRet[2] = GUICtrlCreateButton('Button2', 20, 40, 60, 20)

    Return $aRet
EndFunc


eus_deus 08-09-2013 22:00 2214752

Creat0R, общую суть вроде уловил. попробую переделать код. надо, чтобы второе окно появлялось по необходимости при нажатии на кнопку

Creat0R 08-09-2013 22:45 2214768

Цитата:

Цитата eus_deus
надо, чтобы второе окно появлялось по необходимости при нажатии на кнопку »

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hForm1 = GUICreate('Form1', 300, 200, 100, 100)
$iShowForm2_Bttn = GUICtrlCreateButton('Show Form2', 20, 170, 90, 20)
$aForm1_Elements = _FormElements($hForm1)

$hForm2 = GUICreate('Form2', 300, 200, 450, 100)
$aForm2_Elements = _FormElements($hForm2)

GUISetState(@SW_SHOW, $hForm1)

While 1
    $aMsg = GUIGetMsg(1)

    Switch $aMsg[0]
        Case $GUI_EVENT_CLOSE
            If $aMsg[1] = $hForm1 Then
                Exit
            Else
                ContinueCase ;To trigger next state
            EndIf
        Case $iShowForm2_Bttn
            If GUICtrlRead($iShowForm2_Bttn) = 'Show Form2' Then
                GUICtrlSetData($iShowForm2_Bttn, 'Hide Form2')
                GUISetState(@SW_SHOW, $hForm2)
            Else
                GUICtrlSetData($iShowForm2_Bttn, 'Show Form2')
                GUISetState(@SW_HIDE, $hForm2)
            EndIf
        Case $aForm1_Elements[1] To $aForm1_Elements[$aForm1_Elements[0]]
            MsgBox(64, 'Event', 'Event from element (' & GUICtrlRead($aMsg[0], 1) & ') in form 1', 0, $hForm1)
        Case $aForm2_Elements[1] To $aForm2_Elements[$aForm2_Elements[0]]
            MsgBox(64, 'Event', 'Event from element (' & GUICtrlRead($aMsg[0], 1) & ') in form 2', 0, $hForm2)
    EndSwitch
WEnd

Func _FormElements($hForm)
    GUISwitch($hForm)

    Local $aRet[3] = [2]

    $aRet[1] = GUICtrlCreateButton('Button1', 20, 20, 60, 20)
    $aRet[2] = GUICtrlCreateButton('Button2', 20, 40, 60, 20)

    Return $aRet
EndFunc


eus_deus 08-09-2013 22:52 2214772

Creat0R, ну ты прямо бог autoit'a. Добей меня уже тогда - а если нужны разные контролы на форме, то как их прописать в функцию Func _FormElements($hForm)? Назначение формы - форма настройки. Вроде не нужна на экране постоянно, но в то же время ее наличие необходимо

Creat0R 08-09-2013 23:54 2214791

Цитата:

Цитата eus_deus
а если нужны разные контролы на форме »

То это уже другая тема.
Ты определись что тебе нужно, в первом сообщении спрашивается о синхронизации элементов в разных формах, теперь уже речь идёт о другом.

Может лучше опишешь задачу, чтобы был понятен конечный результат?

eus_deus 09-09-2013 12:00 2214954

Цитата:

Цитата eus_deus
чтобы обе формы взаимно видели элементы друг друга »

это вроде не синхронизация... я подразумевал, что по действиям контролов первой формы что то изменится на контролах второй и наоборот. но контролы разные. прошу прощения за не внесение ясности в вопрос

eus_deus 09-09-2013 12:17 2214964

в принципе вопрос решен. мне нужно было только понятие того, что весь код будет в одном модуле, а не в разных, как я это строил. помог код для кнопки
Код:

Case $iShowForm2_Bttn
            If GUICtrlRead($iShowForm2_Bttn) = 'Show Form2' Then
                GUICtrlSetData($iShowForm2_Bttn, 'Hide Form2')
                GUISetState(@SW_SHOW, $hForm2)
            Else
                GUICtrlSetData($iShowForm2_Bttn, 'Show Form2')
                GUISetState(@SW_HIDE, $hForm2)
            EndIf

дело за малым - как при закрытии второй формы по крестику, не закрывать первую?

Creat0R 09-09-2013 12:49 2214978

Цитата:

Цитата eus_deus
как при закрытии второй формы по крестику, не закрывать первую? »

За обработку закрытия отвечает Case $GUI_EVENT_CLOSE, в последнем примере как раз вторя форма прячется не закрывая весь скрипт.

eus_deus 09-09-2013 13:09 2214990

Creat0R, вопросов нет. по крайней мере, не в этой теме. Здесь вопрос решен


Время: 12:57.

Время: 12:57.
© OSzone.net 2001-