![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: нет Всего: 1 |
Ребята, столкнулся со следующей проблемой... У меня в проекте большое количество динамически создаваемых форм.
Одна из этих форм несет динамически создаваемые кнопки. (Кнопка эти - моя собственная разработка на базе TSpeedBtn) Вот описание события формы Create
Как только хочу выяснить индекс компонента (кнопки) получаю -1, хотя кнопки нажимаются и находятся на форме (прорисовываются на панели). Но Стоит форму перезапустить (Не программу, а форму) - индексы располагаются нормально. В чем тут дело? Благодарю заранее. И с праздником всех. Это сообщение отредактировал(а) Rrader - 9.1.2011, 16:10 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
Owner ты указываешь? Или nil ставишь.
-------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
||||
|
||||
| lukas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 23.2.2007 Репутация: 3 Всего: 15 |
А что значит форму перезапустить?
А в конструкторе написали,:
-------------------- http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi. |
|||
|
||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: нет Всего: 1 |
Перезапустить в данном случае - закрыть и породить снова путем нажатия на кнопку на др. форме. (родительской для первой) Это сообщение отредактировал(а) PsiMagistr - 9.1.2011, 16:36 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| Rrader |
|
||||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Когда создаешь форму таким кодом
то при выполнении FormCreate переменная Battl ещё будет равна nil. Когда конструктор полностью отработает, тогда уже в переменную пойдет указатель. Поэтому сделай так
|
||||
|
|||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: нет Всего: 1 |
Rrader, Помог однако, добрый человек. Спасибо.
а можешь кофейнику объяснить как отработка конструкторов происходит? А то я свой компонент замутил и он работает даже, а вот оказывается пользоваться всем этим не умею толком... -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Ну как, все действия выполняются последовательно. Просто если у тебя конструктор что-то возвращает (в твоем случае указатель на объект формы), то пока он не вернул результат, указатель не определен. FormCreate выполняется до возврата значения. Если интересует порядок вызовов, то можешь сделать так, в FormCreate поставь точку останова (F5) на первой строчке кода, потом запусти программу, она остановится. После чего нажми Ctrl+Alt+S - увидишь стек вызовов, в котором прослеживается порядок. |
|||
|
||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: нет Всего: 1 |
Спасибо большое. т.е. А всегда ли при вызове указателя объекта из метода самого объекта надо self использовать? А то я еще путаюсь немого.
-------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Указатель не вызывают, вызывают метод. Указатель используют. Когда ты выполняешь код какого-то метода, и если этот метод требует указателя на объект, всегда используй Self. Иногда альтернативы просто нет. Тот факт, что значение Self запоминают в какие-то внешние данные (как у тебя в переменную Battl), говорит о том, что указатель на объект будет использоваться где-то еще в программе, но вне методов объекта (в твоем случае это всевозможная работа с формой). В коде методов самой формы использовать Battl особой надобности нет. И ты видел сейчас, на что можно попасться |
|||
|
||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: нет Всего: 1 |
т.е. self рождается всегда прежде собственного имени объекта. Имя объекта только страховочная копия self-a для общения с внешним миром?
Так? Но вот интересно выходит кнопки отрисовались и при значении указателя nill (т.к. переменная Battl имела nil) Или на то где отрисуется объект только Parent влияет? -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| Rrader |
|
||||||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
"Имя объекта" - это глобальная переменная, автоматически создаваемая Delphi. Если просто объяснять, после рождения такой переменной в нее помещается значение nil (это 0). Чтобы занести в переменную адрес, нужно сделать присвоение, так ведь? Схематично:
На момент присвоения Self уже существует (точнее, должен существовать). Т.е. это не страховочная копия, а самая обычная копия. В двух переменных лежит одинаковый адрес. На счёт общения с внешним миром - все верно.
На отрисовку это абсолютно не влияет, т.к. кнопки рисует Windows. Этот указатель нужен Delphi, скажем так, для учёта кнопок. Если кнопка не учтена у владельца, она все равно будет рисоваться. |
||||||
|
|||||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: нет Всего: 1 |
Rrader, все понятно, спасибо. На днях у меня было совершенно беспрецедентное нечто.
Я начинал проект еще в старой версии дельфи. Потом у меня появилась новая. В новой версии я создал компоненты на базе TbitBtn. и они начали очень странно отрисовываться. Пришлось сменить родительский класс. вместо TbitBtn писать TSpeedbtn. После чего отрисовка меня устроила. Но Если я создаю абсолютно новый проект в новой версии дельфи и подключаю свои старые классы (от TBitBtn) туда все рисуется как должно... В чем может быть дело? Это сообщение отредактировал(а) PsiMagistr - 9.1.2011, 18:05 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Трудно сказать однозначно
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |