Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с размерами панелей, которые динамически создаются 
:(
    Опции темы
Zero
Дата 13.3.2005, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



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

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  Пример.zip
PM MAIL ICQ   Вверх
ДЫМ
Дата 14.3.2005, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 6.1.2004

Репутация: 8
Всего: 8



Почему это происходит я не знаю. Наверное какой-то глюк при создании объектов в TForm.Create

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

Ведь если перенести твой код в обработчик события OnShow формы, то все заработает как надо. Только учти, что внизу будет та панель, которую ты создаешь первой (что очевидно).
PM MAIL WWW   Вверх
mvdr
Дата 14.3.2005, 05:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


физик
***


Профиль
Группа: Участник
Сообщений: 1349
Регистрация: 31.12.2004
Где: Волгоград, Россия

Репутация: 1
Всего: 42



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

Это сообщение отредактировал(а) Femida - 14.3.2005, 05:05


--------------------
Появляюсь редко, но часто метко

Изображать идиота сложнее, чем изображать умного: полезнее и не каждому дано
PM ICQ   Вверх
RA
Дата 14.3.2005, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



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
PM   Вверх
Zero
Дата 14.3.2005, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



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

Я знаю, что *.dfm и *.pas впринципе достаточно, но мне влом было всё это удалять, ведь размер всё равно маленикий остаётся. smile
PM MAIL ICQ   Вверх
RA
Дата 14.3.2005, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



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

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

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

(если ошибаюсь то пусть меня поправят)
PM   Вверх
p0s0l
Дата 15.3.2005, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Как другой вариант решения - в начало 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...



--------------------
С уважением, г-н Посол.
PM   Вверх
Zero
Дата 15.3.2005, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



p0s0l моё реальное приложени сразу начало глюкать, точнее при его запуске 7-ая форма запускается вместе с 1-ой, наверно лучше оставлю пока как есть, покрайней мере вроде работает... тьфу, тьфу...
Что вообще означает процедура Show и Hide? А то в справке написано на английском, и как то трудно до меня доходит их смысл слов, а то я не все слова знаю точно... smile Вроде как что-то показывать должна... smile
PM MAIL ICQ   Вверх
RA
Дата 15.3.2005, 05:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



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


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

Собсно тогда Zero почемубы тебе не поставить свою процедуру создания динамических контролов в событие OnShow вместо OnCreate ?
PM   Вверх
p0s0l
Дата 15.3.2005, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



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


--------------------
С уважением, г-н Посол.
PM   Вверх
Zero
Дата 15.3.2005, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



Цитата(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
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.