Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.20;
Скачать: CL | DM;

Вниз

Непонятки с OnResize   Найти похожие ветки 

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

Пишу обработчик 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 почти не виден!
Но если любым "пользовательским" способом изменить размер формы, СтатусБар появляется. А почему его не видно при старте программы?


 
clickmaker ©   (2007-04-20 09:43) [1]

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


 
Johnmen ©   (2007-04-20 09:49) [2]


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

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


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


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

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


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

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


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

Хм.
Создаём новый проект. У формы в дизайнере ставим 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 15:11) [5]

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


 
Johnmen ©   (2007-04-20 15:34) [6]

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

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


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


> Германн ©

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


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

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

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


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

> FormCanResize.....FormResize

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


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


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

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


 
Johnmen ©   (2007-04-20 16:32) [11]


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

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

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


 
{RASkov} ©   (2007-04-26 22:04) [12]

Как вариант:
начало в [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://delphimaster.net/view/2-1177606141/
:)


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2007.05.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.121 c
15-1176814446
oldman
2007-04-17 16:54
2007.05.20
Много интересных сообщений мне Windows писал, но чтобы так...


15-1176840318
ArtemESC
2007-04-18 00:05
2007.05.20
Как в Far e делается FTP-соединение?


15-1177132754
TUser
2007-04-21 09:19
2007.05.20
Веб-камера


2-1178084210
VitAngel
2007-05-02 09:36
2007.05.20
Полоска копирования


2-1177232286
VegaS
2007-04-22 12:58
2007.05.20
Управление удаленным хостом через TCP/IP