Текущий архив: 2007.09.23;
Скачать: CL | DM;
ВнизНе работает Anchors с MDIChild формой Найти похожие ветки
← →
atruhin © (2007-07-13 15:11) [0]Если создать форму MDIChild и поместить компоненты с привязкой (Anchors),
то при создании формы они расположенны не правильно.
При установке Scaled в false вроде работает нормально с большинством компонентов,
но стоит положить например TMemo, и не только, опять "косяки".
Два вопроса:
1. Как лучше кардинально решить проблемму?
2. При чем в данной ситуации Scaled?
← →
atruhin © (2007-07-13 15:13) [1]Причем в сети есть описание данной проблеммы, но решения так и не нашел.
← →
atruhin © (2007-07-14 04:40) [2]А что с MDI никто не работает?
← →
TUser © (2007-07-14 06:22) [3]У меня нет косяков (не заметил по крайней мере с мемой). Delphi7.
← →
Однокамушкин (2007-07-14 08:13) [4]Думаю, что это ещё одно проявление известного дельфийского косяка: первоначальная привязка якорей осуществляется не к размерам формы в дизайнере, а к тем размерам, которые получает окно при создании во время выполнения, и если эти размеры по каким-то причинам различаются, контролы оказываются не там, где хотелось бы... Для примера положите контролы с якорями на обычную форму и поставьте ей WindowStyle = wsMaximized - этот глюк проявит себя во всей красе...
MDI-окна создаются с меньшими размерами, чем в дизайнере, тогда, когда главное окно имеет недостаточный размер, чтобы вместить их, так что попробуйте увеличить размер главного окна в дизайнере - вдруг поможет...
← →
atruhin © (2007-07-14 10:35) [5]> [4] Однокамушкин (14.07.07 08:13)
Спасибо, но причина мне понятна. Не понятно как ее исправить.
> так что попробуйте увеличить размер главного окна в дизайнере
> - вдруг поможет...
Тогда дочернее окно создается больше чем в дизайнере, т.е. все тоже с точностью наоборот.
> У меня нет косяков (не заметил по крайней мере с мемой). Delphi7.
Есть. И в D7 и в BDS2006. Для воспроизведения:
- создаем новый MDI проект (стандартный мастером);
- открываем MDIChild форму удаляем Memo, добавляем 2 TEdit один привязываем к левому краю,
другой к правому. Больше ничего не меняем.
- компилируем, смотрим.
← →
Однокамушкин (2007-07-14 11:17) [6]Кажется, нашёл способ справиться с проблемой... Надо у дочерней формы перекрыть CreateParams и там, после вызова inherited, установить значения Params.Width и Params.Height в точности равные значениям свойств Width и Height формы, установленным в дизайнере...
← →
Kolan © (2007-07-14 11:49) [7]> WindowStyle = wsMaximized — этот глюк проявит себя во всей
> красе…
Часто так делаю небыло проблем.
← →
Однокамушкин (2007-07-14 11:56) [8]
> Kolan © (14.07.07 11:49) [7]
> > WindowStyle = wsMaximized — этот глюк проявит себя во
> всей
> > красе…
>
> Часто так делаю небыло проблем.
Видимо, от версии Delphi зависит, проверил в Turbo Delphi - проблем нет, а вот в семёрке есть...
← →
Kolan © (2007-07-14 12:39) [9]> проверил в Turbo Delphi
Да у меня BDS…наверно поэтому.
← →
atruhin © (2007-07-14 13:24) [10]> Надо у дочерней формы перекрыть CreateParams и там, после
> вызова inherited, установить значения Params.Width
Спасибо. Уже что то. Я до этого пробовал, но устанавливал ДО inherited.
Теперь вопрос как узнать размер формы заданный при разработке, т.е. сделать универсальное решение?
← →
atruhin © (2007-07-15 09:39) [11]Подниму тему разок.
Может можно сделать универасальное решение проблеммы. Т.е. либо в CreateParams
узнать Design размеры формы, либо решить по другому.
← →
sniknik © (2007-07-15 10:21) [12]> узнать Design размеры формы, либо решить по другому.
а куда ты их вообще эти размеры в Design-е записываешь? там и узнавай.
← →
atruhin © (2007-07-15 10:53) [13]> а куда ты их вообще эти размеры в Design-е записываешь
Я никуда не записываю. Я имею ввиду размеры формы заданные в дизайнере, хранятся в dfm.
Но при создании MDIChild формы не учитываются.
← →
Юрий Зотов © (2007-07-15 12:09) [14]Предлагается скелет варианта решения. Скелет - это потому, что его надо доводить до ума (напр., из-за пересоздания дочернего окна его дефолтный сдвиг относительно предыдущего как бы удваивается). Но сабж работает.
type
TForm2 = class(TForm)
private
FDeltaX: integer;
FDeltaY: integer;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure CreateWnd; override;
end;
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Width := FDesignSize.X + FDeltaX;
Params.Height := FDesignSize.Y + FDeltaY;
end;
procedure TForm2.CreateWnd;
begin
inherited;
if FDeltaX = 0 then
begin
FDeltaX := Width - ClientWidth;
FDeltaY := Height - ClientHeight;
RecreateWnd
end;
end;
← →
Однокамушкин (2007-07-15 14:34) [15]
> Юрий Зотов © (15.07.07 12:09) [14]
> Предлагается скелет варианта решения.
Добавлю, что такое решение можно использовать только начиная с 6-ой версии Delphi, потому что в более ранних версиях поле FDesignSize имеет область видимости private, а не protected...
Страницы: 1 вся ветка
Текущий архив: 2007.09.23;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.043 c