Что нового

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

AZJIO

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

proteus86

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


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

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

AZJIO

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