![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонятки с 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]это в какой дельфи?