Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не работает 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]

Причем в сети есть описание данной проблеммы, но решения так и не нашел.


Наверх

Титульная страница Поиск, карта сайта Написать письмо