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


Автор: Zero 13.3.2005, 20:49
Привет!
Я сегодня столкнулся с одной странной вещью...
Почему то когда бросишь на форму компонент TScrollBox со свойством align=alclient, ну и панельку чтобы был класс TPanel и начинаешь создаватьдинамически на нём панели (TPanel),то которые в свою очередь динамически приобретают сво-во align=albottom, то снизу становится не та которую поже создаёшь, а та которая имеет больший размер. smile а мне нужно чтобы в середине была с большем размером, а снизу с меньшим.
Ну и вообще почему так происходит эта сортировка по размеру?
Причём, если толко панели создаются на компоненте TScrollBox.
Вот я тут воткнул пример, чтобы вам было понятнее и не мучится с созданием всего перечисленного.
Тут на событие создания формы написано создание 2-ух панелей. Поэксперементируйте со свойством height, т.е. в верхней панели в начале стоит 30, а в нижней 40 ─ попробуйте в верхней поставить например 41, и она будет появлятся ниже чем нижняя. smile

Автор: ДЫМ 14.3.2005, 03:31
Почему это происходит я не знаю. Наверное какой-то глюк при создании объектов в TForm.Create

Но так ли это важно?

Ведь если перенести твой код в обработчик события OnShow формы, то все заработает как надо. Только учти, что внизу будет та панель, которую ты создаешь первой (что очевидно).

Автор: mvdr 14.3.2005, 05:03
это глюк возникающий при создании объекта. Мы в свое времчяс преподом боролись, так и не нашли решение из-за дефиита времени

Автор: RA 14.3.2005, 08:48
Cейчас некогда, разбираться в чём там дело ибо спешу в институт, а посему предлагаю простое решение:

Код


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    Panel1: TPanel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  p1 : Tpanel;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin

with TPanel.Create(form1.ScrollBox1) do  //Панель ввода сообщения
    begin
      Parent:=form1.ScrollBox1;
      align:=albottom;
      color:=clblack;
      Caption:='1';
      height:=30;
    end;

  P1:= TPanel.Create(form1.ScrollBox1);
  with P1 do  //Панель с кнопкой "Отправить"
    begin
      name:='kl';
      Parent:=form1.ScrollBox1;
      color:=clwhite;
       Caption:='2';
      height:=20;
      align:=albottom;
    end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  P1.Height:=40;
end;

end.





PS:

на будущее
Zero и все остальные, - не нужно прилагать вместе с исходниками файлы типа *.cfg *.dof *.dcu *.ddp smile

Автор: Zero 14.3.2005, 12:44
Спасибо RAdmin, пусть пока будет хотябы так, но неплохо бы получить ответ (если кто знает) как это сделать правильно, и почему так происходит? smile
Цитата(RAdmin @ 14.3.2005, 08:48)
не нужно прилагать вместе с исходниками файлы типа *.cfg *.dof *.dcu *.ddp

Я знаю, что *.dfm и *.pas впринципе достаточно, но мне влом было всё это удалять, ведь размер всё равно маленикий остаётся. smile

Автор: RA 14.3.2005, 19:06
Цитата(Zero @ 14.3.2005, 12:44)
Я знаю, что *.dfm и *.pas впринципе достаточно, но мне влом было всё это удалять, ведь размер всё равно маленикий остаётся.

Еще *.dpr не помешает smile .
Вообще можно выделить нужные файлы зажав CTRL и по клику правой кнопки мышки отправить их в архив.

что касается данной проблемы, то я сейчас не в состоянии её решить ибо валюсь с ног, но спать незя smile .
Но нутром чую, что решение проблемы с созданием динамических контролов использующих Align, решается именно так как я продемонстриров ибо ибо.... долго описывать мои мысли.

(если ошибаюсь то пусть меня поправят)

Автор: p0s0l 15.3.2005, 00:27
Как другой вариант решения - в начало OnCreate поставить вызов Show...
Код
procedure TForm1.FormCreate(Sender: TObject);
begin
  Show;

with TPanel.Create(form1.ScrollBox1) do  //Панель ввода сообщения
    begin
      Parent:=form1.ScrollBox1;
      align:=albottom;
      color:=clblack;
      height:=30;
    end;

  with TPanel.Create(form1.ScrollBox1) do  //Панель с кнопкой "Отправить"
    begin
      Parent:=form1.ScrollBox1;
      align:=albottom;
      color:=clwhite;
      height:=40;
    end;
end;
В конце можно поставить Hide (если нужно)...

Цитата(Zero @ 14.3.2005, 12:44)
но неплохо бы получить ответ (если кто знает) как это сделать правильно, и почему так происходит?
Упрощенно в двух словах: Позиционируются контролы (в данном случае - панельки) в порядке сортировки по условию (для alBottom):
(C1.Top + C1.Height) >= (C2.Top + C2.Height)
В случае, если писать создание панелей в OnCreate, Top у всех панелек = 0, поэтому сортируются чисто по высоте (причем все скопом сортируются, при показе формы, а не при каждом создании панели)...
Если же вначале показать форму, то при вставке каждой панели происходит перепозиционирование, но Top у уже вставленных панелек <> 0...

Автор: Zero 15.3.2005, 01:36
p0s0l моё реальное приложени сразу начало глюкать, точнее при его запуске 7-ая форма запускается вместе с 1-ой, наверно лучше оставлю пока как есть, покрайней мере вроде работает... тьфу, тьфу...
Что вообще означает процедура Show и Hide? А то в справке написано на английском, и как то трудно до меня доходит их смысл слов, а то я не все слова знаю точно... smile Вроде как что-то показывать должна... smile

Автор: RA 15.3.2005, 05:37
Цитата(p0s0l @ 15.3.2005, 00:27)
Если же вначале показать форму, то при вставке каждой панели происходит перепозиционирование, но Top у уже вставленных панелек <> 0...


Во-во и я так думал. smile

Собсно тогда Zero почемубы тебе не поставить свою процедуру создания динамических контролов в событие OnShow вместо OnCreate ?

Автор: p0s0l 15.3.2005, 10:31
Цитата(Zero @ 15.3.2005, 01:36)
моё реальное приложени сразу начало глюкать, точнее при его запуске 7-ая форма запускается вместе с 1-ой, наверно лучше оставлю пока как есть, покрайней мере вроде работает... тьфу, тьфу...
Значит, это не основная форма, и ты не сделал в конце Hide... А если сделал - значит у тебя где-то что-то понавешено (на события)...
Если это не основная форма, то оставляй как есть... Или в OnShow засунь код... Иначе при запуске проги будет появляться на долю секунды форма...
Цитата(Zero @ 15.3.2005, 01:36)
Что вообще означает процедура Show и Hide? А то в справке написано на английском, и как то трудно до меня доходит их смысл слов, а то я не все слова знаю точно...  Вроде как что-то показывать должна...
Show - показывает форму, Hide - скрывает... Показывать нужно форму для того, чтобы физически создались все контролы (т.е. CreateWindow)...

Автор: Zero 15.3.2005, 19:30
Цитата(RAdmin @ 15.3.2005, 05:37)
Собсно тогда Zero почемубы тебе не поставить свою процедуру создания динамических контролов в событие OnShow вместо OnCreate ?
А потому, что эту форму в процессе работы программы я закрываю, и потом показываю если нужно ставя сво-во Visible в true... и если всё делать на OnShow, то точто было при первом открытии формы не удаляется, и при втором её открытии всё ещё раз создаётся и получается что вся эта штука которую я создаю какбы создаётся два раза, а на FormCreate один раз в самом начале.
Цитата(p0s0l @ 15.3.2005, 10:31)
Значит, это не основная форма, и ты не сделал в конце Hide...
Конецно, я когда экспрементирую, я делаю всё постепенно, чтобы понять что каждая команда конкретно делает. smile
Цитата(p0s0l @ 15.3.2005, 10:31)
и ты не сделал в конце Hide...

Теперь сделал, всё какбы работает, но
Цитата(p0s0l @ 15.3.2005, 10:31)
при запуске проги будет появляться на долю секунды форма...
поэтому лучше правдо оставлю как есть
Цитата(p0s0l @ 15.3.2005, 10:31)
Показывать нужно форму для того, чтобы физически создались все контролы (т.е. CreateWindow)...
Всё спасибо, теперь всё понял. smile

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