![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| omickron |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 12.2.2009 Репутация: нет Всего: 1 |
Ребят, помогите, пожалуйста, разобраться с пониманием работы конструкторов.
Имеется форма класса TMyForm = class(TForm). Как создать объект её типа?
Тут всё просто. Я задался мыслью проверить, а не существует ли уже форма такого класса? Т.е. я хочу, чтобы в моём приложении форма класса TMyForm была только в одном экземпляре. Я сделал глобальную переменную Forms класса-наследника TStringList, в которой храню имена типов форм и ссылки на сами экземпляры форм. В конструкторе TMyForm я складываю форму в список, в деструкторе - выбрасываю из списка. Таким образом конструктор формы TMyForm получается таким:
В деструктор - вставил удаление объекта из списка. А теперь нужно в конструктор вставить проверку, не существует ли уже такой формы. Получаем:
P.S. В принципе, формы тут только для примера. На деле, у TMyForm ещё куча наследников, поэтому складывать в список имя класса нормально. Там могут быть и TMyDrawForm, и TMySimpleForm, и т.п. И каждая из них должна быть уникальна. Вместо форм, на самом деле, можно использовать любые объекты, не обязательно визуальные. Итого, главный вопрос: как в конструкторе проверить что-либо и вместо нового объекта вернуть другой? |
||||||
|
|||||||
| rodnover |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: нет Всего: 10 |
||||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
толку в этом мало. Просто не вызывать его напрямую. -------------------- Обижено школьников: 8 |
|||
|
||||
| omickron |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 12.2.2009 Репутация: нет Всего: 1 |
Ага, понял. Правда, для TForm это не прокатит - там виртуальный конструктор уже описан в public. Ну почему мало? Если конструктор будет приватным, его вызвать не получится. И для создания объектов придётся использовать или классовую функцию, или фабрику. |
|||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 4 Всего: 15 |
omickron, а может лучше так спроектировать интерфейс программы, что бы просто нельзя было одну форму 2 раза вызвать?
|
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
всегда для любого класса можно вызвать публичный конструктор унаследованный от TObject
Это сообщение отредактировал(а) bems - 26.8.2011, 14:08 -------------------- Обижено школьников: 8 |
|||
|
||||
| sCreator |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 20.8.2009 Где: Московская област ь Репутация: 2 Всего: 5 |
Где то так
Присоединённый файл ( Кол-во скачиваний: 1 )
SinglTest.zip 3,74 Kb |
|||
|
||||
![]()
|
| Правила форума "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. |