![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не работает Anchors с MDIChild формой
atruhin © (2007-07-13 15:11:00)Если создать форму MDIChild и поместить компоненты с привязкой (Anchors),
то при создании формы они расположенны не правильно.
При установке Scaled в false вроде работает нормально с большинством компонентов,
но стоит положить например TMemo, и не только, опять "косяки".
Два вопроса:
1. Как лучше кардинально решить проблемму?
2. При чем в данной ситуации Scaled?
Однокамушкин (2007-07-15 14:34:00) [1]
> Юрий Зотов © (15.07.07 12:09) [14]
> Предлагается скелет варианта решения.
Добавлю, что такое решение можно использовать только начиная с 6-ой версии Delphi, потому что в более ранних версиях поле FDesignSize имеет область видимости private, а не protected...
Юрий Зотов (2007-07-15 12:09:00) [2]Предлагается скелет варианта решения. Скелет - это потому, что его надо доводить до ума (напр., из-за пересоздания дочернего окна его дефолтный сдвиг относительно предыдущего как бы удваивается). Но сабж работает.
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;
atruhin (2007-07-15 10:53:00) [3]> а куда ты их вообще эти размеры в Design-е записываешь
Я никуда не записываю. Я имею ввиду размеры формы заданные в дизайнере, хранятся в dfm.
Но при создании MDIChild формы не учитываются.
sniknik (2007-07-15 10:21:00) [4]> узнать Design размеры формы, либо решить по другому.
а куда ты их вообще эти размеры в Design-е записываешь? там и узнавай.
atruhin (2007-07-15 09:39:00) [5]Подниму тему разок.
Может можно сделать универасальное решение проблеммы. Т.е. либо в CreateParams
узнать Design размеры формы, либо решить по другому.
atruhin (2007-07-14 13:24:00) [6]> Надо у дочерней формы перекрыть CreateParams и там, после
> вызова inherited, установить значения Params.Width
Спасибо. Уже что то. Я до этого пробовал, но устанавливал ДО inherited.
Теперь вопрос как узнать размер формы заданный при разработке, т.е. сделать универсальное решение?
Kolan (2007-07-14 12:39:00) [7]> проверил в Turbo Delphi
Да у меня BDS наверно поэтому.
Однокамушкин (2007-07-14 11:56:00) [8]
> Kolan © (14.07.07 11:49) [7]
> > WindowStyle = wsMaximized — этот глюк проявит себя во
> всей
> > красе…
>
> Часто так делаю небыло проблем.
Видимо, от версии Delphi зависит, проверил в Turbo Delphi - проблем нет, а вот в семёрке есть...
Kolan (2007-07-14 11:49:00) [9]> WindowStyle = wsMaximized этот глюк проявит себя во всей
> красе
Часто так делаю небыло проблем.
Однокамушкин (2007-07-14 11:17:00) [10]Кажется, нашёл способ справиться с проблемой... Надо у дочерней формы перекрыть CreateParams и там, после вызова inherited, установить значения Params.Width и Params.Height в точности равные значениям свойств Width и Height формы, установленным в дизайнере...
atruhin (2007-07-14 10:35:00) [11]> [4] Однокамушкин (14.07.07 08:13)
Спасибо, но причина мне понятна. Не понятно как ее исправить.
> так что попробуйте увеличить размер главного окна в дизайнере
> - вдруг поможет...
Тогда дочернее окно создается больше чем в дизайнере, т.е. все тоже с точностью наоборот.
> У меня нет косяков (не заметил по крайней мере с мемой). Delphi7.
Есть. И в D7 и в BDS2006. Для воспроизведения:
- создаем новый MDI проект (стандартный мастером);
- открываем MDIChild форму удаляем Memo, добавляем 2 TEdit один привязываем к левому краю,
другой к правому. Больше ничего не меняем.
- компилируем, смотрим.
Однокамушкин (2007-07-14 08:13:00) [12]Думаю, что это ещё одно проявление известного дельфийского косяка: первоначальная привязка якорей осуществляется не к размерам формы в дизайнере, а к тем размерам, которые получает окно при создании во время выполнения, и если эти размеры по каким-то причинам различаются, контролы оказываются не там, где хотелось бы... Для примера положите контролы с якорями на обычную форму и поставьте ей WindowStyle = wsMaximized - этот глюк проявит себя во всей красе...
MDI-окна создаются с меньшими размерами, чем в дизайнере, тогда, когда главное окно имеет недостаточный размер, чтобы вместить их, так что попробуйте увеличить размер главного окна в дизайнере - вдруг поможет...
TUser (2007-07-14 06:22:00) [13]У меня нет косяков (не заметил по крайней мере с мемой). Delphi7.
atruhin (2007-07-14 04:40:00) [14]А что с MDI никто не работает?
atruhin (2007-07-13 15:13:00) [15]Причем в сети есть описание данной проблеммы, но решения так и не нашел.