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

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

Непонятки с OnResize


Германн ©   (2007-04-20 02:34:00) 

Пишу обработчик OnResize для формы. На форме есть некий квадрат. И я хочу, чтобы он оставался квадратом при любых изменениях размеров формы.
В текст нормально работавшей до сих пор программы (до любых попыток изменения раэмеров формы)  вставил две процедуры:
procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
 NewHeight: Integer; var Resize: Boolean);
begin
   if NewWidth < NewHeight then NewHeight:=NewWidth
   else NewWidth:=NewHeight;
   Resize:=True;
end;

procedure TForm1.FormResize(Sender: TObject);
var
 i, w, n : Integer;
begin
 w:=(Form1.Height - 182) div 9;
 for i:=0 to 8 do with Doska do begin
   RowHeights[i]:=w;
   ColWidths[i]:=w;
 end;
 Doska.Height:=w*9+22;
 Doska.Width:=w*9+22;
 with Form1 do for i:=0 to ComponentCount-1 do
   if Components[i] is TPanel then begin
     TPanel(Components[i]).Width:=w-2;
     TPanel(Components[i]).Height:=w-2;
     if TPanel(Components[i]).Visible then begin
       n:=TPanel(Components[i]).Tag;
       TPanel(Components[i]).Left:=((n-1) mod 8)*(Doska.RowHeights[0]+2)+Doska.RowHeights[0]+19;
       TPanel(Components[i]).Top:=(n div 8)*(Doska.RowHeights[0]+2)+Doska.RowHeights[0]+35;
     end;
 end;
end;

На форме TPageControl c Align=OnClient и StatusBar c Align=AlBottom есс-но.

Так вот и вопрос: При запуске программы StatusBar почти не виден!
Но если любым "пользовательским" способом изменить размер формы, СтатусБар появляется. А почему его не видно при старте программы?


Германн   (2007-04-27 01:07:00) [1]


> {RASkov} ©   (26.04.07 22:04) [12]

Ну теперь осталось только натравить на сей вопрос Суслика. Пусть проверит как обстоит дело в Д2007. И если также, то пусть сообщит Коду Жира. Может исправят. :-)


{RASkov}   (2007-04-26 22:04:00) [2]

Как вариант:
начало в [4] - здесь поправки.
Align'ы = alNone и у пэйджконтрола и у статусбара... у пэджконтрола Top и Left = 0 в дизайнере. У статусбара Left = 0

procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
 NewHeight: Integer; var Resize: Boolean);
begin
if NewWidth < NewHeight then NewHeight:=NewWidth
 else NewWidth:=NewHeight;
Resize:=True;
end;

procedure TForm1.FormResize(Sender: TObject);
..............
begin
 PageControl1.Width:=ClientWidth;
 PageControl1.Height:=ClientHeight-StatusBar1.Height;
 StatusBar1.Width:=ClientWidth;
 StatusBar1.Top:=ClientHeight-StatusBar1.Height;
..........
end;

навеяно веткой:
http://www.delphimaster.ru/cgi-bin/forum.pl?n=18&id=1177606141
:)


Johnmen   (2007-04-20 16:32:00) [3]


> Германн ©   (20.04.07 16:21) [10]

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

Короче, как сказал {RASkov} Realign помогает...


Германн   (2007-04-20 16:21:00) [4]


> Johnmen ©   (20.04.07 15:34) [6]
>
> Не всё тип-топ. Уголок статусбара не отрисовывается...

Да. Если Height < Width, то не отрисовывается, а если Height = Width, то тип-топ :)
Уже забил... :-)


{RASkov}   (2007-04-20 15:51:00) [5]

> FormCanResize.....FormResize

Естественно OnCanResize и OnResize....


{RASkov}   (2007-04-20 15:49:00) [6]

> [4] Германн ©   (20.04.07 15:07)

Да есть фича... причем с любыми контролами и описанным FormCanResize..
Попробуй в последний момент в FormResize вызывать Realign;


Johnmen   (2007-04-20 15:48:00) [7]


> Германн ©

Пропиши OnResize (не путать с OnCanResize, как это было в [4])
i:=StatusBar.Height;
StatusBar.Height:=0;
StatusBar.Height:=i;
и забей...:)


Johnmen   (2007-04-20 15:34:00) [8]

Не всё тип-топ. Уголок статусбара не отрисовывается...

В общем-то явление понятное, не приходит сообщение о ресайзе.


Германн   (2007-04-20 15:11:00) [9]

А вот если в дизайнере у формы сделать Height <= Width всё тип-топ.


Германн   (2007-04-20 15:07:00) [10]

Хм.
Создаём новый проект. У формы в дизайнере ставим Height 562, Width 550. Кидаем на форму StatusBar и PageControl. У PageControl ставим Align alClient. Для формы создаем обработчик OnResize с таким кодом:
procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
 NewHeight: Integer; var Resize: Boolean);
begin
 if NewWidth < NewHeight then NewHeight:=NewWidth
 else NewWidth:=NewHeight;
 Resize:=True;
end;

Нажимаем F9 и видим сильно урезанный по высоте StatusBar. Делаем любое действие мышкой по изменению размера формы и о чудо! StatusBar восстанавливается!
Проверено на D4, D6, BDS2006.


Германн   (2007-04-20 11:31:00) [11]


> clickmaker ©   (20.04.07 09:43) [1]
>
> это в какой дельфи?
>

Д6, ХР. (Как это я забыл указать. Склероз эт-точно :(


> Johnmen ©   (20.04.07 09:49) [2]
>
>
> > Германн ©   (20.04.07 02:34)
>
> Данный код работает, как ожидается, без непоняток.
> Значит есть ещё что-то влияющее на размеры контролов.
>

Хм. Буду посмотреть. Спасибо.


Johnmen   (2007-04-20 09:49:00) [12]


> Германн ©   (20.04.07 02:34) 

Данный код работает, как ожидается, без непоняток.
Значит есть ещё что-то влияющее на размеры контролов.


clickmaker   (2007-04-20 09:43:00) [13]

это в какой дельфи?


Наверх

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