Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как пропорционально изменять размер формы


Автор: ДЫМ 21.9.2005, 03:41
При изменении размеров формы (тянем за края) мне надо, чтобы размеры изменялись пропорционально первоначальному соотношению сторон, т. е. если первоначально Width=5, Height=10, размеры были соответственно с соотношением 1/2?

Автор: DragonFire 21.9.2005, 07:36
Попробуй в событии FormSize задать такую строчку:
Form.height:=form.width*2;
или
Form.width:=form.height div 2;

Автор: mntek 21.9.2005, 09:32
только не FormSize, а OnFormResize

Автор: DragonFire 21.9.2005, 14:28
Извини, давно не работал с событиями формы VCL, все больше WindowsApi... smile

Автор: ДЫМ 22.9.2005, 01:08
Цитата
Попробуй в событии FormSize задать такую строчку:
Form.height:=form.width*2;
или
Form.width:=form.height div 2;


Извини, но прежде чем постить ты хотя бы для интереса попробовал протестировать код.

У тебя получается, что в момент изменения размеров ты опять изменяешь размер и процедура вызывается рекурсивно.

Вообще-то как я понимаю, надо использовать OnCanResize

Код

procedure TNavigatorForm.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
var AspectRatio:Double;
begin
 // здесь у меня вычисляется аспект
 AspectRatio:=SourceWidth/SourceHeight;

 NewHeight:=Round(NewWidth/AspectRatio)+GetSystemMetrics(SM_CYCAPTION);
end;


Проблема в том, что можно вычислить или ширину относительно высоты или наоборот, но бывает так, что меняется только ширина или высота (скажем тянут только за правый или нижний края), а как узнать, что изменилась только ширина или высота непонятно. Казалось бы, что может быть проще, вставил условие
Код

if NewHeight=Height then...,
но почему-то не работает как надо.

Цитата
Извини, давно не работал с событиями формы VCL, все больше WindowsApi...


Ну так давай на WindowsApi, что мешает?

Автор: Yanis 22.9.2005, 15:04
Цитата
Проблема в том, что можно вычислить или ширину относительно высоты или наоборот, но бывает так, что меняется только ширина или высота (скажем тянут только за правый или нижний края), а как узнать, что изменилась только ширина или высота непонятно.

Для отлова за какой край изменяют размер формы можно использовать такой код:
Код

procedure WMSIZING(var M: TMessage); message WM_SIZING;

...

procedure TForm1.WMSIZING(var M: TMessage);
begin
  case M.WParam of
    WMSZ_BOTTOM:;
    WMSZ_LEFT:;
    WMSZ_RIGHT:;
    WMSZ_TOP:;
  end;
end;

Автор: Bibimij 24.9.2005, 10:20
Да... Пропорциональность формы - этоконечно хорошо! smile А как быть с компонентами на форме? Как сделасть, чтобы, например, edit растягивался/сужался при увеличении/уменьшении размеров формы, причём код не был бы гипер грандиозным? smile smile smile

Автор: Prof_2000 24.9.2005, 11:54
Если edit на всю форму по ширине, то все очень легко. У всех визуальных компонентов есть свойство Anchors(якоря), отвечает за фиксацию краев компонентов относительно краев формы.
Если нет то опять же по событию формы OnResize пропиши зависимости положения компонентов. По изменению положения и размера компонентов никакого события нет, так что рекурсия вызваться не будет. Теперь насчет примера: пусть Edit должен доходит всегда ровно до половины формы. Тогда
Код

procedure TForm1.FormResize(Sender: TObject);
begin
 Edit1.Width:=(Width div 2)-Edit1.Left;
end;

Негиперграндиозность текста этого варианта безусловно зависит от количества компонентов. Других способов, вроде, нет, за исключением некоторых компонентов со свойством Center:boolean и компонента TSplitter.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)