Что нового

[Элементы GUI] как правильно создать дополнительные элементы GUI

proteus86

Новичок
Сообщения
9
Репутация
0
Здравствуйте! Давно меня интересовал ворос создания элементом GUI ранее не описанных и не предусмотренных в программе.
Есть заготовка окна.
При нажатии кнопки BeginClick создается еще одна вкладка.Вопрос в том как правильно в таком случае вытаскивать данные со всех вкладок и как поступатьс функциями обработки нажатия кнопок? Нашел функцию Assign .Только с ее помощью можно создавать ранее не созданные гуи элементы в программе.
И вообще посоветуйте как правильно организовывать создание ранее не предусмотренных гуи элементов в программе. Что делать с переменными как вытягивать данные из вновь созданных элементов.
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=C:\Documents and Settings\master\Рабочий стол\мои проэкты\инфа\koda_1.7.3.0\Forms\Form1.kxf
$Form1 = GUICreate("Form1", 882, 442, 211, 135)
$MenuItem3 = GUICtrlCreateMenu("настройки")
$MenuItem6 = GUICtrlCreateMenuItem("MenuItem6", $MenuItem3)
$MenuItem5 = GUICtrlCreateMenuItem("MenuItem5", $MenuItem3)
$MenuItem2 = GUICtrlCreateMenu("")
$MenuItem1 = GUICtrlCreateMenu("")
$MenuItem4 = GUICtrlCreateMenu("вход")
$MenuItem7 = GUICtrlCreateMenuItem("Выход", $MenuItem4)
$Tab = GUICtrlCreateTab(8, 8, 849, 385)
$TabSheet1 = GUICtrlCreateTabItem("AMMY")
$ID = GUICtrlCreateInput("id", 25, 74, 121, 21)
$phone = GUICtrlCreateInput("phone", 161, 74, 121, 21)
$ammy = GUICtrlCreateInput("ammy", 289, 74, 121, 21)
$password = GUICtrlCreateInput("password", 425, 74, 121, 21)
$problemm = GUICtrlCreateEdit("", 32, 120, 521, 153)
GUICtrlSetData(-1, "problemm")
$NewTab = GUICtrlCreateButton("NewTab", 672, 88, 75, 25)
GUICtrlSetOnEvent(-1, "NewTabClick")
$Begin = GUICtrlCreateButton("Begin", 672, 136, 75, 25)
GUICtrlSetOnEvent(-1, "BeginClick")
$End = GUICtrlCreateButton("End", 680, 184, 75, 25)
GUICtrlSetOnEvent(-1, "EndClick")
GUICtrlCreateTabItem("")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
 Sleep(100)
WEnd

Func BeginClick()
GUICtrlCreateTabItem("AMMY")
GUICtrlCreateInput("id", 25, 74, 121, 21)
 GUICtrlCreateInput("phone", 161, 74, 121, 21)
GUICtrlCreateInput("ammy", 289, 74, 121, 21)
GUICtrlCreateInput("password", 425, 74, 121, 21)
GUICtrlCreateEdit("", 32, 120, 521, 153)
GUICtrlSetData(-1, "problemm")
GUICtrlCreateButton("NewTab", 672, 88, 75, 25)
GUICtrlSetOnEvent(-1, "NewTabClick")
GUICtrlCreateButton("Begin", 672, 136, 75, 25)
GUICtrlSetOnEvent(-1, "BeginClick")
GUICtrlCreateButton("End", 680, 184, 75, 25)
GUICtrlSetOnEvent(-1, "EndClick")
GUICtrlCreateTabItem("")
GUISetState(@SW_SHOW)
EndFunc
Func EndClick()

EndFunc
Func NewTabClick()

EndFunc
 

erlik

Продвинутый
Сообщения
317
Репутация
84
proteus86
Сложности тут большой нет (только причем тут Assign так и не понял, ни разу эта функция не пригодилась). Создать новый элемент можно(а зачастую и нужно) в любой момент работы скрипта, динамически. Примеры как есть, наверно, в большинстве программ выложенных здесь в разделе рабочих проектов. В моей программе OperaHistory есть, например, вкладка Tab'а 'Настройки', а в ней TreeView c пунктами\разделами настроек, элементы которых отображаются в правой части от TreeView на клик того или иного пункта. Таким образом получаем минимум рабочего пространства для кучи настроек, все элементы правой части создаются и удаляются динамически после клика на новый пункт. А идентификаторы контролов пишутся в специальный массив $aSettings.
Если ты создаешь элемент, с которым в дальнейшем будешь работать - получать от него данные, события и т.д., то значит нужно\желательно, где то сохранять его идентификатор\хендел. Сохранять можно просто в глобальных (для доступа из вне функции) переменных, но если элементов много, то стоит подумать о создании глобального массива, куда и писать нужные идентификаторы\данные. Вариант с массивом лично для меня предпочтительней, так как это зачастую просто удобнее: можно потом простым циклом и удалить элементы или чего-нибудь другое сделать с ними в массовом порядке.
PS: В любом случае тебе стоит глянуть примеры скриптов, где элементы создаются динамически, чтобы понять сам принцип их создания и работы с ними.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
proteus86
Используй GUISwitch. Там пример есть показывающий добавление кнопки. Кроме переключения окон используется именно для создания новых элементов на вкладках. Не забывай закрывать добавление, все как в примере и описании.
 
Автор
P

proteus86

Новичок
Сообщения
9
Репутация
0
Спасибо за комментарии теперь я немного представляю как создавать новые кнопки и формы !
буду пробовать.


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

Попытался разобраться в приведенном примере программы опера хистори (нашел еще и сборку с кучей готовых скриптов) но там столько много кода что :stars: есть возможность у знатоков накидать манюсенький пример кода создания динамической формы\таба с кнопками функциями обработки кнопок и вытаскиванием инфы из элементоф гуи
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
proteus86
Пример писать лень, но могу на словах: В главный цикл опроса новый под-Case не вставить. Поэтому при добавлении элемента нужно использовать массив с количеством элементов в первом [0 ] элементе массива. Если вы хотите добавить новый элемент, то увеличиваете массив и добавляете новый идентификатор. В главном цикле запускаешь цикл For по количеству элементов массива и уверенно получишь событие от любого идентификатора, потому что For пройдётся по всем элементам массива, сколько бы он не увеличивался.
 
Верх