Вверх ↑
Этот топик читают: Гость
Ответов: 2324
Рейтинг: 681
#1: 2025-03-12 12:43:32 ЛС | профиль | цитата
Всплыла проблема (в этой теме: https://forum.hiasm.com/topic/68134/9) что слои налазят друг на друга.
Тестовые схемы

Add(VBoxLayout,2368616,322,217)
{
Name="ver_01"
Space=33
Padding=5
Layout="ver_02"
}
Add(Memo,13841878,406,420)
{
Left=175
Top=180
Width=115
Color=12639424
Layout="ver_02"
HeightScale=100
}
Add(MainForm,2953706,231,406)
{
Width=575
Height=583
Position=1
link(onCreate,3155327:doResize,[])
}
Add(VBoxLayout,3155327,322,420)
{
Name="ver_02"
}
Add(Edit,6116337,406,329)
{
Left=245
Top=140
Height=25
Layout="ver_01"
}
Add(Edit,15850007,406,280)
{
Left=255
Top=100
Height=25
Layout="ver_01"
}
Add(Edit,3410316,406,231)
{
Left=255
Top=70
Height=25
Layout="ver_01"
}
Add(Edit,4471230,406,182)
{
Left=255
Top=40
Height=25
Layout="ver_01"
}

Add(Memo,13841878,497,315)
{
Left=175
Top=180
Width=115
Color=12639424
Layout="ver"
HeightScale=100
}
Add(MainForm,1019016,294,301)
{
Width=461
Height=538
Position=1
link(onCreate,978984:doResize,[])
}
Add(VBoxLayout,978984,420,315)
{
Name="ver"
WidthScale=100
Layout="hor"
}
Add(GridLayout,13403536,301,140)
{
Name="mtrx_r"
Space=20
Padding=10
Layout="ver"
Rows=3
Cols=3
AddMode=1
}
Add(Edit,4508963,388,188)
{
Left=170
Top=45
Width=75
Layout="mtrx_r"
WidthScale=33
}
Add(Edit,3047672,371,140)
{
Left=170
Top=5
Width=75
Layout="mtrx_r"
WidthScale=33
}
Add(Edit,7575744,416,139)
{
Left=170
Top=25
Width=75
Layout="mtrx_r"
WidthScale=33
}
Add(Edit,383787,486,188)
{
Left=200
Top=45
Width=75
Layout="mtrx_r"
WidthScale=33
}
Add(Edit,5386374,469,140)
{
Left=200
Top=5
Width=75
Layout="mtrx_r"
WidthScale=33
}
Add(Edit,1328770,514,139)
{
Left=195
Top=25
Width=75
Layout="mtrx_r"
WidthScale=33
}
Add(Edit,1809522,584,188)
{
Left=240
Top=45
Width=75
Layout="mtrx_r"
}
Add(Edit,3334707,567,140)
{
Left=245
Top=5
Width=75
Layout="mtrx_r"
WidthScale=33
}
Add(Edit,7243612,612,139)
{
Left=245
Top=25
Width=75
Layout="mtrx_r"
WidthScale=33
}


Посмотрев код заметил следующие, что когда у слоя спрашивают о его высоте, то выдается максимальное высота одного из элементов в слои. Точно так же обстоит дело и с шириной. Почему сделано так, так и не понял.
Есть вариант который нужно протестировать. Заменить в файле WinLayout.ini две функции (ориентировочно 186 строка в файле):

function TWinLayout.getHeight:integer;
var i,d:integer;
begin
Result := 0;
d := Result;
for i := 0 to FList.Count-1 do
begin
case PBoxRecord(FLIst.Objects[i]).otype of
OBJ_CONTROL: d := PControl(PBoxRecord(FList.Objects[i]).obj).Top + PControl(PBoxRecord(FLIst.Objects[i]).obj).Height;
OBJ_LAYOUT : d := TWinLayout(PBoxRecord(FList.Objects[i]).obj).Top + TWinLayout(PBoxRecord(FLIst.Objects[i]).obj).Height;
OBJ_SPACER : d := THILayoutSpacer(PBoxRecord(FList.Objects[i]).obj)._prop_Top + THILayoutSpacer(PBoxRecord(FLIst.Objects[i]).obj)._prop_Height;
end;
if d › Result then
Result := d;
end;
inc(Result, 2*_prop_Padding);
end;

function TWinLayout.getWidth:integer;
var i,d:integer;
begin
Result := 0;
d := Result;
for i := 0 to FList.Count-1 do
begin
case PBoxRecord(FLIst.Objects[i]).otype of
OBJ_CONTROL: d := PControl(PBoxRecord(FList.Objects[i]).obj).Left + PControl(PBoxRecord(FLIst.Objects[i]).obj).Width;
OBJ_LAYOUT : d := TWinLayout(PBoxRecord(FList.Objects[i]).obj).Left + TWinLayout(PBoxRecord(FLIst.Objects[i]).obj).Width;
OBJ_SPACER : d := THILayoutSpacer(PBoxRecord(FList.Objects[i]).obj)._prop_Left + THILayoutSpacer(PBoxRecord(FLIst.Objects[i]).obj)._prop_Width;
end;
if d › Result then
Result := d;
end;
inc(Result, 2*_prop_Padding);
end;

Редактировалось 2 раз(а), последний 2025-03-12 12:45:34
карма: 11

1
Голосовали:strannik_nebes
Ответов: 147
Рейтинг: 3
#2: 2025-03-12 13:16:34 ЛС | профиль | цитата
sla8a, с масштабом проблемы, когда задаешь по обеим осям, во всех случаях
Add(VBoxLayout,2368616,392,203)
{
Name="ver_01"
Space=33
Padding=5
Layout="ver_02"
}
Add(Memo,13841878,476,406)
{
Left=175
Top=180
Width=115
Color=12639424
Layout="ver_02"
HeightScale=100
}
Add(MainForm,3579503,301,392)
{
Width=575
Height=583
Position=1
link(onCreate,3155327:doResize,[])
}
Add(VBoxLayout,3155327,392,406)
{
Name="ver_02"
}
Add(Edit,6116337,476,315)
{
Left=245
Top=140
Height=25
Layout="ver_01"
}
Add(Edit,15850007,476,266)
{
Left=255
Top=100
Height=25
Layout="ver_01"
}
Add(Edit,3410316,476,217)
{
Left=255
Top=70
Height=25
Layout="ver_01"
}
Add(Edit,4471230,476,168)
{
Left=255
Top=40
Height=25
Layout="ver_01"
HeightScale=100
}

Add(VBoxLayout,2368616,392,203)
{
Name="ver_01"
Space=33
Padding=5
Layout="ver_02"
}
Add(Memo,13841878,476,406)
{
Left=175
Top=180
Width=115
Color=12639424
Layout="ver_02"
HeightScale=100
}
Add(MainForm,3579503,301,392)
{
Width=575
Height=583
Position=1
link(onCreate,3155327:doResize,[])
}
Add(VBoxLayout,3155327,392,406)
{
Name="ver_02"
}
Add(Edit,6116337,476,315)
{
Left=245
Top=140
Height=25
Layout="ver_01"
HeightScale=100
}
Add(Edit,15850007,476,266)
{
Left=255
Top=100
Height=25
Layout="ver_01"
}
Add(Edit,3410316,476,217)
{
Left=255
Top=70
Height=25
Layout="ver_01"
}
Add(Edit,4471230,476,168)
{
Left=255
Top=40
Height=25
Layout="ver_01"
}


Редактировалось 3 раз(а), последний 2025-03-12 13:18:55
карма: 1

0
Ответов: 2324
Рейтинг: 681
#3: 2025-03-12 13:39:32 ЛС | профиль | цитата
strannik_nebes, в этих схемах нет логики в слоях.
В моем примере слой ver_01 не претендует на проценты и выстраивает Edit-ы по факту их высоты, а уже слой ver растягивает Memo по его 100% от высоты.
В твоей схеме слой ver_01 не может понять как отдать одному Edit-у 100% высоты. Сам слой ver_01 не претендует на какое-то количество высоты (свойство HeightScale = 0).
Если задать свойство HeightScale = 50 у ver_01, то он будет понимать как ему выстраивать Edit-ы:
Add(VBoxLayout,2368616,343,105)
{
Name="ver_01"
Space=33
Padding=5
HeightScale=50
Layout="ver_02"
AddHint(-12,-29,48,13,Name)
}
Add(Memo,13841878,427,308)
{
Left=175
Top=180
Width=115
Color=12639424
Layout="ver_02"
HeightScale=50
}
Add(MainForm,3579503,252,294)
{
Width=575
Height=583
Position=1
link(onCreate,3155327:doResize,[])
}
Add(VBoxLayout,3155327,343,308)
{
Name="ver_02"
AddHint(-10,-28,48,13,Name)
}
Add(Edit,6116337,427,217)
{
Left=245
Top=140
Height=25
Layout="ver_01"
}
Add(Edit,15850007,427,168)
{
Left=255
Top=100
Height=25
Layout="ver_01"
}
Add(Edit,3410316,427,119)
{
Left=255
Top=70
Height=25
Layout="ver_01"
}
Add(Edit,4471230,427,70)
{
Left=255
Top=40
Height=25
Layout="ver_01"
HeightScale=100
}

Add(VBoxLayout,2368616,308,175)
{
Name="ver_01"
Space=33
Padding=5
HeightScale=50
Layout="ver_02"
AddHint(-8,-38,48,13,Name)
}
Add(Memo,13841878,392,378)
{
Left=175
Top=180
Width=115
Color=12639424
Layout="ver_02"
HeightScale=50
}
Add(MainForm,3579503,217,364)
{
Width=575
Height=583
Position=1
link(onCreate,3155327:doResize,[])
}
Add(VBoxLayout,3155327,308,378)
{
Name="ver_02"
AddHint(-12,-34,48,13,Name)
}
Add(Edit,6116337,392,287)
{
Left=245
Top=140
Height=25
Layout="ver_01"
HeightScale=100
}
Add(Edit,15850007,392,238)
{
Left=255
Top=100
Height=25
Layout="ver_01"
}
Add(Edit,3410316,392,189)
{
Left=255
Top=70
Height=25
Layout="ver_01"
}
Add(Edit,4471230,392,140)
{
Left=255
Top=40
Height=25
Layout="ver_01"
}
А так по логике слой ver_01 для выстраивания, а слой ver для растягивания. И если нужно растягивать один из Edit-ов, то его нужно отдать слою ver или настроить для него еще один слой.

Редактировалось 1 раз(а), последний 2025-03-12 13:42:41
карма: 11

0
Ответов: 147
Рейтинг: 3
#4: 2025-03-12 13:46:56 ЛС | профиль | цитата
В моем примере слой ver_01 не претендует на проценты и выстраивает Edit-ы по факту их высоты

согласен.
Почему контролы растянулись на всю длину? Стоит по нолям (где-то я уже это видел на андроид платформе).

Я попробывал в своих наработках - половина съехало на форме после правки. растягивается по тому же принципу, что я выкладывал.

Редактировалось 10 раз(а), последний 2025-03-12 16:33:42
карма: 1

0
Ответов: 2324
Рейтинг: 681
#5: 2025-03-12 14:47:21 ЛС | профиль | цитата
strannik_nebes, пробовал на своих проектах где используются слои, проблем не обнаружил. Надо подождать других тестеров или схему где будет видна ошибка. Выложенная мной правка на данный момент не финальная и нуждается в тестировании.
карма: 11

0
Ответов: 147
Рейтинг: 3
#6: 2025-03-12 16:25:34 ЛС | профиль | цитата
sla8a, После правок не удается расположить pagecontrol справа (пример) по координатам (adPosition). Изменения есть, это ощущается.
Add(VBoxLayout,2368616,413,175)
{
Name="ver_01"
Space=33
Padding=5
Layout="ver_02"
}
Add(Memo,13841878,497,378)
{
Left=50
Top=145
Width=115
Color=12639424
Layout="ver_02"
HeightScale=100
}
Add(MainForm,2953706,182,266)
{
Width=575
Height=583
Position=1
link(onCreate,15871745:doResize,[])
}
Add(VBoxLayout,3155327,413,378)
{
Name="ver_02"
WidthScale=50
Layout="lay"
}
Add(Edit,6116337,497,287)
{
Left=120
Top=105
Height=25
Layout="ver_01"
}
Add(Edit,15850007,497,238)
{
Left=130
Top=65
Height=25
Layout="ver_01"
}
Add(Edit,3410316,497,189)
{
Left=130
Top=35
Height=25
Layout="ver_01"
}
Add(Edit,4471230,497,140)
{
Left=130
Top=5
Height=25
Layout="ver_01"
}
Add(HBoxLayout,15871745,252,280)
{
Name="lay"
HeightScale=100
}
Add(PageControl,7896318,616,245)
{
TabOrder=1
Layout="lay"
WidthScale=50
Selected="base"
}
BEGIN_SDK
Add(EditPolyMulti,15384383,21,21)
{
}
Add(PagePanel,15522654,35,105)
{
Left=250
Top=20
Width=265
Height=450
}
END_SDK


Редактировалось 5 раз(а), последний 2025-03-12 16:35:54
карма: 1

0
Ответов: 2324
Рейтинг: 681
#7: 2025-03-12 17:22:56 ЛС | профиль | цитата
strannik_nebes писал(а):
После правок не удается расположить pagecontrol справа
Давай уточним. У меня к примеру в твоем примере и до правок по координатам (adPosition) PageControl залезает на левую сторону. Правки на это никак не повлияли.
Если говорить о "фишках" слоев, то мне известны следующие:
1. Игнорирование Visible. Что как по мне не правильно. Если выключить (сделать не видимым) контрол, то слои его все равно обрабатывают. Есть желание избавиться от этого.
2. Контейнеры имеют преимущество при построении по (adPosition) и насколько помню всегда рекомендовали в таких случаях запихивать в контейнеры все что не контейнер, чтоб быть на ровне с контейнером.
А почему Zorder не подходит? Великолепно справляется:
Add(VBoxLayout,2368616,616,126)
{
Name="ver_01"
Space=33
Padding=5
Layout="ver_02"
}
Add(Memo,13841878,700,343)
{
Left=50
Top=145
Width=115
Color=12639424
Layout="ver_02"
HeightScale=100
}
Add(MainForm,11767304,385,231)
{
Width=741
Height=583
Position=1
link(onCreate,15871745:doResize,[])
}
Add(VBoxLayout,3155327,616,343)
{
Name="ver_02"
WidthScale=50
Layout="lay"
}
Add(Edit,6116337,700,238)
{
Left=120
Top=105
Height=25
Layout="ver_01"
}
Add(Edit,15850007,700,189)
{
Left=130
Top=65
Height=25
Layout="ver_01"
}
Add(Edit,3410316,700,140)
{
Left=130
Top=35
Height=25
Layout="ver_01"
}
Add(Edit,4471230,700,91)
{
Left=130
Top=5
Height=25
Layout="ver_01"
}
Add(HBoxLayout,15871745,490,245)
{
Name="lay"
HeightScale=100
AddMode=0
}
Add(PageControl,7896318,840,245)
{
TabOrder=1
Layout="lay"
WidthScale=50
Selected="base"
}
BEGIN_SDK
Add(EditPolyMulti,15384383,21,21)
{
}
Add(PagePanel,15522654,35,105)
{
Left=410
Top=45
Width=265
Height=450
Layout="parent.lay"
WidthScale=50
}
END_SDK
И правки в этой схеме хорошо себя отрабатывают.

Да и по adPosition работает. Сам не обратил внимание что в редакторе формы отображается base, а не сам контейнер, а слои обрабатывают контейнер. Если изменить значение Left в контейнере как и у base, то все правильно работает:
Add(VBoxLayout,2368616,616,126)
{
Name="ver_01"
Space=33
Padding=5
Layout="ver_02"
}
Add(Memo,13841878,700,343)
{
Left=50
Top=145
Width=115
Color=12639424
Layout="ver_02"
HeightScale=100
}
Add(MainForm,11767304,385,203)
{
Width=741
Height=583
Position=1
link(onCreate,15871745:doResize,[])
}
Add(VBoxLayout,3155327,616,343)
{
Name="ver_02"
WidthScale=50
Layout="lay"
}
Add(Edit,6116337,700,238)
{
Left=120
Top=105
Height=25
Layout="ver_01"
}
Add(Edit,15850007,700,189)
{
Left=130
Top=65
Height=25
Layout="ver_01"
}
Add(Edit,3410316,700,140)
{
Left=130
Top=35
Height=25
Layout="ver_01"
}
Add(Edit,4471230,700,91)
{
Left=130
Top=5
Height=25
Layout="ver_01"
}
Add(HBoxLayout,15871745,518,217)
{
Name="lay"
HeightScale=100
}
Add(PageControl,7896318,840,245)
{
Left=300
TabOrder=1
Layout="lay"
WidthScale=50
Selected="base"
}
BEGIN_SDK
Add(EditPolyMulti,15384383,21,21)
{
}
Add(PagePanel,15522654,35,105)
{
Left=355
Top=45
Width=340
Height=450
Layout="parent.lay"
WidthScale=50
}
END_SDK
Это и нужно учитывать когда создаешь панели динамически. По позиции может получится лажа, так как слои уже сместили элементы на форме и в этот момент создается новый (или несколько), а так как используется позиция по умолчанию, то сложно предсказать где они появятся. Будешь ожидать что все будет как в редакторе форм, а на деле выйдет по другому. При zOrder новая панель добавиться в конец слоя.

Редактировалось 4 раз(а), последний 2025-03-12 17:46:27
карма: 11

1
Голосовали:strannik_nebes
Ответов: 147
Рейтинг: 3
#8: 2025-03-13 08:36:06 ЛС | профиль | цитата
sla8a, Хорошо, когда ты глубже разбираешься в этом. Я осваивал здесь слои методом проб и ошибок с существующими версиями.
Игнорирование Visible. Что как по мне не правильно. Если выключить (сделать не видимым) контрол, то слои его все равно обрабатывают. Есть желание избавиться от этого

Я тоже думал об этом - об игнорировании невидимых виз элементах в качестве опции.
А почему Zorder не подходит? Великолепно справляется

Подходит, конечно. На счет приоритетов расположения - теперь ясно.

Поведение компонентов немного изменилось для сложных схем расположений, в частности, pagecontrol. Мне понадобятся правки. Тестирую дальше

--- Добавлено в 2025-03-13 09:24:24

Редактировалось 13 раз(а), последний 2025-03-13 11:05:02
карма: 1

0
Ответов: 147
Рейтинг: 3
#9: 2025-03-13 11:12:56 ЛС | профиль | цитата
sla8a, Как
Сам слой ver_01 не претендует на какое-то количество высоты (свойство HeightScale = 0).

Как сделать статичными элементами всего слоя как слева, так и справа в обеих случаях без смещений по отношению друг другу? (последний твой пример)

P.S.: Заметил, что pas не заменил на правки

Редактировалось 2 раз(а), последний 2025-03-13 11:13:55
карма: 1

0
Ответов: 2324
Рейтинг: 681
#10: 2025-03-13 11:41:06 ЛС | профиль | цитата
strannik_nebes писал(а):
Как сделать статичными элементами всего слоя как слева, так и справа в обеих случаях без смещений по отношению друг другу? (последний твой пример)
Вот это мне не понятно совсем. Постарайся объяснить по другому.
карма: 11

0
Ответов: 147
Рейтинг: 3
#11: 2025-03-13 13:47:59 ЛС | профиль | цитата
sla8a,
Add(MainForm,2953706,238,266)
{
Width=1231
Height=626
link(onCreate,16198307:doResize,[(303,286)(303,293)])
}
Add(VBoxLayout,16198307,336,287)
{
@Color=43775
Name="main_layout"
Layout=""
}
Add(HBoxLayout,2906585,336,329)
{
@Color=43775
Name="main_panel"
HeightScale=100
Layout="main_layout"
}
Add(VBoxLayout,267244,294,371)
{
@Color=43775
Name="main_vert_button"
Layout="main_panel"
}
Add(PageControl,7896318,420,371)
{
@Color=43775
Left=300
Color=12639424
TabOrder=1
Layout="main_panel"
WidthScale=100
HeightScale=100
Childrens=#4:test|
Selected="test"
}
BEGIN_SDK
Add(EditPolyMulti,15384383,21,21)
{
}
Add(PagePanel,15522654,35,105)
{
@Color=43775
Left=230
Top=15
Width=945
Height=475
Layout=""
}
Add(Label,11909963,196,98)
{
Left=195
Top=95
}
END_SDK
BEGIN_SDK
Add(EditPolyMulti,16391525,21,21)
{
}
Add(PagePanel,12390016,35,105)
{
Left=35
Top=105
}
END_SDK
Add(ButtonRush,3709131,553,266)
{
@Color=16755285
Left=5
Top=10
Width=205
Height=72
Antialiased=4
ParentFont=0
Cursor=2
KeyPreview=1
Layout="main_vert_button"
ColorToDis=15780518
Caption="кнопка"
OnlyGlyphDef=0
Glyphs=[]
}
Add(ButtonRush,3136905,553,371)
{
@Color=16755285
Left=5
Top=240
Width=205
Height=72
Antialiased=4
ParentFont=0
Cursor=2
KeyPreview=1
TabOrder=3
Layout="main_vert_button"
ColorToDis=15780518
Caption="кнопка"
OnlyGlyphDef=0
Glyphs=[]
}
Add(ButtonRush,12505365,553,301)
{
@Color=16755285
Left=5
Top=85
Width=205
Height=72
Antialiased=2
ParentFont=0
Cursor=2
KeyPreview=1
TabOrder=1
Layout="main_vert_button"
ColorToDis=15780518
Caption="кнопка"
OnlyGlyphDef=0
Glyphs=[]
}
Add(ButtonRush,13189367,553,406)
{
@Color=16755285
Left=5
Top=395
Width=205
Height=72
ParentFont=0
Cursor=2
KeyPreview=1
TabOrder=4
Layout="main_vert_button"
ColorToDis=15780518
Caption="кнопка"
OnlyGlyphDef=0
Glyphs=[]
}
Add(ButtonRush,691425,553,336)
{
@Color=16755285
Left=5
Top=165
Width=205
Height=72
Antialiased=3
ParentFont=0
Cursor=2
KeyPreview=1
TabOrder=2
Layout="main_vert_button"
ColorToDis=15780518
Caption="кнопка"
OnlyGlyphDef=0
Glyphs=[]
}
Add(ButtonRush,12435777,553,441)
{
@Color=16755285
Left=5
Top=315
Width=205
Height=72
ParentFont=0
Cursor=2
KeyPreview=1
TabOrder=4
Layout="main_vert_button"
ColorToDis=15780518
Caption="кнопка"
OnlyGlyphDef=0
Glyphs=[]
}
Add(Edit,5536718,336,497)
{
@Color=43775
Left=20
Top=525
Width=675
Layout="main_panel_but"
}
Add(HBoxLayout,6871722,336,427)
{
@Color=43775
Name="main_panel_but"
Padding=5
WidthScale=100
Layout="main_layout"
}
Add(Edit,14539419,392,497)
{
@Color=43775
Left=835
Top=525
Width=315
Layout="main_panel_but"
}


1.Если убрать нижний слой или заменить на контрол, то все норм.
2. Если задать параметр Padding - слои плывут при масштабировании, вот что оказалось.

Редактировалось 6 раз(а), последний 2025-03-13 14:11:07
карма: 1

0
Ответов: 2324
Рейтинг: 681
#12: 2025-03-14 08:08:00 ЛС | профиль | цитата
strannik_nebes, да есть ползучесть слоя. На данный момент лучше откатить правки и точно не подгонять схемы под такие правки. По мере свободного времени разбираюсь с слоями, надеюсь получится по исправлять эти недочеты.
карма: 11

0
12
Сообщение
...
Прикрепленные файлы
(файлы не залиты)