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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое создание объектов 
:(
    Опции темы
PsiMagistr
Дата 9.1.2011, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ребята, столкнулся со следующей проблемой... У меня в проекте большое количество динамически создаваемых форм. 

Одна из этих форм несет динамически создаваемые кнопки. (Кнопка эти - моя собственная разработка на базе TSpeedBtn) 

Вот описание  события формы Create

Код

procedure TBattl.FormCreate(Sender: TObject);
var i:Integer;
begin
ImgPers.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+Pers.Avatara);
BarLife.MaxValue := Pers.VitMaxValue;
BarLife.Progress:= Pers.VitValue;
BarMana.MaxValue:=Pers.ManaMaxValue;
BarMana.Progress:=Pers.ManaValue;
BarExpa.MaxValue:=Pers.ExpMaxValue;
BarExpa.Progress:=Pers.ExpValue;
PlatformName.Caption:=Pers.Name;
MonstPlatformName.Caption:=Monst.Name;
ImgMonst.Picture.LoadFromFile(Monst.Avatara);
///////////////////////


for i := 0 to 4 do
begin
  Buttons[i]:= TProgressbtn.Create(Battl,100,40,10,40*i+10,clSkyBlue); //Создаем кнопки Battl в данном случае форма родитель (Не путать с Парент) кнопки.

  Buttons[i].Parent:=BattlPanel; //Задаем родителя. Это ПАНЕЛЬ (TPanel) находящаяся на форме Battl т.е. кнопки визуально рисуем на панели.
  Buttons[i].OnClick:=ButtonsClick;
  Buttons[i].GraphCaption:='Стена огня';
  Buttons[i].MyForeColor:=clRed;
  if i > Pers.NumRefleks-1 then  Buttons[i].Enabled:=false;
 end;

procedure TBattl.ButtonsClick(Sender:TObject); //Процедура щелчка на кнопках.
 begin
 if not TProgressbtn(Sender).Ticker.Enabled  then
 begin
 TProgressbtn(Sender).MaxValue:=10;
 TProgressbtn(Sender).Value:=TProgressbtn(Sender).MaxValue;
 TProgressbtn(Sender).Ticker.Tag:=-1;
 TProgressbtn(Sender).Ticker.Enabled:=True;
 Battl.Caption := IntToStr((Sender as TProgressbtn).ComponentIndex ); //Хочу выяснить индекс компонента
 end;


Как только хочу выяснить индекс компонента (кнопки) получаю -1, хотя кнопки нажимаются и находятся на форме (прорисовываются на панели).

Но 

Стоит форму перезапустить (Не программу, а форму) - индексы располагаются нормально.

В чем тут дело?

Благодарю заранее. И с праздником всех.


Это сообщение отредактировал(а) Rrader - 9.1.2011, 16:10


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
lukas
Дата 9.1.2011, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Owner ты указываешь? Или nil ставишь.


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
PsiMagistr
Дата 9.1.2011, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Указываю в Create кнопки

for i := 0 to 4 do
begin
  Buttons[i]:= TProgressbtn.Create(Battl,100,40,10,40*i+10,clSkyBlue); //Создаем кнопки Battl в данном случае форма OWNER  для кнопок (Не путать с Parent).

///Battl имя формы. И она owner/

Это сообщение отредактировал(а) PsiMagistr - 9.1.2011, 16:12


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Akella
Дата 9.1.2011, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



PM MAIL   Вверх
lukas
Дата 9.1.2011, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А что значит форму перезапустить?

А в конструкторе написали,:

Код

constructor Create(OWner:...)
begin
   inherited Create(OWner);
   ....
end;



--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
PsiMagistr
Дата 9.1.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

constructor TprogressBtn.Create(a: TComponent; W:integer; H:integer;L:Integer;T:Integer; c:Tcolor); //а - будущий owner
begin
 inherited Create(a);
 Ticker:=TTimer.Create(self);
 Ticker.Enabled:=false;
 Ticker.OnTimer := Steps;
 Ticker.Interval:=1000;
 MyForeColor:=clBlack;
 fBasikColor:= c;
 self.Width:=W;
 self.Height:=H;
 self.Left := L;
 self.Top := T;
 self.Glyph.Width := self.Width;
 self.Glyph.Height := self.Height;
 self.MaxValue:=0;
 self.Value := 0;
 //self.DrawProgressBar(7,Height-20,width-10,Height-10,c);
end;


Перезапустить в данном  случае - закрыть и породить снова путем нажатия на кнопку на др. форме. (родительской для первой)

Это сообщение отредактировал(а) PsiMagistr - 9.1.2011, 16:36


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Rrader
  Дата 9.1.2011, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

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



Когда создаешь форму таким кодом
Код

Battl := TBattl.Create(Application);

то при выполнении FormCreate переменная Battl ещё будет равна nil. Когда конструктор полностью отработает, тогда уже в переменную пойдет указатель. Поэтому сделай так
Код

Buttons[i]:= TProgressbtn.Create(Self, 100, 40, 10, 40*i + 10, clSkyBlue);



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
PsiMagistr
Дата 9.1.2011, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Rrader, Помог однако, добрый человек.  Спасибо.

а можешь кофейнику объяснить как отработка конструкторов происходит? А то я свой компонент замутил и он работает даже, а вот оказывается пользоваться всем этим не умею толком...



--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Rrader
  Дата 9.1.2011, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

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



Цитата(PsiMagistr @  9.1.2011,  22:50 Найти цитируемый пост)
а можешь кофейнику объяснить как отработка конструкторов происходит?

Ну как, все действия выполняются последовательно. Просто если у тебя конструктор что-то возвращает (в твоем случае указатель на объект формы), то пока он не вернул результат, указатель не определен. FormCreate выполняется до возврата значения. Если интересует порядок вызовов, то можешь сделать так, в FormCreate поставь точку останова (F5) на первой строчке кода, потом запусти программу, она остановится. После чего нажми Ctrl+Alt+S - увидишь стек вызовов, в котором прослеживается порядок.


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
PsiMagistr
Дата 9.1.2011, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо большое. т.е. А всегда ли при вызове указателя объекта из метода самого объекта надо self использовать? А то я еще путаюсь немого.


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Rrader
  Дата 9.1.2011, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

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



Цитата(PsiMagistr @  9.1.2011,  23:07 Найти цитируемый пост)
А всегда ли при вызове указателя объекта из метода самого объекта надо self использовать?

Указатель не вызывают, вызывают метод. Указатель используют.

Когда ты выполняешь код какого-то метода, и если этот метод требует указателя на объект, всегда используй Self. Иногда альтернативы просто нет. Тот факт, что значение Self запоминают в какие-то внешние данные (как у тебя в переменную Battl), говорит о том, что указатель на объект будет использоваться где-то еще в программе, но вне методов объекта (в твоем случае это всевозможная работа с формой). В коде методов самой формы использовать Battl особой надобности нет. И ты видел сейчас, на что можно попасться smile 


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
PsiMagistr
Дата 9.1.2011, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



т.е. self рождается всегда прежде собственного имени объекта. Имя объекта только страховочная копия self-a для общения с внешним миром?
Так?

Но вот интересно выходит кнопки отрисовались и при значении указателя nill (т.к. переменная Battl имела nil)

Или на то где отрисуется объект только Parent влияет?


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Rrader
  Дата 9.1.2011, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

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



Цитата(PsiMagistr @  9.1.2011,  23:29 Найти цитируемый пост)
т.е. self рождается всегда прежде собственного имени объекта. Имя объекта только страховочная копия self-a для общения с внешним миром?

"Имя объекта" - это глобальная переменная, автоматически создаваемая Delphi. Если просто объяснять, после рождения такой переменной в нее помещается значение nil (это 0). Чтобы занести в переменную адрес, нужно сделать присвоение, так ведь? Схематично:
Код

Battl := Self; // Self родился и получил свое значение раньше Battl

На момент присвоения Self уже существует (точнее, должен существовать). Т.е. это не страховочная копия, а самая обычная копия. В двух переменных лежит одинаковый адрес. На счёт общения с внешним миром - все верно.

Цитата(PsiMagistr @  9.1.2011,  23:29 Найти цитируемый пост)
Но вот интересно выходит кнопки отрисовались и при значении указателя nill (т.к. переменная Battl имела nil)

На отрисовку это абсолютно не влияет, т.к. кнопки рисует Windows. Этот указатель нужен Delphi, скажем так, для учёта кнопок. Если кнопка не учтена у владельца, она все равно будет рисоваться.


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
PsiMagistr
Дата 9.1.2011, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Rrader,  все понятно, спасибо. На днях у меня было совершенно беспрецедентное нечто.

Я начинал проект еще в старой версии дельфи. Потом у меня появилась новая. В новой версии я создал компоненты на базе TbitBtn. и они начали очень странно отрисовываться. 


Пришлось сменить родительский класс. вместо TbitBtn писать TSpeedbtn. После чего отрисовка меня устроила.


Но

Если я создаю абсолютно новый проект в новой версии дельфи и подключаю свои старые классы (от TBitBtn) туда все рисуется как должно...

В чем может быть дело?

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


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Rrader
  Дата 9.1.2011, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

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



Трудно сказать однозначно


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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