Вверх ↑
Этот топик читают: Гость
Ответов: 263
Рейтинг: 18
#1: 2019-05-29 19:00:09 ЛС | профиль | цитата
Хочу чтобы ChildGroupBox оставался в центре основной формы не зависимо от размеров\положения таковой. При использовании метода doCenterPos в компоненте ChildGroupBox центрирование корректно происходит только если основная форма расположена у левого верхнего края (X=0, Y=0). В чем проблема не пойму, тестировал, как всегда, на 3-х компьютерах (Win8x64 и Server 2012r2).

Add(MainForm,2953706,77,105)
{
Width=188
Height=189
Point(onResize)
link(onCreate,15832730:doWork2,[])
link(onResize,15832730:doWork3,[(125,132)])
}
Add(ChildGroupBox,3090827,140,105)
{
}
BEGIN_SDK
Add(EditMulti,4145507,21,21)
{
WorkCount=1
link(doWork1,10199545:doCenterPos,[(105,27)(105,69)])
}
Add(GroupBox,10199545,189,63)
{
Left=10
Top=5
Point(doCenterPos)
}
END_SDK
Add(HubEx,15832730,121,119)
{
Angle=3
link(onEvent,3090827:doWork1,[(125,111)])
}


Как глючит

--- Добавлено в 2019-05-29 19:11:16

Проблема проявляется во всех (перепробовал несколько) визуальных компонентах.

Редактировалось 3 раз(а), последний 2019-05-29 19:11:16
карма: 3

1
Голосовали:sla8a
Ответов: 196
Рейтинг: 43
#2: 2019-05-29 21:33:58 ЛС | профиль | цитата
fox-video, Используй точки doLeft, doTop и рассчитывай координаты вручную.

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

0
Ответов: 8926
Рейтинг: 823
#3: 2019-05-29 21:59:56 ЛС | профиль | цитата
fox-video, если затрудняетесь
halt писал(а):
рассчитывай координаты вручную
то вот :
Подсказка


Add(MainForm,9659354,196,70)
{
Width=188
Height=189
Point(onResize)
Point(Width)
Point(Height)
Point(SizeHeader)
link(onCreate,5727342:doWork1,[(242,90)])
link(onResize,5727342:doWork2,[])
}
Add(ChildGroupBox,3090827,308,84)
{
}
BEGIN_SDK
Add(EditMulti,4145507,21,21)
{
WorkCount=2
VarCount=2
link(doWork1,10199545:doLeft,[(179,27)(179,69)])
link(Var1,10199545:Width,[(27,103)(195,103)])
link(Var2,10199545:Height,[(34,110)(202,110)])
link(doWork2,10199545:doTop,[(172,34)(172,76)])
}
Add(GroupBox,10199545,189,63)
{
Left=100
Top=50
Point(doLeft)
Point(doTop)
Point(Width)
Point(Height)
}
END_SDK
Add(MathParse,12396599,196,147)
{
MathStr="(%1 - %2)/2 - 5"
ResultType=0
link(onResult,3090827:doWork1,[(288,153)(288,90)])
link(X1,9659354:Width,[])
link(X2,3090827:Var1,[(209,139)(314,139)])
}
Add(MathParse,14450096,238,161)
{
DataCount=3
MathStr="(%1 - %2 - %3)/2"
ResultType=0
link(onResult,3090827:doWork2,[(295,167)(295,97)])
link(X1,9659354:Height,[(244,131)(209,131)])
link(X2,9659354:SizeHeader,[(251,124)(216,124)])
link(X3,3090827:Var2,[(258,145)(321,145)])
}
Add(Hub,401342,161,147)
{
link(onEvent1,12396599:doCalc,[])
link(onEvent2,14450096:doCalc,[(186,160)(186,167)])
}
Add(HubEx,5727342,238,91)
{
Angle=1
link(onEvent,401342:doEvent1,[(242,111)(151,111)(151,153)])
}

карма: 19

0
Ответов: 2265
Рейтинг: 676
#4: 2019-05-30 02:37:56 ЛС | профиль | цитата
fox-video, если есть желание протестируйте следующие.
В папке HiAsm в файле \Elements\delphi\code\Win.pas измените 428 и 429 строку. Сохраните файл.
Сейчас этот участок выглядит так:
procedure THIWin._work_doCenterPos;
begin
if Assigned(FParent) then
begin
Control.Left := max((FParent.Left + (FParent.Width - Control.Width) div 2), 0);
Control.Top := max((FParent.Top + (FParent.Height - Control.Height) div 2), 0);
end
else
begin
Control.Left := (ScreenWidth - Control.Width) div 2;
Control.Top := (ScreenHeight - Control.Height) div 2;
end;
end;
Нужно сделать так:
procedure THIWin._work_doCenterPos;
begin
if Assigned(FParent) then
begin
Control.Left := (FParent.Width - Control.Width) div 2;//тестирование!!!
Control.Top := (FParent.Height - Control.Height) div 2;//тестирование!!!
end
else
begin
Control.Left := (ScreenWidth - Control.Width) div 2;
Control.Top := (ScreenHeight - Control.Height) div 2;
end;
end;

Схема

Add(MainForm,15464483,315,175)
{
Width=188
Height=189
Point(onResize)
Point(onMove)
link(onCreate,15832730:doWork2,[])
link(onResize,1584626:doWork2,[])
link(onMove,1584626:doWork3,[(363,209)])
}
Add(ChildGroupBox,3090827,378,175)
{
}
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=10
Top=5
Width=228
Height=213
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=35
Top=105
Point(doCenterPos)
}
END_SDK
Add(Hub,7970121,126,63)
{
link(onEvent1,10199545:doCenterPos,[])
link(onEvent2,13219045:doWork1,[(168,76)(168,132)])
}
END_SDK
Add(HubEx,15832730,359,189)
{
Angle=3
link(onEvent,3090827:doWork1,[(363,181)])
}
Add(HubEx,1584626,359,196)
{
Angle=3
link(onEvent,15832730:doWork3,[])
}

Если что не понятно спрашивайте. После тестирования верните файл Win.pas в предыдущее состояние.

Леонид, halt, вот ТС создал тему в соответствующем разделе, подробно описал суть проблемы, выложил и схему и гифку. И вот не понятно зачем вы решение этой проблемы предлагаете решить таким способом.

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

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#5: 2019-05-30 04:10:58 ЛС | профиль | цитата
Действительно, ведет себя неадекватно. Надо бы добавить правку. sla8a, ты как считаешь?
карма: 22

0
Ответов: 263
Рейтинг: 18
#6: 2019-05-30 05:00:04 ЛС | профиль | цитата
sla8a, после правки Win.pas центрирование работает корректно! Спасибо.

halt, Леонид, спасибо за подсказку, я и сам так делал. Ну, не так изящно как Леонид
Пока занимался этим проектом,
открыл для себя новый метод компонента doCenterPos. Теперь не вижу смысла городить огород с ручным расчетом координат.


Демо видео

sla8a, мне кажется или центр несколько смещен к низу?

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

0
Ответов: 2265
Рейтинг: 676
#7: 2019-05-30 11:11:06 ЛС | профиль | цитата
fox-video писал(а):
мне кажется или центр несколько смещен к низу?
Так и есть. Надо разобраться почему.
nesco писал(а):
Надо бы добавить правку. sla8a, ты как считаешь?

nesco, но не в том виде что выложено мной выше. На сколько разобрался, то doCenterPos изначально делался для формы и вот такой пример работает правильно:
Add(MainForm,2953706,259,161)
{
Position=1
Point(onResize)
Point(onMove)
link(onCreate,5696187:doWork1,[(305,181)])
link(onResize,5696187:doWork2,[])
link(onMove,5696187:doWork3,[(305,195)])
}
Add(ChildForm,200345,315,182)
{
}
BEGIN_SDK
Add(EditMulti,6676678,21,21)
{
WorkCount=1
Width=650
Height=389
link(doWork1,2063398:doCenterPos,[(168,27)(168,181)])
}
Add(MainForm,2063398,315,147)
{
Left=35
Top=105
Width=291
Height=191
Point(doCenterPos)
}
END_SDK
Add(HubEx,5696187,301,182)
{
link(onEvent,200345:doWork1,[])
}
А нужно чтоб корректно работала как минимум такая схема:
Add(MainForm,2953706,455,224)
{
Width=459
Height=348
Point(onMove)
Point(onResize)
link(onCreate,2282380:doWork1,[(515,244)])
link(onMove,2282380:doWork2,[])
link(onResize,2282380:doWork3,[(515,258)])
}
Add(ChildForm,9700354,539,245)
{
}
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=213
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
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,511,245)
{
link(onEvent,9700354:doWork1,[])
}

Редактировалось 1 раз(а), последний 2019-05-30 11:12:59
карма: 11

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#8: 2019-05-30 12:43:28 ЛС | профиль | цитата
sla8a писал(а):
Надо разобраться почему

Из-за наличия на форме Header-a и Border-ов.

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

0
Ответов: 4630
Рейтинг: 749
#9: 2019-05-30 13:52:00 ЛС | профиль | цитата
nesco писал(а):
Из-за наличия на форме Header-a и Border-ов.
Попробуй:
Control.Left := (FParent.ClientWidth - Control.Width) div 2;//тестирование!!!
Control.Top := (FParent.ClientHeight - Control.Height) div 2;//тестирование!!!

карма: 26

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#10: 2019-05-30 14:00:29 ЛС | профиль | цитата
Netspirit писал(а):
Попробуй:

Да, это то, что доктор прописал Точно в центре отображает.
карма: 22

0
Ответов: 263
Рейтинг: 18
#11: 2019-05-30 14:10:07 ЛС | профиль | цитата
Netspirit писал(а):
Попробуй:

Да, точно в центре. Спасибо Вам!
карма: 3

0
Ответов: 2265
Рейтинг: 676
#12: 2019-05-30 14:35:36 ЛС | профиль | цитата
Netspirit, nesco, давайте уточним мы подгоняем doCenterPos под конкретную задачу для fox-video или будем учитывать чтоб:
sla8a писал(а):
корректно работала как минимум такая схема:

А панель тоже в центре группы элементов?
Add(MainForm,15464483,448,175)
{
Width=447
Height=337
Position=1
Point(onResize)
Point(onMove)
link(onCreate,8832083:doWork1,[(487,195)])
link(onResize,8832083:doWork2,[])
link(onMove,8832083:doWork3,[(487,209)])
}
Add(ChildGroupBox,3090827,504,196)
{
}
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=10
Top=5
Width=228
Height=213
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=85
Top=20
Height=175
Point(doCenterPos)
}
END_SDK
Add(Hub,7970121,126,63)
{
link(onEvent1,10199545:doCenterPos,[])
link(onEvent2,13219045:doWork1,[(168,76)(168,132)])
}
END_SDK
Add(HubEx,8832083,483,196)
{
link(onEvent,3090827:doWork1,[])
}

--- Добавлено в 2019-05-30 14:57:11

Могу предложить такой вариант:

procedure THIWin._work_doCenterPos;
begin
if Assigned(FParent) then
if GetParent(Control.Handle) = FParent.Handle then
begin
if FParent = Control.ParentForm then
begin//родитель форма
Control.Left := (FParent.ClientWidth - Control.Width) div 2;
Control.Top := (FParent.ClientHeight - Control.Height) div 2;
end
else
begin//родитель контрол
Control.Left := (FParent.Width - Control.Width) div 2;
Control.Top := (FParent.Height - Control.Height) div 2;
end
end
else
begin//дочерняя форма
Control.Left := max((FParent.Left + (FParent.Width - Control.Width) div 2), 0);
Control.Top := max((FParent.Top + (FParent.Height - Control.Height) div 2), 0);
end
else
begin//форма
Control.Left := (ScreenWidth - Control.Width) div 2;
Control.Top := (ScreenHeight - Control.Height) div 2;
end;
end;

Редактировалось 2 раз(а), последний 2019-05-30 14:57:11
карма: 11

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#13: 2019-05-30 15:10:45 ЛС | профиль | цитата
sla8a писал(а):
Могу предложить такой вариант:

У тебя панель получилась не совсем посередине группового бокса как раз на величину смещения рамки
карма: 22

0
Ответов: 2265
Рейтинг: 676
#14: 2019-05-30 15:18:05 ЛС | профиль | цитата
nesco, вы предлагаете чтоб doCenterPos проверял еще и класс для выравнивая элементов в групповом боксе? А то так то по центру:
Add(MainForm,15464483,217,133)
{
Width=447
Height=337
Position=1
Point(onResize)
Point(onMove)
link(onCreate,8832083:doWork1,[(256,153)])
link(onResize,8832083:doWork2,[])
link(onMove,8832083:doWork3,[(256,167)])
}
Add(ChildGroupBox,3090827,273,154)
{
}
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=10
Top=5
Width=228
Height=213
Color=255
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=90
Top=15
Height=185
Point(doCenterPos)
}
END_SDK
Add(Hub,7970121,126,63)
{
link(onEvent1,10199545:doCenterPos,[])
link(onEvent2,13219045:doWork1,[(168,76)(168,132)])
}
END_SDK
Add(HubEx,8832083,252,154)
{
link(onEvent,3090827:doWork1,[])
}

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

0
Ответов: 4630
Рейтинг: 749
#15: 2019-05-30 15:46:15 ЛС | профиль | цитата
Не надо ничего проверять.

procedure THIWin._work_doCenterPos;
var
H: THandle;
R: TRect;
begin
H := GetParent(Control.Handle);

if (H <> 0) and GetClientRect(H, R) then
begin
Control.Left := (R.Right - Control.Width) div 2;
Control.Top := (R.Bottom - Control.Height) div 2;
end
else
begin
Control.Left := (ScreenWidth - Control.Width) div 2;
Control.Top := (ScreenHeight - Control.Height) div 2;
end;
end;
карма: 26

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