Вверх ↑
Этот топик читают: Гость
Ответов: 2193
Рейтинг: 673
#16: 2019-05-30 15:52:10 ЛС | профиль | цитата
Netspirit писал(а):
Не надо ничего проверять.
Не согласен.
Add(MainForm,12438872,259,140)
{
Width=459
Height=348
Point(onMove)
Point(onResize)
link(onCreate,2282380:doWork1,[(319,160)])
link(onMove,2282380:doWork2,[])
link(onResize,2282380:doWork3,[(319,174)])
}
Add(ChildForm,9700354,343,161)
{
}
BEGIN_SDK
Add(EditMulti,7433765,21,21)
{
WorkCount=1
Width=692
Height=480
link(doWork1,4378830:doEvent1,[(77,27)(77,167)])
}
Add(MainForm,10575798,133,133)
{
Left=35
Top=105
Width=444
Height=306
Point(doCenterPos)
Point(onMove)
Point(onResize)
link(onCreate,6055022:doWork1,[(186,153)])
link(onMove,6055022:doWork2,[])
link(onResize,6055022:doWork3,[(186,167)])
}
Add(ChildGroupBox,3090827,224,224)
{
}
BEGIN_SDK
Add(EditMulti,4145507,21,21)
{
WorkCount=1
Width=608
Height=417
link(doWork1,7970121:doEvent1,[(105,27)(105,69)])
}
Add(GroupBox,10199545,189,63)
{
Left=115
Top=25
Width=228
Height=200
Color=128
Font=[MS Sans Serif,19,0,0,1]
Point(doCenterPos)
}
Add(ChildPanel,13219045,189,126)
{
}
BEGIN_SDK
Add(EditMulti,6041293,21,21)
{
WorkCount=1
link(doWork1,8499161:doCenterPos,[(101,27)(101,125)])
}
Add(Panel,8499161,182,112)
{
Left=95
Top=65
Height=190
Point(doCenterPos)
}
END_SDK
Add(Hub,7970121,126,63)
{
link(onEvent1,10199545:doCenterPos,[])
link(onEvent2,13219045:doWork1,[(168,76)(168,132)])
}
END_SDK
Add(Hub,4378830,98,161)
{
link(onEvent1,10575798:doCenterPos,[])
link(onEvent2,7718618:doWork2,[(120,174)(120,230)])
}
Add(HubEx,7718618,196,224)
{
link(onEvent,3090827:doWork1,[])
}
Add(HubEx,6055022,182,154)
{
link(onEvent,7718618:doWork1,[(200,160)])
}
END_SDK
Add(HubEx,2282380,315,161)
{
link(onEvent,9700354:doWork1,[])
}

И как по мне то дочерняя форма должна выравниваться посередине формы, а не экрана.

Редактировалось 1 раз(а), последний 2019-05-30 15:53:47
карма: 10

0
Ответов: 4621
Рейтинг: 746
#17: 2019-05-30 16:06:46 ЛС | профиль | цитата
Ну, так дочерняя форма не имеет "родительской формы" на уровне окон. Она имеет родительский контейнер HiAsm (форму), в котором она создана - относительно неё она может центрироваться (или относительно главной формы), но не с помощью doCenterPos. В этом случае должно работать свойство Position=poOwner. Форма создаётся по центру "родительской", затем её пользователь может переместить куда хочет, а в каком случае он будет применять doCenterPos к этой форме?

Редактировалось 1 раз(а), последний 2019-05-30 16:07:14
карма: 26

0
Ответов: 8887
Рейтинг: 823
#18: 2019-05-30 16:18:21 ЛС | профиль | цитата
sla8a писал(а):
И вот не понятно зачем вы решение этой проблемы предлагаете решить таким способом.

HiAsm для пользователя "Ни строчки кода", а я пользователь по определению и Win.pas не редактирую
карма: 19

0
Ответов: 2193
Рейтинг: 673
#19: 2019-05-30 16:18:47 ЛС | профиль | цитата
Netspirit писал(а):
в каком случае он будет применять doCenterPos к этой форме?

Ну к примеру при выводе как модальной:
Add(MainForm,2953706,378,217)
{
Width=634
Height=263
link(onCreate,13505776:doWork1,[])
}
Add(ChildForm,16693946,665,266)
{
}
BEGIN_SDK
Add(EditMulti,1500954,21,21)
{
WorkCount=2
link(doWork1,805780:doCenterPos,[(119,27)(119,146)])
link(doWork2,805780:doShowModal,[(107,34)(107,153)])
}
Add(MainForm,805780,217,112)
{
Left=35
Top=105
Width=286
Height=195
Visible=1
Point(doCenterPos)
Point(doShowModal)
}
END_SDK
Add(Button,15028814,378,266)
{
Left=50
Top=80
link(onClick,7582548:doEvent1,[])
}
Add(Hub,7582548,427,266)
{
link(onEvent1,3020493:doEvent,[])
link(onEvent2,16693946:doWork2,[])
}
Add(ComboBox,14499880,539,189)
{
Left=50
Top=125
Width=495
Height=24
Strings=#38:по центру формы из которой она вызвана|50:как карта ляжет, если перед этим передвинуть форму|
ReadOnly=0
Point(Index)
Point(doSelect)
}
Add(IndexToChanel,3020493,553,266)
{
Count=1
Point(Index)
link(onEvent1,16693946:doWork1,[])
link(Index,14499880:Index,[])
}
Add(Label,15149509,539,140)
{
Left=50
Top=105
Width=495
Caption="Вывод модальной формы"
}
Add(ChanelToIndex,13505776,490,231)
{
Count=1
link(onIndex,14499880:doSelect,[])
}

В моем коде она всегда по центру "родительской" формы из которой ее и вызвали, а не известно где на экране.

Редактировалось 2 раз(а), последний 2019-05-30 16:45:43
карма: 10

0
Ответов: 4621
Рейтинг: 746
#20: 2019-05-30 16:27:23 ЛС | профиль | цитата
Ну, так для этого предполагалось свойство Position=poOwner у модальной формы. Не работает? Или это свойство значит что нужно просто Left/Top отсчитывать от Owner-формы?

Редактировалось 1 раз(а), последний 2019-05-30 16:29:34
карма: 26

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#21: 2019-05-30 16:45:59 ЛС | профиль | цитата
Netspirit писал(а):
В этом случае должно работать свойство Position=poOwner. Форма создаётся по центру "родительской", затем её пользователь может переместить куда хочет, а в каком случае он будет применять doCenterPos к этой форме?

Ну да, Galkov именно для этого и ввел это свойство. А почему только для модальной, вроде для любой формы это подходит?

Редактировалось 1 раз(а), последний 2019-05-30 16:48:47
карма: 22

0
Ответов: 2193
Рейтинг: 673
#22: 2019-05-30 16:54:13 ЛС | профиль | цитата
Netspirit, не ту схему выложил постом выше. Посмотрите сейчас исправил.
Netspirit писал(а):
Не работает?
Вообще никогда этим свойством не пользовался. Автору этого свойства было сложно сделать описание. И если с poNone и poCenter интуитивно понятно, то что делает poOwner даже после различных экспериментов не понять.
Леонид, HiAsm да, а на форуме есть разделы. И если пользователь нашел ошибку в элементе и создал тему в соответствующем разделе с полным изложением проблемы, то думаю не нужно подсовывать схемы.

--- Добавлено в 2019-05-30 16:58:29

nesco писал(а):
А почему только для модальной, вроде для любой формы это подходит?

У трех форм установлено это свойство и?

Add(MainForm,2953706,651,273)
{
Width=739
Height=401
Position=2
}
Add(ChildForm,7372748,714,371)
{
}
BEGIN_SDK
Add(EditMulti,8529658,21,21)
{
}
Add(MainForm,8684076,35,105)
{
Left=35
Top=105
Position=2
}
END_SDK
Add(ChildForm,3543069,714,329)
{
}
BEGIN_SDK
Add(EditMulti,12300436,14,7)
{
WorkCount=1
link(doWork1,16126581:doShowModal,[(88,13)(88,132)])
}
Add(MainForm,16126581,161,98)
{
Left=35
Top=105
Visible=1
Position=2
Point(doShowModal)
}
END_SDK
Add(Button,2544289,651,329)
{
Left=195
Top=135
Width=395
Caption="Вызов модальной формы"
link(onClick,3543069:doWork1,[])
}


Редактировалось 1 раз(а), последний 2019-05-30 16:58:29
карма: 10

0
Ответов: 4621
Рейтинг: 746
#23: 2019-05-30 17:04:21 ЛС | профиль | цитата
Да, пока непонятно как оно работает. Точнее, глянул код: оно не предназначено для центрирования, а для отсчета координат Left/Top.
Поэтому туда напрашивается ещё пара пунктов - OwnerFormCenter, MainFormCenter

sla8a писал(а):
И если с poNone и poCenter интуитивно понятно, то что делает poOwner даже после различных экспериментов не понять.
Надо было бы обозвать poCenter=ScreenCenter, poOwner=OwnerForm.

Редактировалось 2 раз(а), последний 2019-05-30 17:07:59
карма: 26

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#24: 2019-05-30 17:47:23 ЛС | профиль | цитата
sla8a писал(а):
вы предлагаете чтоб doCenterPos проверял еще и класс для выравнивая элементов в групповом боксе?

Я просто констатировал факт, и ничего более
карма: 22

0
Ответов: 2193
Рейтинг: 673
#25: 2019-05-30 17:50:35 ЛС | профиль | цитата
Netspirit, давайте закончим с doCenterPos.
Осталось решить следующее:
1. При выравнивании в ChildGroupBox: Группа элементов учитывать высоту рамки или нет.
2. При doCenterPos дочерней формы центрировать по центру экрана или родительской формы.

По 1 пункту думаю не нужно заморачиваться, так как мало вероятно что понадобится такое в реальных задачах.
По 2 пункту думаю нужно выравнивать по родительской форме. Центрированием формы по экрану справляется свойство Position = poCentre (Позиционирование формы на экране). А для выравнивания по центру формы сделать doCenterPos (Центрирует элемент относительно родительского элемента)

--- Добавлено в 2019-05-30 17:52:36

nesco писал(а):
Я просто констатировал факт, и ничего более
Как писал выше мало вероятно что кому то потребуется выравнивать один элемент по центру в групповом боксе. А чтоб этого достигнуть нужно учитывать размер шрифта. Как по мне не стоит шкурка выделки.

Редактировалось 1 раз(а), последний 2019-05-30 17:52:36
карма: 10

0
Ответов: 263
Рейтинг: 18
#26: 2019-05-30 17:56:51 ЛС | профиль | цитата
sla8a писал(а):
1. При выравнивании в ChildGroupBox: Группа элементов учитывать высоту рамки или нет.
2. При doCenterPos дочерней формы центрировать по центру экрана или родительской формы.

Абсолютно с Вами согласен.
1. Не точное центрирование, как говорится, на полет не влияет.
2. На то оно и центрирование относительно родительского элемента.

Редактировалось 1 раз(а), последний 2019-05-30 17:57:43
карма: 3

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#27: 2019-05-30 18:01:35 ЛС | профиль | цитата
sla8a писал(а):
Как по мне не стоит шкурка выделки.

Да забей на это, оно того не стоит.
карма: 22

0
Ответов: 4621
Рейтинг: 746
#28: 2019-05-30 18:02:57 ЛС | профиль | цитата
sla8a писал(а):
А для выравнивания по центру формы сделать doCenterPos
Предпочитаю добавить в Position 2 пункта: poOwnerCenter и poMainCenter, и забыть о doCenterPos для формы. Уже пробую. Если же очень надо расположить одно окно по центру другого - можно когда-то добавить метод doCenterWin в компонент MoveWindow - "расположить окно с хендлом 1 по центру окна с хендлом 2".

Редактировалось 2 раз(а), последний 2019-05-30 18:03:31
карма: 26

0
Ответов: 2193
Рейтинг: 673
#29: 2019-05-30 19:52:57 ЛС | профиль | цитата
Netspirit писал(а):
Если же очень надо расположить одно окно по центру другого - можно когда-то добавить
Да поймите что вопрос не стоит надо или нет добавить. Вопрос в том как должно работать событие doCenterPos. И вы рассуждаете с позиции разработчика и совсем забываете о обычных пользователях. Тех кто не лезет в код и не видит почему одно работает, а другое нет. Дочернее окно как и панель находятся в одной вкладке, имеют одинаковый тип (контейнер), имеют одинаковое событие doCenterPos. Но вот одно выравнивается по центру формы, а другое по центру экрана. Не объясняйте мне почему так, я это знаю. Как по мне так doCenterPos должен выравнивать и дочерние окна по центру формы. Этот вариант более логичный.
Add(MainForm,2953706,490,224)
{
Width=371
Height=238
}
Add(ChildForm,5572014,623,357)
{
}
BEGIN_SDK
Add(EditMulti,1593009,21,21)
{
WorkCount=1
link(doWork1,7417765:doCenterPos,[(101,27)(101,160)])
}
Add(MainForm,7417765,189,126)
{
Left=500
Top=105
Point(doCenterPos)
}
END_SDK
Add(ChildPanel,8052731,406,357)
{
}
BEGIN_SDK
Add(EditMulti,6045010,21,21)
{
WorkCount=1
link(doWork1,12846400:doCenterPos,[(84,27)(84,132)])
}
Add(Panel,12846400,147,119)
{
Left=165
Top=100
Point(doCenterPos)
}
END_SDK
Add(Button,7550213,336,329)
{
Left=5
Top=5
link(onClick,8052731:doWork1,[(387,335)(387,363)])
}
Add(Button,5946153,553,322)
{
Left=5
Top=30
link(onClick,5572014:doWork1,[(604,328)(604,363)])
}
Add(InfoTip,11762337,322,273)
{
Info=#48:Это выравнивает по центру родительского элемента|
Frame=2
Width=176
Height=123
}
Add(InfoTip,9694159,511,273)
{
Info=#50:И это выравнивает по центру родительского элемента|
Frame=2
Width=176
Height=123
}
Add(InfoTip,455895,322,399)
{
Info=#104:Логично предположить что форма является родительским элементом и что оба элемента центрируются по форме.|
Frame=2
Transparent=1
Width=365
Height=53
}

Редактировалось 1 раз(а), последний 2019-05-30 19:53:56
карма: 10

0
Ответов: 4621
Рейтинг: 746
#30: 2019-05-31 12:37:32 ЛС | профиль | цитата
Вот что я предлагаю в MainForm.Position.

Свойство Position теперь выглядит так:
Position=Позиционирование формы на экране при создании. poNone/poOwnerForm - расположить согласно свойств Left/Top относительно левого верхнего угла экрана/родительской формы соответственно. poScreenCenter/poOwnerCenter/poMainCenter - расположить по центру экрана/родительской/главной формы соответственно|14|0|poNone,poScreenCenter,poOwnerForm,poOwnerCenter,poMainCenter

Тогда можно забыть о doCenterPos для формы. Муляет глаза? Можно отключить в *.ini.

Редактировалось 2 раз(а), последний 2019-07-12 15:24:57
карма: 26

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