purebasic.info

PureBasic forum
Текущее время: Вт фев 25, 2020 4:37 am

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




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Многоуровневые SplitterGadget
СообщениеДобавлено: Сб фев 08, 2020 4:52 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вт апр 29, 2014 8:26 am
Сообщений: 90
Благодарил (а): 65 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Прошу помощи по решению такой задачи: Моё окно содержит две панели PanelGadget, левая и правая, каждая из них размещает в себе по два EditorGadget, которые разделены горизонтальными сплитарами. И это я сделал и оно работает. Теперь мне нужно эти две панели разделить вертикальным сплитором, но увы, никак что-то не получается.
Раскопать много информации по SplitterGadget, тоже трудно, одни обрывки, а так чтоб понять принцип их вложенности - не нашел. Привожу тестовый код моей проблемы. Пожалуйста, кто в сплитарах силён - посмотрите.

Код:
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
55
56
Global Window_0
 
Global Panel_1
Global Panel_2
 
ww=600
wh=400
tpw.l=200                       ; Ширина боковой правой панели (начальная)
 
Window_0 = OpenWindow(#PB_Any, 0, 0, ww, wh, "", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
 
CreateStatusBar(0, WindowID(Window_0))
AddStatusBarField(100)
sbh=StatusBarHeight(0)
StatusBarText(0, 0, "StatusBar")
 
; В Panel_1 два EditorGadget разделенны разделителем Split_1
Panel_1 = PanelGadget(#PB_Any, 0, 0, ww-tpw, wh-sbh)
AddGadgetItem(Panel_1, -1, "List 1")
 
;pthc = GetGadgetAttribute(Panel_1, #PB_Panel_TabHeight)  ;Возвращает высоту вкладок панели в верхней части гаджета
pihc = GetGadgetAttribute(Panel_1, #PB_Panel_ItemHeight) ;Возвращает высоту внутренней области, где отображаются гаджеты
piwc = GetGadgetAttribute(Panel_1, #PB_Panel_ItemWidth)  ;Возвращает ширину внутренней области, где отображаются гаджеты
 
Edit_1=EditorGadget(#PB_Any, 0, 0, 0, 0)
Edit_2=EditorGadget(#PB_Any, 0, 0, 0, 0)
 
Split_1=SplitterGadget(#PB_Any, 0, 0, piwc, pihc, Edit_1, Edit_2)
CloseGadgetList()
SetGadgetState(Split_1, 310)    ; Начальная позиция Split_1 разделителя
 
 
;В Panel_2 два EditorGadget разделенны разделителем Split_2
Panel_2 = PanelGadget(#PB_Any, ww-tpw, 0, tpw, wh-sbh)
AddGadgetItem(Panel_2, -1, "Tool 1")
 
;pthe = GetGadgetAttribute(Panel_2, #PB_Panel_TabHeight)  ;Возвращает высоту вкладок панели в верхней части гаджета
pihe = GetGadgetAttribute(Panel_2, #PB_Panel_ItemHeight) ;Возвращает высоту внутренней области, где отображаются гаджеты
piwe = GetGadgetAttribute(Panel_2, #PB_Panel_ItemWidth)  ;Возвращает ширину внутренней области, где отображаются гаджеты
 
Edit_3=EditorGadget(#PB_Any, 0, 0, 0, 0)
Edit_4=EditorGadget(#PB_Any, 0, 0, 0, 0)
 
Split_2=SplitterGadget(#PB_Any, 0, 0, piwe, pihe, Edit_3, Edit_4)
CloseGadgetList()
SetGadgetState(Split_2, 310)    ; Начальная позиция Split_2 разделителя
 
 
;Не могу привязать третий вертикальный разделитель Split_3, чтоб он разделял правую и левую панель, которые в себе сами имеют по горизонтальному сплитору
;Split_3=SplitterGadget(#PB_Any, 0, 0, ?, ?, Split_1, Split_2, #PB_Splitter_Vertical)
;SetGadgetState(Split_3, 400)   ; Начальная позиция Split_3 разделителя (разделяет Split_1, Split_2)
 
 
Repeat
        event=WaitWindowEvent()
Until event=#PB_Event_CloseWindow


_________________
PureBasic 5.70 LTS Windows x64


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Многоуровневые SplitterGadget
СообщениеДобавлено: Сб фев 08, 2020 8:14 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вт апр 29, 2014 8:26 am
Сообщений: 90
Благодарил (а): 65 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Я уже близок к решению. Разместил каждый PanelGadget в свой ContainerGadget. И теперь третий SplitterGadget, прикрутил между двумя ContainerGadge-ми. И постарался правильно расставить CloseGadgetList(). Ну и заработало! Регулируется как вертикальный разделитель, так и два отдельных горизонтальных разделителя. Только вот беда, у ContainerGadget я ни нашел ни одного свойства на программное считывание или изменение размера! В справке дано только одно событие которое он генерирует, через EventType (): #PB_EventType_Resize - размер гаджета был изменен. А как он может быть изменён, если нечем его менять??? А так, мне всего осталось размеры панелей соединить с размерами контейнеров, а размеры контейнеров, формировать от размеров формы (это для того, чтоб вся система в реальном времени подстраивалась под размер окна). В общим вопрос: Как ContainerGadge-у задавать или брать у него параметры в программе?

Вот, то о чем я говорю, работает, но не доделано.

Код:
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
55
56
ww.l=600
wh.l=400
tpw.l=100                       ; Ширина боковой панели (начальная)
 
Window_0 = OpenWindow(#PB_Any, 0, 0, ww, wh, "", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
 
CreateStatusBar(0, WindowID(Window_0))
AddStatusBarField(100)
sbh=StatusBarHeight(0)
StatusBarText(0, 0, "StatusBar")
 
 
Container_1 = ContainerGadget(#PB_Any, 0, 0, ww-tpw, wh-sbh)
Panel_1 = PanelGadget(#PB_Any, 0, 0, ww-tpw, wh-sbh-0)          ; В Panel_1 два EditorGadget разделенны разделителем Split_1
AddGadgetItem(Panel_1, -1, "List 1")
 
pihc = GetGadgetAttribute(Panel_1, #PB_Panel_ItemHeight)        ;Возвращает высоту внутренней области, где отображаются гаджеты
piwc = GetGadgetAttribute(Panel_1, #PB_Panel_ItemWidth)         ;Возвращает ширину внутренней области, где отображаются гаджеты
 
Edit_1=EditorGadget(#PB_Any, 0, 0, 0, 0)
Edit_2=EditorGadget(#PB_Any, 0, 0, 0, 0)
 
Split_1=SplitterGadget(#PB_Any, 0, 0, piwc, pihc, Edit_1, Edit_2)
SetGadgetState(Split_1, 300)    ; Начальная позиция Split_1 разделителя
CloseGadgetList()                                                       ; Закрыл вложения 2-ух редакроров в панель 1
CloseGadgetList()                                                       ; закрыл вложение панели в контейнер 1
 
 
Container_2 = ContainerGadget(#PB_Any, ww-tpw, 0, tpw, wh-sbh)
Panel_2 = PanelGadget(#PB_Any, 0, 0, tpw, wh-sbh)                                       ;В Panel_2 два EditorGadget разделенны разделителем Split_2
AddGadgetItem(Panel_2, -1, "Tool 1")
 
pihe = GetGadgetAttribute(Panel_2, #PB_Panel_ItemHeight)        ;Возвращает высоту внутренней области, где отображаются гаджеты
piwe = GetGadgetAttribute(Panel_2, #PB_Panel_ItemWidth)         ;Возвращает ширину внутренней области, где отображаются гаджеты
 
Edit_3=EditorGadget(#PB_Any, 0, 0, 0, 0)
Edit_4=EditorGadget(#PB_Any, 0, 0, 0, 0)
 
Split_2=SplitterGadget(#PB_Any, 0, 0, piwe, pihe, Edit_3, Edit_4)
SetGadgetState(Split_2, 300)    ; Начальная позиция Split_2 разделителя
CloseGadgetList()                                                       ;       Закрыл вложения 2-ух редакроров в панель 2
CloseGadgetList()                                                       ;       закрыл вложение панели в контейнер 2
 
 
 
Split_3=SplitterGadget(#PB_Any, 0, 0, ww, wh-sbh, Container_1, Container_2, #PB_Splitter_Vertical)                              ;раньше было без контейнеров, боло так: Split_1, Split_2,
SetGadgetState(Split_3, 450)    ; Начальная позиция Split_3 разделителя (разделяет Container_1, Container_2)
;CloseGadgetList()
 
Repeat
        event=WaitWindowEvent()
Until event=#PB_Event_CloseWindow
 
; Задача: Узнать методы считывания и изменения размеров контейнеров ContainerGadget.
; Иначе прийдётся в место контейнеров использовать что-то другое,
; - что позволяет вложить в него другие гаджеты и читать и изменять его аттрибуты.


_________________
PureBasic 5.70 LTS Windows x64


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Многоуровневые SplitterGadget
СообщениеДобавлено: Сб фев 08, 2020 9:02 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11588
Благодарил (а): 4 раз.
Поблагодарили: 486 раз.
Render писал(а):
Разместил каждый PanelGadget в свой ContainerGadget. И теперь третий SplitterGadget, прикрутил между двумя ContainerGadge-ми.
Зачем контейнеры если можно на сплиттер поместить панели?

Render писал(а):
А как он может быть изменён, если нечем его менять???
Как нет? https://www.purebasic.com/documentation ... dgetx.html
https://www.purebasic.com/documentation ... dgety.html
https://www.purebasic.com/documentation ... width.html
https://www.purebasic.com/documentation ... eight.html

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Многоуровневые SplitterGadget
СообщениеДобавлено: Вс фев 09, 2020 3:44 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вт апр 29, 2014 8:26 am
Сообщений: 90
Благодарил (а): 65 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Спасибо. С поставленной задачей справился. Всё работает как задумывалось. Могу похвастаться))), может ещё что-то можно упростить?

Две панели, по два редактора, три сплитера + подстройка всех гаджетов под размер окна в реальном времени.
Код:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
Global Window_0, StatusBar_1, Panel_1, Panel_2, Edit_1, Edit_2, Edit_3, Edit_4, Split_1, Split_2, Split_3
Global ww, wh, sbh, tpw, piwc, pihc, piwe, pihe
ww=600                          ; Ширина
wh=400                          ; Высота
tpw=ww/4                        ; Ширина боковой панели (начальная)
 
Global Window_0 = OpenWindow(#PB_Any, 0, 0, ww, wh, "", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
 
StatusBar_1 = CreateStatusBar(#PB_Any, WindowID(Window_0))
AddStatusBarField(120)
sbh=StatusBarHeight(StatusBar_1)
StatusBarText(StatusBar_1, 0, "StatusBar")
 
Panel_1 = PanelGadget(#PB_Any, 0, 0, ww-tpw, wh-sbh)
AddGadgetItem(Panel_1, -1, "List 1")
piwc = GetGadgetAttribute(Panel_1, #PB_Panel_ItemWidth)
pihc = GetGadgetAttribute(Panel_1, #PB_Panel_ItemHeight)
 
Edit_1=EditorGadget(#PB_Any, 0, 0, 0, 0)
Edit_2=EditorGadget(#PB_Any, 0, 0, 0, 0)
 
Split_1=SplitterGadget(#PB_Any, 0, 0, piwc, pihc, Edit_1, Edit_2)
SetGadgetState(Split_1, ww/2)   ; Начальная позиция Split_1 разделителя
CloseGadgetList()
 
Panel_2 = PanelGadget(#PB_Any, 0, 0, tpw, wh-sbh)
AddGadgetItem(Panel_2, -1, "Tool 1")
piwe = GetGadgetAttribute(Panel_2, #PB_Panel_ItemWidth)
pihe = GetGadgetAttribute(Panel_2, #PB_Panel_ItemHeight)
 
Edit_3=EditorGadget(#PB_Any, 0, 0, 0, 0)
Edit_4=EditorGadget(#PB_Any, 0, 0, 0, 0)
 
Split_2=SplitterGadget(#PB_Any, 0, 0, piwe, pihe, Edit_3, Edit_4)
SetGadgetState(Split_2, ww/3)   ; Начальная позиция Split_2 разделителя
CloseGadgetList()      
 
Split_3=SplitterGadget(#PB_Any, 0, 0, ww, wh-sbh, Panel_1, Panel_2, #PB_Splitter_Vertical)
SetGadgetState(Split_3, ww-tpw) ; Начальная позиция Split_3 разделителя
 
Procedure Alignment()
ResizeGadget(Split_3,0,0,WindowWidth(Window_0), WindowHeight(Window_0)-sbh)
ResizeGadget(Split_1,0,0,GetGadgetAttribute(Panel_1, #PB_Panel_ItemWidth), GetGadgetAttribute(Panel_1, #PB_Panel_ItemHeight))
ResizeGadget(Split_2,0,0,GetGadgetAttribute(Panel_2, #PB_Panel_ItemWidth), GetGadgetAttribute(Panel_2, #PB_Panel_ItemHeight))
EndProcedure
 
Procedure EventHandler()
        Select Event()
                Case #PB_Event_CloseWindow
                        End
                Case #PB_Event_Menu
                        Select EventMenu()
                        EndSelect
                Case #PB_Event_SizeWindow
                        Alignment()                    
                Case #PB_Event_Gadget      
                        Select EventGadget()
                                Case Split_3
                                Alignment()
                        EndSelect
        EndSelect
EndProcedure
 
Alignment()
 
BindGadgetEvent(Panel_1, @EventHandler())
BindGadgetEvent(Panel_2, @EventHandler())
BindGadgetEvent(Split_1, @EventHandler())
BindGadgetEvent(Split_2, @EventHandler())
BindGadgetEvent(Split_3, @EventHandler())
BindGadgetEvent(Edit_1, @EventHandler())
BindGadgetEvent(Edit_2, @EventHandler())
BindGadgetEvent(Edit_3, @EventHandler())
BindGadgetEvent(Edit_4, @EventHandler())
 
BindEvent(#PB_Event_CloseWindow, @EventHandler())
BindEvent(#PB_Event_Menu, @EventHandler())
BindEvent(#PB_Event_SizeWindow, @EventHandler())
 
Repeat
        WaitWindowEvent()
ForEver


_________________
PureBasic 5.70 LTS Windows x64


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Многоуровневые SplitterGadget
СообщениеДобавлено: Вс фев 09, 2020 1:12 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11588
Благодарил (а): 4 раз.
Поблагодарили: 486 раз.
Render писал(а):
может ещё что-то можно упростить?
Вместо
Код:
1
2
3
4
5
6
7
8
9
BindGadgetEvent(Panel_1, @EventHandler())
BindGadgetEvent(Panel_2, @EventHandler())
BindGadgetEvent(Split_1, @EventHandler())
BindGadgetEvent(Split_2, @EventHandler())
BindGadgetEvent(Split_3, @EventHandler())
BindGadgetEvent(Edit_1, @EventHandler())
BindGadgetEvent(Edit_2, @EventHandler())
BindGadgetEvent(Edit_3, @EventHandler())
BindGadgetEvent(Edit_4, @EventHandler())

можно написать
Код:
1
BindEvent(#PB_Event_Gadget, @EventHandler())


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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


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

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