Улетевшее окно
Добавлено: 10 Ноябрь 2017, 14:06
Место общения программистов, форум разработчиков БД на Clarion
https://forum.clarionlife.net/
Код: Выделить всё
INIClass.Update PROCEDURE (STRING ProcedureName, WINDOW W)
Info LIKE(WindowInfo),AUTO
CODE
Info.Maximized = CHOOSE (W {PROP:Maximize} <> 0)
Info.Minimized = CHOOSE (W {PROP:Iconize} <> 0)
Info.X = _nopos
Info.Y = _nopos
Info.W = _nopos
Info.H = _nopos
IF NOT Info.Minimized AND NOT Info.Maximized
!Info.X = W {PROP:XPos}
!Info.Y = W {PROP:YPos}
!!! --- Коррекция координат
If InRange(Int(W {PROP:XPos}),0,1200) and InRange(Int(W {PROP:YPos}),0,1000)
Info.X = W {PROP:XPos}
Info.Y = W {PROP:YPos}
end
!!! ---
IF W {PROP:Resize}
Info.W = W {PROP:Width}
Info.H = W {PROP:Height}
END
END
SELF.UpdateWindowInfo (ProcedureName, Info)
RETURN
А там ссылка на архивчик на первой странице обсуждения, как раз процедуры установки обработчика и вызова GetIni-Putini. Если запрашивается параметр по имени xpos/ypos/width/height, производится правка
Код: Выделить всё
IF INLIST(UPPER(Loc:Param),'XPOS','YPOS','WIDTH','HEIGHT')
If 0{Prop:Mdi}
IsMdi=True
SetTarget(,1)
!------- Определение параметров клиентского окна фрейма
XClient = 0{Prop:ClientX}
Yclient = 0{Prop:ClientY}
Wclient = 0{Prop:ClientWidth}
HClient = 0{Prop:ClientHeight}
If WClient>0{Prop:Width}
Wclient = 0{Prop:Width}
End
IF HClient>0{Prop:Height}
HClient = 0{Prop:Height}
End
SetTarget
End
CASE Upper(Loc:Param)
Of 'XPOS'
POS# = In:S [EQ#+1 : Len(In:S)]
If pos#<0
Pos# = 20
ELSIF Pos#>(WClient-40)
Pos# = Wclient - 80
End
Return(POS#)
OF 'YPOS'
POS# = In:S [EQ#+1 : Len(In:S)]
If pos#<0
Pos# = 20
Elsif Pos#>(HClient-40)
Pos# = HClient - 80
End
Return(POS#)
OF 'WIDTH'
POS# = In:S [EQ#+1 : Len(In:S)]
If pos#<0
Pos# = 100
!Elsif Pos# > Wclient
! Pos# = Wclient
End
Return(POS#)
OF 'HEIGHT'
POS# = In:S [EQ#+1 : Len(In:S)]
If pos#<0
Pos# = 100
!Elsif Pos# > Hclient
! Pos# = Hclient
End
Return(POS#)
ELSE
Return(Clip(In:S [EQ#+1 : Len(In:S)]))
END
ELSE
Return(Clip(In:S [EQ#+1 : Len(In:S)]))
END
End
End
Понятен правильный ход: сохранить хендл AppFrame, при каждом открытии дочернего окна получить текущий размер AppFrame.
Код: Выделить всё
INIClass.Fetch PROCEDURE (STRING ProcedureName, WINDOW W)
Info LIKE(WindowInfo),AUTO
IsMax BYTE,AUTO
CODE
SELF.FetchWindowInfo (ProcedureName, Info)
IF Info.Got
IsMax = W {PROP:Maximize}
IF NOT Info.Maximized AND IsMax
W {PROP:Maximize} = FALSE
END
SetTarget(,1)
XClient# = 0{Prop:ClientX}
YClient# = 0{Prop:ClientY}
WClient# = 0{Prop:ClientWidth}
HClient# = 0{Prop:ClientHeight}
SetTarget
IF INRANGE(Info.X,XClient#,XClient#+WClient#)
W {PROP:XPos} = Info.X
END
IF INRANGE(Info.Y,YClient#,YClient#+HClient#)
W {PROP:YPos} = Info.Y
END
IF W {PROP:Resize}
IF Info.W <> _nopos
W {PROP:Width} = Info.W
END
IF Info.H <> _nopos
W {PROP:Height} = Info.H
END
END
IF Info.Maximized AND NOT IsMax
W {PROP:Maximize} = TRUE
END
W {PROP:Iconize} = Info.Minimized
END