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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание формы в режиме Autoran 
:(
    Опции темы
bems
Дата 27.5.2010, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(PsiMagistr @  27.5.2010,  13:04 Найти цитируемый пост)
относится не к порождаемой третьей форме. Это Self текущей второй формы.
Self означает тот объект, в методе которого он используется.
Поскольку 
Цитата(kami @  27.5.2010,  12:46 Найти цитируемый пост)
Form3:=TForm3.Create(Self);
 находится в методе Form2 то селф означает тут вторую форму.

Про указатели на созданные формы: владелец хранит массив ссылок на все обьъекты, которыми владеет. Этот массив доступен через свойство Components, объявленное в классе TComponent



--------------------
Обижено школьников: 8
PM MAIL   Вверх
PsiMagistr
Дата 27.5.2010, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



bems, Спасибо большое-большое. Но я что-то совсем запутался. Ведь здесь:

Код


Form3:=TForm3.Create(Self); 

Мы используем Self в методе конструкторе третьей формы:

 TForm3.Create(Self) 

Стало быть это Self третьей формы.

Или же я перепутал Вы имели ввиду никакой не конструктор, а метод Click, кнопки расположенной на второй форме:

procedure TForm2.Button1Click(Sender: TObject); //Метод Click кнопки второй формы. 
begin
Form3 := TForm3.Create(self); //Внимание. Вы видите как вторая форма рождает третью форму и становится ее владельцем. 
end;



Но тогда возникает вопрос. Используется ли в этом случае Self самой второй формы или Self кнопки, расположенной на второй форме? Ведь это метод Click кнопки, а не формы.

Но если это Self кнопки, то у нас и владелец - кнопка... А может ли такое быть?

Или же TForm2.Button1Click - метод формы, а не кнопки? Больно странно пишется...Как будто метод формы. 
Или не так?



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


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

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

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

---

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


Эксперт
****


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

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



PsiMagistr, Метод формы. До точки же - форма.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
kami
Дата 27.5.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(PsiMagistr @  27.5.2010,  13:04 Найти цитируемый пост)
относится не к порождаемой третьей форме. Это Self текущей второй формы.

Да. Если говорить более обобщенно, то в любом обработчике события, например
Код

procedure TMySuperControl.OnClick(...)

Self - это указатель на экземпляр TMySuperControl.
Цитата(PsiMagistr @  27.5.2010,  13:04 Найти цитируемый пост)
Как я понимаю, в первом случае владельцем второй формы становится владелец  MainForm (объект Application), а во втором сама MainForm

Да. Во втором случае (при условии, что Tform1 имеется в единственном экземпляре) запись аналогична
Код

Form2:=TFrom2.Create(Form1)

P.S. MainForm в моих сообщениях подразумевает под собой Application.MainForm.

Добавлено через 2 минуты и 45 секунд
bems, чуть опоздал smile
PM MAIL WWW   Вверх
PsiMagistr
Дата 28.5.2010, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 bems, благодарю. kami, Точно так. Ведь  Form1 в данном случае -  указатель на тот же объект, что и Self.  СПА-СИ-БО!

С чего все началось:


Я сейчас на коленях с книжкой Фленова. Она довольно доходчива. Но встречаются заблуждения. В частности в главе "Инициализация окон" было написано: 

"В нашем случае (в конструктор формы) передается Owner - свойство, в котором хранится указатель на текущее окно".

Вместо того чтобы написать сермяжную правду:

"В нашем случае передается Owner - свойство, в котором хранится указатель на владельца текущего окна".






Это сообщение отредактировал(а) PsiMagistr - 28.5.2010, 11:00


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

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

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

---

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(PsiMagistr @  28.5.2010,  09:34 Найти цитируемый пост)
Я сейчас на коленях с книжкой Фленова. 

Выбрось. Немедленно. Там заблуждение на заблуждении сидит и заблуждением погоняет. Плюс - эти книги приучают к неверному проектированию и пониманию сути программирования в Delphi.
Если пройтись по форумам, то лучшее, что можно найти о книгах Фленова, Фараонова и Архангельского - "сжечь с соблюдением обрядов черной магии".
PM MAIL WWW   Вверх
PsiMagistr
Дата 28.5.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



kami, наверное Вам виднее. Стиль изложения Фленова мне нравится. Не засорен лишней терминологией. Я вообще начинал с Visual Basic. Но освоить ООП на нем можно только на весьма элементарном уровне, он и указателей то толком не поддерживает. Опять же наследование хромает. Про полиморфизм - молчу. По крайней мере, если не пользоваться хакерскими приемами. Не знаю как, но ухитрился написать на нем ролевую игру. Никакой графики делать не стал. Писал чисто от балды. Справочник - на колени и вперед. Кода там не слишком много вышло, но все равно путаешься. 

Потом закусил губы и заставил себя сесть на Object Pascal. Решил давать упор на ООП. Вообще ИМХО - знаешь ООП, считай большая часть языка в кармане. Книг у меня очень мало. Друзья далеки от программирования в принципе. Плюс (он же минус )) ) по состоянию здоровья не хожу. Ищу в сети книги, если, грубо говоря, врубаюсь в написаное - беру книжный вариант. Хорошей лит-ры по ООП вообще не видел. В основном простейшее: учат рисованию кнопок на форме, базовой работе с VCL. Я этот VСL вообще методом научного тыка осваиваю. )))   А чуть что посложнее - ошибок много начинается в книжках, только успевай вылавливать.

kami, а Вы сами по каким книжкам учились? Посоветуйте, если не трудно, наименее глючное. )))

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


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

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

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

---

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(PsiMagistr @  28.5.2010,  12:47 Найти цитируемый пост)
 Стиль изложения Фленова мне нравится. Не засорен лишней терминологией. 

Хозяин - барин. Но в случае продолжения обучения по его книгам прошу относиться скептически ко всему изложенному там, так же, как и в этом вопросе.

Цитата(PsiMagistr @  28.5.2010,  12:47 Найти цитируемый пост)
а Вы сами по каким книжкам учились?

Честно - не помню. Давно это было. Но, по содержанию было похоже на Архангельского (что-то типа "Программирование в Delphi 3") - тупой перевод хелпа с некоторыми примерами. Хотя, в той книге затрагивались аспекты разработки собственных компонентов.


Цитата(PsiMagistr @  28.5.2010,  12:47 Найти цитируемый пост)
Посоветуйте, если не трудно, наименее глючное. )))

Вроде, рекомендуют Тейксера и Пачеко, Марко Кэнту и Рея Конопку... Сам не читал ( smile ). Правда, если они изложены сухим языком, то начинать (именно начинать) учиться по ним - скучно. В этом случае, действительно уж лучше кто-нибудь типа Фленова, только при прочтении не стоит принимать всё за аксиому.
PM MAIL WWW   Вверх
bems
Дата 28.5.2010, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(PsiMagistr @  28.5.2010,  12:47 Найти цитируемый пост)
Но освоить ООП на нем можно только на весьма элементарном уровне, он и указателей то толком не поддерживает
Зачем тебе указатели, если есть ООП? smile



--------------------
Обижено школьников: 8
PM MAIL   Вверх
PsiMagistr
Дата 30.5.2010, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



bems, ООП на Бейсике это чистая жесть. От него одно название.


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

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

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

---

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


Бывалый
*


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

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



Возможно, вас заинтересует ещё это обсуждение:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=77021
И далее по ссылкам...
PM   Вверх
dvamaster
Дата 10.6.2010, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(PsiMagistr @  26.5.2010,  12:18 Найти цитируемый пост)
Указатель на объект-форму у нас только один и это переменная Form2


Она описана в Unit2.

Определи список форм хотябы в массиве (в Unit2 можешь закоментировать)
Код

var
//  Form2: TForm2;
  Form2List: array [0..9] of TForm2;


В классе Form2 укажи индекс на пизицию в массиве

Код

type
  TForm2 = class(...)
    ...
    FListIndex: Integer;
    ...
  end;


в событии OnCreate найди свободное место в массиве и присвой ему данный экземпляр

Код

  ...
  Form2List[EmptyIndex] := Self;
  FIndexList := EmptyIndex
  ...


в событии OnDestroy по индексу формы очисти занятое место в массиве (вызывать Destroy или Free не нужно, форма и так уничтожается)

Код

   Form2List[FIndexList] := nil;


для удаления всех форм перебираем массив находим не пустые ячейки и удаляем формы (присваивать nil необязательно, т.к. форма сама поставит nil где надо)

Код

  for i := 0 to 9 do
    if Form2List[i] <> nil then
      Form2List[i].Free;


Добавлено через 1 минуту и 7 секунд
если максимальное число форм не известно, то лучше список реализовать на динамических массивах, и код соответсвенно переделать


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
PsiMagistr
Дата 10.6.2010, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо большое, БелАмор, dvamaster.


Макс. число форм известно. 

1) Форма- Главное меню игры.

2) Форма регистрация нового игрока.

3) Форма открытия персонажей. (думаю убрать, а код перенести в главное меню игры)

4) Форма карта локаций.

5) Форма-магазин.

6) Форма боевого полигона. (Все бои там с монстриками - там)

P.S. Только не запутаться бы. )))




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

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

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

---

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


Опытный
**


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

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



Ради эксперимента создал Главную форму (MainForm) и Дочернюю форму (DochForm). Автосоздание   DochForm отключил. Visible DochForm := true;

На пузе MainForm - кнопка:

Код

procedure TMainForm.Button1Click(Sender: TObject);
begin
DochForm:=TDochForm.Create(MainForm); //Строим дочернюю форму.
MainForm.Hide; // Скрываем главную. 
end;


При закрытии дочерней формы пишем:

Код

procedure TDochForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree; //Уничтожаем
MainForm.Show; // Показываем главную форму.
end;


Ставим кнопку на дочернюю форму. Пишем:

Код

procedure TDochForm.Button1Click(Sender: TObject);
begin
Close; //Закрываем дочернюю форму. 
MainForm.Show; //Главную показать. Вроде эта строка не должна выполняться, мы же форму только что закрыли. Любопытно. 
end;


А при попытке в этой же кнопке написать:

Код

procedure TDochForm.Button1Click(Sender: TObject);
begin
DochForm.Free; // Весьма любопытно. Закрываем дочернюю форму. БАЦ - ОШИБКА. Хотя тот же Close, в котором Action := caFree записан работает на ура. 

MainForm.Show; //Главную показать. Вроде эта строка не должна выполняться, мы же форму только что закрыли, то есть из этой процедуры вышли или нет?. Любопытно.

end;






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


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

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

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

---

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


Бывалый
*


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

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



Цитата

Автосоздание   DochForm отключил. Visible DochForm := true;

Зачем устанавливать в дизайнере Visible=True ?
Привыкайте к тому, что обычно формы (кроме MDIChild) невидимы после создания и отображаются вручную через вызов Show или ShowModal.

Цитата

Ставим кнопку на дочернюю форму. Пишем:
procedure TDochForm.Button1Click(Sender: TObject);
begin
Close; //Закрываем дочернюю форму. 
MainForm.Show; //Главную показать. Вроде эта строка не должна выполняться, мы же форму только что закрыли. Любопытно. 
end;
 
А если форма закрывается по Alt-F4 ? Кто тогда будет показывать главную форму?
Есть MainForm.Show в обработчике FormClose?
А тогда зачем оно в обработчике нажатия кнопки?

И кстати, зачем вообще скрывать главную форму? Не лучше ли показывать вторую в модальном режиме через вызов ShowModal? (вот тут, кстати, ваш Visible=True и встанет поперёк дороги...)

Цитата

А при попытке в этой же кнопке написать:
 procedure TDochForm.Button1Click(Sender: TObject);
begin
DochForm.Free; // Весьма любопытно. Закрываем дочернюю форму. БАЦ - ОШИБКА. Хотя тот же Close, в котором Action := caFree записан работает на ура. 

MainForm.Show; //Главную показать. Вроде эта строка не должна выполняться, мы же форму только что закрыли, то есть из этой процедуры вышли или нет?. Любопытно.

end;
 
 Метод Button1Click - метод той формы, которую вы удаляете.
Купите красивую рамочку, распечатайте крупным шрифтом, поместите напечатанное в рамочку и повесьте на стену. Надпись - следующая:

Запрещается уничтожать объекты в их собственных обработчиках.

В данном конкретном случае:
Обработка клика по кнопке не начинается и не заканчивается вызовом назначенного вами обработчика. И до его вызова, и после - выполняется куча кода. Когда где-то в середине этого процесса, а конкретно, в вашем обработчике, уничтожается форма, то форма также уничтожает и кнопку, и вся дальнейшая работа идёт уже с уничтоженным объектом (кнопкой) и там возможно всё, что угодно.
Обратите внимание, что Button1Click - обработчик нажатия кнопки, но является методом формы.
По этому поводу, возможно, будет интересно почитать здесь: http://www.delphikingdom.com/asp/answer.asp?IDAnswer=68289
По поводу caFree смотрите ссылку: http://www.delphikingdom.com/asp/answer.asp?IDAnswer=75600
Применять описанный там способ я вам не рекомендую, но сопутствующие объяснения могут пригодиться.


PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.