purebasic.info

PureBasic forum
Текущее время: Сб окт 20, 2018 1:09 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Пн июл 31, 2017 3:13 pm 
Не в сети
доцент

Зарегистрирован: Ср апр 28, 2010 4:02 pm
Сообщений: 49
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
С выходом 5-ой версии PureBasic встроенный редактор форм значительно преобразился в лучшую сторону. Однако как правильно с ним работать для меня лично осталось загадкой.

В редакторе легко можно расположить как удобно элементы формы, сделать к ним подписи, установить флаги, и т. д. Результатом работы редактора является файл *.pbf примерно следующего содержания
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
;
; This code is automatically generated by the FormDesigner.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures needs to be put in another source file.
;
 
Enumeration FormWindow
  #Window_0
EndEnumeration
 
Enumeration FormGadget
  #Text_0
  #Button_0
  #Text_1
  #Button_1
EndEnumeration
 
 
Procedure OpenWindow_0(x = 0, y = 0, width = 210, height = 70)
  OpenWindow(#Window_0, x, y, width, height, "", #PB_Window_SystemMenu)
  TextGadget(#Text_0, 10, 10, 80, 20, "Строка 0")
  ButtonGadget(#Button_0, 100, 10, 100, 20, "Кнопка 0")
  TextGadget(#Text_1, 10, 40, 80, 20, "Строка 1")
  ButtonGadget(#Button_1, 100, 40, 100, 20, "Кнопка 1")
EndProcedure
 
Procedure Window_0_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #False
 
    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect
 
    Case #PB_Event_Gadget
      Select EventGadget()
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure
 
 


Файл можно подключить к проекту и загружать его содержимое с помощью (X)IncludeFile. Но это не имеет практической ценности, т.к. вызов "OpenWindow_0(x = 0, y = 0, width = 210, height = 70)" крайне неудобен, про потребность в Window_0_Events(event) вообще молчу - есть более годный способ обработки событий, использовать BindEvent(), BindGadgetEvent() и др..
Может быть где-то есть свежий мануал "Академического" стиля? Или быть может шаблоны редактора можно менять?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн июл 31, 2017 3:35 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11299
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Тигрёнок писал(а):
вызов "OpenWindow_0(x = 0, y = 0, width = 210, height = 70)" крайне неудобен
Чем? В код нужно добавить строку OpenWindow_0() там где следует открыть окно.
У гаджетов есть возможность задать процедуру обработки событий.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн июл 31, 2017 4:28 pm 
Не в сети
доцент

Зарегистрирован: Ср апр 28, 2010 4:02 pm
Сообщений: 49
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Что на счёт такой процедуры: простой вызов окна, процедура полностью формирует окно, в ней же заданы реакции на события.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
Procedure OpenWindow_0(Arg1, Arg2)
  If OpenWindow(#Window_0, #PB_Ignore, #PB_Ignore, 210, 70, "", #PB_Window_SystemMenu)
    TextGadget(#Text_0, 10, 10, 80, 20, "Строка 0")
    ButtonGadget(#Button_0, 100, 10, 100, 20, "Кнопка 0")
    TextGadget(#Text_1, 10, 40, 80, 20, "Строка 1")
    ButtonGadget(#Button_1, 100, 40, 100, 20, "Кнопка 1")
   
    ; BindGadgetEvent()
    ; BindGadgetEvent()
    ; BindGadgetEvent()
  EndIf
EndProcedure



Если использовать стиль задаваемый редактором ( OpenWindow_0(x = 0, y = 0, width = 210, height = 70) ), то для оформления процедуры как я описал выше придётся идти на уступки:
1) Придётся оформлять уже две процедуры с разными именами и одну вкладывать в другую:
Код:
1
2
3
4
5
 
Procedure OpenWindow_0_Run(Arg1, Arg2)
  OpenWindow_0(0, 0, 210, 70)
EndProcedure
 


2) Window_0_Events(event) не вложить в OpenWindow_0_Run(Arg1, Arg2). Придётся встраивать её в главный цикл обработки событий.
Код:
1
2
3
4
5
Repeat
  event=WaitWindowEvent()
 
  Window_0_Events(event)
ForEver


А что делать с процедурой Window_0_Events(event) если в ходе работы программы окно выполнило свою задачу и потребность в нём исчезла? Освободить цикл в таком случае не получится.

Я считаю свой вариант оформления гибче продиктованного редактором. Вот пример готовой программы:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Declare OpenWindow_Example(Title$)
Declare CloseWindow_Example()
 
Enumeration FormWindow
  #Window_Example
EndEnumeration
 
Enumeration FormGadget
  #Text_0
  #Button_0
  #Text_1
  #Button_1
EndEnumeration
 
 
Procedure OpenWindow_Example(Title$)
  If OpenWindow(#Window_Example, #PB_Ignore, #PB_Ignore, 210, 70, Title$, #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget(#Text_0, 10, 10, 80, 20, "Строка 0")
    ButtonGadget(#Button_0, 100, 10, 100, 20, "Кнопка 0")
    TextGadget(#Text_1, 10, 40, 80, 20, "Строка 1")
    ButtonGadget(#Button_1, 100, 40, 100, 20, "Кнопка 1")
 
    BindEvent(#PB_Event_CloseWindow, @CloseWindow_Example(), #Window_Example)
  EndIf
EndProcedure
 
Procedure CloseWindow_Example()
  If IsWindow(#Window_Example)
    UnbindEvent(#PB_Event_CloseWindow, @CloseWindow_Example(), #Window_Example)
   
    CloseWindow(#Window_Example)
  EndIf
EndProcedure
 
 
 
OpenWindow_Example("Пример")
 
While IsWindow(#Window_Example)
  WaitWindowEvent()
Wend
 
End



Отсюда и мой вопрос темы. Как нужно оформлять программу используя редактор чтобы сохранить гибкость?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн июл 31, 2017 4:48 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11299
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Тигрёнок писал(а):
Придётся встраивать её в главный цикл обработки событий.
Необязательно.
Код:
1
2
3
4
5
6
7
8
9
10
Procedure Window_0_Event()
  Window_0_Events(Event())
EndProcedure
 
Procedure OpenWindow_0_Run(Arg1, Arg2)
  OpenWindow_0()
  BindEvent(#PB_Event_CloseWindow, @Window_0_Event(), #Window_0)
  BindEvent(#PB_Event_Gadget, @Window_0_Event(), #Window_0)
  BindEvent(#PB_Event_Menu, @Window_0_Event(), #Window_0)
EndProcedure


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн июл 31, 2017 5:46 pm 
Не в сети
доцент

Зарегистрирован: Ср апр 28, 2010 4:02 pm
Сообщений: 49
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Не уверен что правильно понял идею, смущает вторая строчка:
Код:
1
2
3
Procedure Window_0_Event()
  Window_0_Events(Event())
EndProcedure


То есть мы добавляем ещё одну процедуру-обработчик Window_0_Event() и последовательно вплетаем её в обработку тех событий которые обрабатывает Window_0_Events(event), правильно? Должно получиться что-то такое:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
XIncludeFile "Form.pbf"
 
Procedure Window_0_Event()
  Shared event
  Window_0_Events(event)
EndProcedure
 
Procedure OpenWindow_0_Run(Arg1, Arg2)
  OpenWindow_0()
  BindEvent(#PB_Event_CloseWindow, @Window_0_Event(), #Window_0)
  BindEvent(#PB_Event_Gadget, @Window_0_Event(), #Window_0)
  BindEvent(#PB_Event_Menu, @Window_0_Event(), #Window_0)
EndProcedure
 
OpenWindow_0_Run(1, 2)
 
While IsWindow(#Window_0)
  event=WaitWindowEvent()
Wend



Выходит уже четыре процедуры против двух. Кроме того, разнообразие пуриковских событий достаточно велико (https://www.purebasic.com/documentation/window/windowevent.html), и внутри Window_0_Events(event) оно ограничивается только лишь возможностями редактора. Кроме того, не к чему вплетать обработку #PB_Event_Menu если в окне меню вообще нет. +многократно использовать BindEvent() вплетая одну и ту же процедуру для разных событий - всё равно что толпой ломиться в узкую дверь. Можно же для каждого события свой обработчик наладить.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн июл 31, 2017 6:42 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11299
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Тигрёнок писал(а):
Должно получиться что-то такое:
Где я такое написал?
Код:
1
2
3
4
5
6
7
8
9
10
Procedure Window_0_Event()
  Shared event
  Window_0_Events(event)
EndProcedure
 
;...
 
While IsWindow(#Window_0)
  event=WaitWindowEvent()
Wend

Я написал
Код:
1
2
3
Procedure Window_0_Event()
  Window_0_Events(Event())
EndProcedure

http://www.purebasic.com/documentation/ ... event.html

Тигрёнок писал(а):
Можно же для каждого события свой обработчик наладить.
Можно, но
Тигрёнок писал(а):
Выходит уже четыре процедуры против двух.
Тогда процедур будет еще больше.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн июл 31, 2017 7:15 pm 
Не в сети
доцент

Зарегистрирован: Ср апр 28, 2010 4:02 pm
Сообщений: 49
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Виноват, Event() только-только в 5.60 появилась.
Процедур возможно будет больше, но за каждой из них будет одно конкретное действие. Как говорится здесь http://pure-basic.narod.ru/docs/books/8.htm "Процедуры должны выполнить только одну функцию и выполнять ее хорошо."

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Declare OpenWindow_Example(Title$)
Declare CloseWindow_Example()
 
Enumeration FormWindow
  #Window_Example
EndEnumeration
 
Enumeration FormGadget
  #Text_0
  #Button_0
  #Text_1
  #Button_1
EndEnumeration
 
Procedure Example_BGE_Button_0()
  MessageRequester("", "Нажата Кнопка 0")
EndProcedure
 
Procedure Example_BGE_Button_1()
  MessageRequester("", "Нажата Кнопка 1")
EndProcedure
 
 
Procedure OpenWindow_Example(Title$)
  If OpenWindow(#Window_Example, #PB_Ignore, #PB_Ignore, 210, 70, Title$, #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget(#Text_0, 10, 10, 80, 20, "Строка 0")
    ButtonGadget(#Button_0, 100, 10, 100, 20, "Кнопка 0")
    TextGadget(#Text_1, 10, 40, 80, 20, "Строка 1")
    ButtonGadget(#Button_1, 100, 40, 100, 20, "Кнопка 1")
   
    BindGadgetEvent(#Button_0, @Example_BGE_Button_0())
    BindGadgetEvent(#Button_1, @Example_BGE_Button_1())
   
    BindEvent(#PB_Event_CloseWindow, @CloseWindow_Example(), #Window_Example)
  EndIf
EndProcedure
 
Procedure CloseWindow_Example()
  If IsWindow(#Window_Example)
    UnbindGadgetEvent(#Button_0, @Example_BGE_Button_0())
    UnbindGadgetEvent(#Button_1, @Example_BGE_Button_1())
   
    UnbindEvent(#PB_Event_CloseWindow, @CloseWindow_Example(), #Window_Example)
    CloseWindow(#Window_Example)
  EndIf
EndProcedure
 
OpenWindow_Example("Пример")
 
While IsWindow(#Window_Example)
  WaitWindowEvent()
Wend
 
End



Используя
Код:
1
2
3
4
 
BindGadgetEvent(#Button_0, @Example_BGE_Button_0())
BindGadgetEvent(#Button_1, @Example_BGE_Button_1())
 


я заменяю блок
Код:
1
2
3
4
5
6
7
8
9
10
11
 
Select Event
  Case #PB_Event_Gadget
    Select EventGadget()
      Case #Button_0
        Example_BGE_Button_0()
      Case #Button_1
        Example_BGE_Button_1()
    EndSelect
EndSelect
 



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн июл 31, 2017 8:33 pm 
Не в сети
доцент

Зарегистрирован: Ср апр 28, 2010 4:02 pm
Сообщений: 49
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Спрошу по-другому.
А как вы пользовались редактором форм до сегодня?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн июл 31, 2017 8:41 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11299
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Только как редактор форм, а обработчик событий пишу отдельно.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн июл 31, 2017 10:59 pm 
Не в сети
доцент

Зарегистрирован: Ср апр 28, 2010 4:02 pm
Сообщений: 49
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
И я так. Вот, хотел узнать. Всё бы хорошо, если бы результат работы редактора не нужно было править для своих нужд вручную.
А что на счёт PureForm? Я ним почти никогда не пользовался.. Вопрос такой, можно ли подключать результаты работы PureForm прямо к проекту без необходимости их редактировать вручную?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт авг 01, 2017 6:43 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
Даже не знаю как сей редактор запустить, делаю морду только руками, и так что внесение изменений где то в середине не приводит к переделке всей морды, автоматом всё перераспределяется. Может кода и немного больше, но оно того стоит.
Что то у меня вылез вопрос, а как морда ресайзиЦа после редактора? АНИ отдельных элементов доступны?
И почему нельзя сей файл руками редактировать?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт авг 01, 2017 9:28 am 
Не в сети
доцент

Зарегистрирован: Ср апр 28, 2010 4:02 pm
Сообщений: 49
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
newJS писал(а):
как морда ресайзиЦа после редактора?
Никак. Можно установить флаг #PB_Window_SizeGadget, но обработку ресайза придётся делать самому. В PureForm ситуация лучше, можно задавать реакцию для каждого элемента формы
newJS писал(а):
АНИ отдельных элементов доступны?
Доступны
newJS писал(а):
автоматом всё перераспределяется

А что вы имеете в виду? Какой-то приём, или просто всё руками делаете?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт авг 01, 2017 11:27 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11299
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
Тигрёнок писал(а):
Никак. Можно установить флаг #PB_Window_SizeGadget, но обработку ресайза придётся делать самому.
Создается процедура
Код:
1
2
3
4
5
6
7
Procedure ResizeGadgetsWindow_0()
  Protected FormWindowWidth, FormWindowHeight
  FormWindowWidth = WindowWidth(#Window_0)
  FormWindowHeight = WindowHeight(#Window_0)
  ResizeGadget(#Button_0, 44, 40, FormWindowWidth - 432, FormWindowHeight - 328)
  ResizeGadget(#Editor_0, 48, 128, FormWindowWidth - 352, 172)
EndProcedure

Ее нужно вызывать при событии #PB_Event_SizeWindow.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт авг 01, 2017 12:00 pm 
Не в сети
доцент

Зарегистрирован: Ср апр 28, 2010 4:02 pm
Сообщений: 49
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
А можно пожалуйста подробнее? К примеру, создал я форму, задал окну #PB_Window_SizeGadget, получился такой код:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
;
; This code is automatically generated by the FormDesigner.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures needs to be put in another source file.
;
 
Global Window_0
 
Global Frame_0
 
Procedure OpenWindow_0(x = 0, y = 0, width = 300, height = 200)
  Window_0 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
  Frame_0 = FrameGadget(#PB_Any, 10, 10, 280, 180, "Поле")
EndProcedure
 
Procedure Window_0_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #False
 
    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect
 
    Case #PB_Event_Gadget
      Select EventGadget()
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure
 
 


А как же получить ResizeGadgetsWindow_0()?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт авг 01, 2017 12:06 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11299
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
В свойствах гаджетов есть галочки фиксации краев.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB