Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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 — этот глюк проявит себя во всей
> красе&#133

Часто так делаю небыло проблем.


 
Однокамушкин   (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&#133наверно поэтому.


 
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.5 MB
Время: 0.022 c
2-1188116137
Daedr
2007-08-26 12:15
2007.09.23
Чтение из файла


15-1188124654
matt
2007-08-26 14:37
2007.09.23
Если бы архитекторам пришлось работать так же, как программистам.


11-1171855380
ebz
2007-02-19 06:23
2007.09.23
Unicode Control


15-1188142290
Ermitazh
2007-08-26 19:31
2007.09.23
Помогите новичку


6-1170097905
nes_
2007-01-29 22:11
2007.09.23
idhttp.post + мульпартформдата