Вверх ↑
Этот топик читают: Гость
Ответов: 5124
Рейтинг: 578
#31: 2022-01-14 17:00:34 ЛС | профиль | цитата
nesco писал(а):
Так откуда ты его вызываешь?



WM_SIZE: begin
SetAnchors;
//Control.Update;
end;
...

procedure THIWin._onResize;
var
i: integer;
begin
for i := 0 to Control.ChildCount-1 do
SendMessage(Control.Children[i].Handle, WM_SIZE,0,0);

_hi_OnEvent(_event_onResize);
end;
пробовал на свою месагу зацепить, лажает

nesco писал(а):
А свойства MinMax ты применяешь к методам KOL, или они только в твоем методе работают, а как они тогда на форме работают?

коловские не работают х.з почему, поэтому такая шляпа

поправил так


procedure THIWin.SetAnchors;
var
w,h,d: integer;
begin
Control.BeginUpdate;
if Control.Align = caNone then
begin
//if not Control.HandleAllocated then Exit;

// один раз инициализируем и пользуемся
// в Init Control.Parent. Width и Height не работают !
if not InitSize then
begin
FOldTop := _prop_Top;
FOldLeft := _prop_Left;
FOldRight := Control.Parent.Width - (_prop_Left+_prop_Width);
FOldBottom := Control.Parent.Height - (_prop_Top+_prop_Height);
FOldWidth := _prop_Width;
FOldHeight := _prop_Height;
InitSize := True;
end;

if _prop_akRight then
begin
w := FParent.Width - (FOldLeft+FOldRight);
h := Control.Height;
if not _prop_akLeft then
begin
d := FParent.Width - (FOldWidth + FOldRight);
SetWindowPos(Control.Handle, 0, d, [b]Control.Top[/b], FOldWidth, h, SWP_NOZORDER);
end else
SetWindowPos(Control.Handle, 0, FOldLeft, [b]Control.Top[/b], w, h, SWP_NOZORDER);
end;

if _prop_akBottom then
begin
w := Control.Width;
h := FParent.Height - (FOldTop+FOldBottom);
if not _prop_akTop then
begin
d := FParent.Height - (FOldHeight+FOldBottom);
SetWindowPos(Control.Handle, 0, Control.Left, d, w, fOldHeight, SWP_NOZORDER);
end else
SetWindowPos(Control.Handle, 0, Control.Left, Control.Top, w, h, SWP_NOZORDER);
end;

end else begin

case _prop_MaxHeight of
0:;
else if Control.Height > _prop_MaxHeight then Control.Height := _prop_MaxHeight; end;

case _prop_MinHeight of
0:;
else if Control.Height < _prop_MinHeight then Control.Height := _prop_MinHeight; end;

case _prop_MaxWidth of
0:;
else if Control.Width > _prop_MaxWidth then Control.Width := _prop_MaxWidth; end;

case _prop_MinWidth of
0:;
else if Control.Width < _prop_MinWidth then Control.Width := _prop_MinWidth; end;

end;

Control.EndUpdate;
end;

--- Добавлено в 2022-01-14 17:01:59

это нужно обязательно поправить
if _prop_akRight then
begin
w := FParent.Width - (FOldLeft+FOldRight);
h := Control.Height;
if not _prop_akLeft then
begin
d := FParent.Width - (FOldWidth + FOldRight);
SetWindowPos(Control.Handle, 0, d, Control.Top, FOldWidth, h, SWP_NOZORDER);
end else
SetWindowPos(Control.Handle, 0, FOldLeft, Control.Top, w, h, SWP_NOZORDER);
end;

--- Добавлено в 2022-01-14 17:05:51

nesco писал(а):
Странно, почему у тебя инициализация в Init не работает, у меня работает прекрасно.

х.з Handle разные а размер один и тот же что для формы что для панели на ней. Соответственно и детки в этой панели балдеют

Редактировалось 2 раз(а), последний 2022-01-14 17:05:51
карма: 5
0
Разработчик
Ответов: 26048
Рейтинг: 2110
#32: 2022-01-14 17:13:11 ЛС | профиль | цитата
В коде внутренние переменные ни в пень не уперлись, код Anchors вообще смешной получился
  if _prop_akRight then
if not _prop_akLeft then
SetWindowPos(Control.Handle, 0, FParent.Width - (fOldWidth + fOldRight), Control.Top, fOldWidth, Control.Height, SWP_NOZORDER)
else
SetWindowPos(Control.Handle, 0, fOldLeft, Control.Top, FParent.Width - (fOldLeft + fOldRight), Control.Height, SWP_NOZORDER);

if _prop_akBottom then
if not _prop_akTop then
SetWindowPos(Control.Handle, 0, Control.Left, FParent.Height - (fOldHeight + fOldBottom), Control.Width, fOldHeight, SWP_NOZORDER)
else
SetWindowPos(Control.Handle, 0, Control.Left, Control.Top, Control.Width, fParent.Height - (fOldTop + fOldBottom), SWP_NOZORDER);


--- Добавлено в 2022-01-14 17:18:03

andrestudio писал(а):
х.з Handle разные а размер один и тот же что для формы что для панели на ней. Соответственно и детки в этой панели балдеют

Ага, понял, проверю.

--- Добавлено в 2022-01-14 17:21:12

andrestudio писал(а):
пробовал на свою месагу зацепить, лажает

Странно, на моей работает, но я вызываю не через Resize:
      WM_WINDOWPOSCHANGED:
if (Control.ChildCount <> 0) then
for i := 0 to Control.ChildCount - 1 do
if (Control.Children[i].Align = caNone) and (_prop_akLeft or _prop_akTop or _prop_akRight or _prop_akBottom) and (Split = nil) and (fLayout = nil) then
Sendmessage(Control.Children[i].Handle, US_SETANCHORS, 0, 0);
Конечное условие стоит специально, чтобы лишний раз не нагружать обработчик

Редактировалось 6 раз(а), последний 2022-01-14 17:23:14
карма: 22

0
Ответов: 5124
Рейтинг: 578
#33: 2022-01-14 17:30:10 ЛС | профиль | цитата
nesco, обрати внимание где я жирным отметил иначе при _prop_akTop := False картинка тебя не порадует
карма: 5
0
Разработчик
Ответов: 26048
Рейтинг: 2110
#34: 2022-01-14 17:33:10 ЛС | профиль | цитата
andrestudio писал(а):
_prop_akTop := False картинка тебя не порадует

А у меня что с fOldTop, что с Control.Top, при включении смещает окно вниз и уменьшает размер. И проблема, похоже, не в смещении, а в размере

А почему ты Control.Top воткнул в ckRight, ckLeft, срабатывание смещения происходит же при включении ckTop, ckBottom

Редактировалось 4 раз(а), последний 2022-01-14 17:46:13
карма: 22

0
Ответов: 5124
Рейтинг: 578
#35: 2022-01-14 17:44:46 ЛС | профиль | цитата
О, дак ты только на форме эксперименты ставишь
А в панелях ещё и пробовал что ли
InitSize не в Init у меня только из за того про что я уже писал.
карма: 5
0
Разработчик
Ответов: 26048
Рейтинг: 2110
#36: 2022-01-14 17:46:52 ЛС | профиль | цитата
andrestudio писал(а):
О, дак ты только на форме эксперименты ставишь
А в панелях ещё и пробовал что ли
InitSize не в Init у меня только из за того про что я уже писал.

Пока ставил на формах, теперь прогоню и на панелях

--- Добавлено в 2022-01-14 17:59:36

Нашел, почему глючит. На форме сглючил KOLвский MaxHeight, выключил, и все заработало

Редактировалось 2 раз(а), последний 2022-01-14 18:00:12
карма: 22

0
Ответов: 5124
Рейтинг: 578
#37: 2022-01-14 18:01:46 ЛС | профиль | цитата
Такой пример у тебя будет работать

Add(MainForm,2953706,91,133)
{
Width=735
Height=535
akLeft=0
akTop=0
}
Add(ChildPanel,7261161,164,131)
{
}
BEGIN_SDK
Add(EditMulti,4641733,21,21)
{
Width=370
Height=193
}
Add(Panel,4176733,35,105)
{
Width=362
Height=309
Align=1
akRight=1
akBottom=1
MinWidth=200
ModeSp=1
}
Add(Button,15373997,182,105)
{
Left=15
Top=245
Width=80
Height=35
akTop=0
akBottom=1
MinWidth=40
}
Add(Edit,3269673,126,49)
{
Left=15
Top=15
Width=325
akRight=1
}
Add(Edit,9510243,203,42)
{
Left=115
Top=50
Width=225
akLeft=0
akRight=1
Point(onResize)
}
Add(Memo,11265532,231,105)
{
Left=115
Top=85
Width=225
Height=195
akRight=1
akBottom=1
Point(onResize)
}
END_SDK
Add(ChildPanel,273248,287,133)
{
}
BEGIN_SDK
Add(EditMulti,1232796,21,21)
{
}
Add(Panel,15113244,35,105)
{
Top=309
Width=727
Height=194
Align=4
ModeSp=1
}
Add(Memo,9581285,214,72)
{
Left=25
Top=20
Width=680
Height=150
akRight=1
akBottom=1
}
END_SDK
Add(ChildPanel,13726455,224,133)
{
}
BEGIN_SDK
Add(EditMulti,4316042,21,21)
{
}
Add(Panel,14749566,35,105)
{
Left=362
Width=365
Height=309
Align=5
}
Add(Memo,10621659,14,21)
{
Left=15
Top=20
Width=330
Height=170
akRight=1
akBottom=1
}
Add(Memo,6990560,21,217)
{
Left=15
Top=210
Width=245
akTop=0
akRight=1
akBottom=1
}
Add(Button,11357664,287,210)
{
Left=290
Top=210
Height=30
akLeft=0
akTop=0
akRight=1
akBottom=1
}
Add(Button,15622996,310,267)
{
Left=290
Top=255
Height=30
akLeft=0
akTop=0
akRight=1
akBottom=1
}
END_SDK

карма: 5
0
Разработчик
Ответов: 26048
Рейтинг: 2110
#38: 2022-01-14 18:20:57 ЛС | профиль | цитата
andrestudio писал(а):
Такой пример у тебя будет работать

Нет, не работает, и даже когда инициализацию из Init в метод перетащил. Метод срабатывает, но никуда ничего внутри панелей не меняет.

--- Добавлено в 2022-01-14 18:37:37

Млин, но там же Anchors не назначен. Назначил Anchors элементам в верхней левой панели, заработало



Установил на всех, заработали все



--- Добавлено в 2022-01-14 19:09:04

Перетащил инициализацию обратно в Init, не заметил никакой разницы.

Редактировалось 3 раз(а), последний 2022-01-14 19:09:04
карма: 22

0
Ответов: 5124
Рейтинг: 578
#39: 2022-01-14 19:45:37 ЛС | профиль | цитата
У меня работает
в твоём коде условие верное
if (Control.Children[i].Align = caNone) and (_prop_akLeft or _prop_akTop or _prop_akRight or _prop_akBottom) and (Split = nil) and (fLayout = nil) then

_prop_akLeft or _prop_akTop и при False должно работать

Редактировалось 1 раз(а), последний 2022-01-14 19:46:43
карма: 5
0
Разработчик
Ответов: 26048
Рейтинг: 2110
#40: 2022-01-14 19:57:37 ЛС | профиль | цитата
Скорее всего, надо будет выкинуть это условие или пересмотреть его с учетом постоянства включенного akLeft и akTop.
andrestudio писал(а):
У меня работает

А у меня и не должен был работать, тк дефолтные установки я сделал
akLeft=true
akTop=true
akRight=false
akBottom=false
А у тебя они в схеме нигде не прописаны, вот и взяло мои дефолтные, да и ты сам же писал
andrestudio писал(а):
по умолчанию akLeft и akTop должны быть True

Но вот почему у тебя не работает инициализация в Init, а у меня работает? Нужен пример, работающий в одном случае, и не работающий в другом.

--- Добавлено в 2022-01-14 20:20:13

Я еще один момент не просек в твоем коде. Как будет срабатывать akLeft и akTop, если akRight и akBottom будут отключены и не пропустят для выполнения методов akLeft и akTop? Те, при выключенных akRight и akBottom ничего срабатывать не будет, вне зависимости от установок. Только что поставил debug и проверил, так и есть. Надо будет пересмотреть немного код.

Редактировалось 13 раз(а), последний 2022-01-14 20:28:39
карма: 22

0
Ответов: 5124
Рейтинг: 578
#41: 2022-01-14 21:04:56 ЛС | профиль | цитата
так и у меня такие же по дефолту, ничего не понимаю.
nesco, не знаю, у меня работает как положено, даже меньше дребезга с артефактами сравнимо с прежним кодом (комп у меня старый)
Можно конечно ещё с флагами поэксперементировать но завтра наверно, чёт сегодня уже поднадоело...
карма: 5
0
Разработчик
Ответов: 26048
Рейтинг: 2110
#42: 2022-01-15 05:08:45 ЛС | профиль | цитата
andrestudio писал(а):
так и у меня такие же по дефолту, ничего не понимаю.

Да все просто. У тебя похоже, что так назначены свойства
akLeft=Закрепить слева|14|1|False,True
akTop=Закрепить сверху|14|1|False,True
akRight=Закрепить справа|14|0|False,True
akBottom=Закрепить снизу|14|0|False,True
а у меня они назначены вот так
akLeft=Закрепить слева|14|0|True,False
akTop=Закрепить сверху|14|0|True,False
akRight=Закрепить справа|14|1|True,False
akBottom=Закрепить снизу|14|1|True,False
как во всем WinControl.ini, кстати. Ну не буду же я отдельно делать по-другому, путаница потом начнется, пусть я с этим и не совсем согласен.
Для проверки я сделал по-твоему, и твой пример заработал без всяких танцев с бубнами.

Редактировалось 2 раз(а), последний 2022-01-15 05:11:24
карма: 22

0
Ответов: 5124
Рейтинг: 578
#43: 2022-01-15 08:49:09 ЛС | профиль | цитата
nesco, так и есть
Блин я тогда конечно переделаю у себя.

--- Добавлено в 2022-01-15 09:06:05

nesco, всё переделал. Самое интересное думал будет полная инверсия в схеме а оказалось что на всех элементах просто дефолтные установки
вот расширил пример, сейчас у тебя должно работать.

Add(MainForm,2953706,42,56)
{
Width=735
Height=530
MinWidth=735
MinHeight=530
}
Add(ChildPanel,7261161,91,56)
{
}
BEGIN_SDK
Add(EditMulti,4641733,21,21)
{
Width=223
Height=151
}
Add(Panel,4176733,35,105)
{
Width=362
Height=306
Align=1
ModeSp=1
SizeSp=6
ColorSp=8421504
MinOwn=250
MinRest=350
BorderWidth=0
BevelInner=1
BevelOuter=1
BevelWidth=0
}
Add(Button,15373997,84,105)
{
Left=280
Top=265
Width=60
Height=30
akLeft=1
akTop=1
akRight=0
akBottom=0
MinWidth=40
}
Add(Edit,3269673,35,49)
{
Left=15
Top=15
Width=325
akRight=0
Text="akLeft=True akTop=True akRight=True akBottom=False"
}
Add(Edit,9510243,84,49)
{
Left=120
Top=50
Width=220
akLeft=1
akRight=0
MinWidth=150
Text="akLeft=False akRight=True"
Point(onResize)
}
Add(Memo,11265532,140,42)
{
Left=15
Top=85
Width=325
Height=170
akRight=0
akBottom=0
Strings=#12:akLeft=True |11:akTop=True |13:akRight=True |13:akBottom=True|
Point(onResize)
}
Add(CheckBox,1217204,140,105)
{
Left=155
Top=275
Width=105
akLeft=1
akTop=1
akRight=0
akBottom=0
}
END_SDK
Add(ChildPanel,13726455,133,56)
{
}
BEGIN_SDK
Add(EditMulti,4316042,21,21)
{
Width=272
Height=144
}
Add(Panel,14749566,35,105)
{
Left=362
Width=365
Height=306
Align=5
BorderWidth=0
BevelInner=1
BevelOuter=1
BevelWidth=0
}
Add(Memo,10621659,98,98)
{
Left=15
Top=90
Width=335
Height=120
akRight=0
akBottom=0
Strings=#12:akLeft=True |11:akTop=True |13:akRight=True |13:akBottom=True|
}
Add(Memo,6990560,147,98)
{
Left=15
Top=225
Width=265
Height=70
akTop=1
akRight=0
akBottom=0
Strings=#12:akLeft=True |12:akTop=False |13:akRight=True |13:akBottom=True|
}
Add(Button,11357664,196,112)
{
Left=295
Top=225
Height=30
akLeft=1
akTop=1
akRight=0
akBottom=0
}
Add(Button,15622996,238,112)
{
Left=295
Top=265
Height=30
akLeft=1
akTop=1
akRight=0
akBottom=0
}
Add(Edit,7020252,98,42)
{
Left=15
Top=15
Width=335
akRight=0
Text="akLeft=True akTop=True akRight=True akBottom=False"
}
Add(ComboBox,7498199,147,35)
{
Left=15
Top=50
Width=155
Height=24
akRight=0
Text="akLeft=True akTop=True akRight=True akBottom=False"
}
Add(ComboBox,6051679,196,35)
{
Left=190
Top=50
Width=160
Height=24
akLeft=1
akRight=0
Text="akLeft=False akRight=True"
}
END_SDK
Add(ChildPanel,1959005,175,56)
{
}
BEGIN_SDK
Add(EditMulti,251293,21,21)
{
Width=216
Height=137
}
Add(Panel,5454445,35,105)
{
Top=448
Width=727
Align=4
WinStyle=1
BevelInner=0
}
Add(Button,13039128,35,49)
{
Left=540
Top=10
Height=30
akLeft=1
akTop=1
akRight=0
akBottom=0
}
Add(Button,14561637,77,49)
{
Left=600
Top=10
Height=30
akLeft=1
akTop=1
akRight=0
akBottom=0
}
Add(Button,12168732,119,49)
{
Left=660
Top=10
Height=30
akLeft=1
akTop=1
akRight=0
akBottom=0
}
END_SDK
Add(ChildPanel,273248,217,56)
{
}
BEGIN_SDK
Add(EditMulti,1232796,21,21)
{
Width=153
Height=109
}
Add(Panel,15113244,35,49)
{
Top=306
Width=727
Height=142
Align=4
ModeSp=1
SizeSp=6
ColorSp=8421504
MinOwn=100
MinRest=300
BorderWidth=0
BevelInner=1
BevelOuter=1
BevelWidth=0
}
Add(Memo,9581285,95,44)
{
Left=10
Top=10
Width=705
Height=120
akRight=0
akBottom=0
Strings=#12:akLeft=True |11:akTop=True |13:akRight=True |13:akBottom=True|
}
END_SDK


--- Добавлено в 2022-01-15 09:11:19

Думается что всё же переменные лучше переименовать с FOld... на FDef... (это мой заскок с прошлой серии)

Редактировалось 2 раз(а), последний 2022-01-15 09:11:19
карма: 5
0
Ответов: 5124
Рейтинг: 578
#44: 2022-01-15 11:01:56 ЛС | профиль | цитата
перетащил InitSize в Init всё само сабой заработало, ни х.. не понял конечно но порадовало
карма: 5
0
Ответов: 5124
Рейтинг: 578
#45: 2022-01-15 12:02:25 ЛС | профиль | цитата
Зацепил на свою мессагу опять всё работает
карма: 5
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)