Ну, Уоррен П уже довольно убедительно указал вам в другом направлении, но я постараюсь ответить на ваш вопрос.Или не совсем.
Ваша правка теперь делает вопрос очень ясным:
Эффект более заметен, когда вы изменяете размеры от левой границы или даже от нижнего левого угла, он ужасен везде (Я пробовал с другими коммерческими приложениями, и это также происходит).Этот эффект также происходит, когда я изменяю на значительную границу, но он не такой ужасный, как когда я удаляю границу.
Этот эффект проявляется не только в других коммерческих приложениях, но и в каждом окне ОС.,Растяжение верхней части окна проводника также «скрывает» и «расширяет» строку состояния или нижнюю панель.Я почти уверен, что его невозможно победить.
Это может показаться хуже для формы без границ, но я думаю, что это просто оптический обман.
Если бы мне пришлось угадывать объяснение этого эффекта, тогда я бы сказал, что во время операции изменения размера обновление top и left имеет приоритет над изменением ширины и высоты, что приводит к тому, что оба обновления не обновляются одинаковое количество раз.Может быть, это связано с видеокартой.Или, может быть ... о чём я говорю?Это вне моей досягаемости.
Хотя я все еще не могу воспроизвести его для изменения размера правой и / или нижней части формы.Если количество элементов управления или (комбинация) их свойств align и anchor является проблемой, то вы можете временно отключить выравнивание, но я почти уверен, что вы этого тоже не хотите.Ниже мой тестовый код, скопированный из вопроса, слегка измененный и, конечно, с добавленными константами Sertac:
function TForm1.ResizableAt(X, Y: Integer): Boolean;
const
BorderBuffer = 5;
var
R: TRect;
C: TCursor;
begin
SetRect(R, 0, 0, Width, Height);
InflateRect(R, -BorderBuffer, -BorderBuffer);
Result := not PtInRect(R, Point(X, Y));
if Result then
begin
FSides := [];
if X < R.Left then
Include(FSides, sLeft)
else if X > R.Right then
Include(FSides, sRight);
if Y < R.Top then
Include(FSides, sTop)
else if Y > R.Bottom then
Include(FSides, sBottom);
end;
end;
function TForm1.SidesToCursor: TCursor;
begin
if (FSides = [sleft, sTop]) or (FSides = [sRight, sBottom]) then
Result := crSizeNWSE
else if (FSides = [sRight, sTop]) or (FSides = [sLeft, sBottom]) then
Result := crSizeNESW
else if (sLeft in FSides) or (sRight in FSides) then
Result := crSizeWE
else if (sTop in FSides) or (sBottom in FSides) then
Result := crSizeNS
else
Result := crNone;
end;
procedure TForm1.ApplicationEventsMessage(var Msg: tagMSG;
var Handled: Boolean);
var
CommandType: WPARAM;
begin
case Msg.message of
WM_LBUTTONDOWN:
if FResizable then
begin
CommandType := SC_SIZE;
if sLeft in FSides then
Inc(CommandType, WMSZ_LEFT)
else if sRight in FSides then
Inc(CommandType, WMSZ_RIGHT);
if sTop in FSides then
Inc(CommandType, WMSZ_TOP)
else if sBottom in FSides then
Inc(CommandType, WMSZ_BOTTOM);
ReleaseCapture;
DisableAlign;
PostMessage(Handle, WM_SYSCOMMAND, CommandType, 0);
Handled := True;
end;
WM_MOUSEMOVE:
with ScreenToClient(Msg.pt) do
begin
FResizable := ResizableAt(X, Y);
if FResizable then
Screen.Cursor := SidesToCursor
else
Screen.Cursor := Cursor;
if AlignDisabled then
EnableAlign;
end;
end;
end;
Относительно вашей выровненной панели: попробуйте установить Align = alCustom
и Anchors = [akLeft, akTop, akRight]
, хотя улучшение можетзависит от того, будет ли панель иметь цвет, отличный от формы, или, может быть, от меня обманут.;)