| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Конструктор Create |
| Автор: omickron 25.8.2011, 19:45 | ||||||
| Ребят, помогите, пожалуйста, разобраться с пониманием работы конструкторов. Имеется форма класса TMyForm = class(TForm). Как создать объект её типа?
Тут всё просто. Я задался мыслью проверить, а не существует ли уже форма такого класса? Т.е. я хочу, чтобы в моём приложении форма класса TMyForm была только в одном экземпляре. Я сделал глобальную переменную Forms класса-наследника TStringList, в которой храню имена типов форм и ссылки на сами экземпляры форм. В конструкторе TMyForm я складываю форму в список, в деструкторе - выбрасываю из списка. Таким образом конструктор формы TMyForm получается таким:
В деструктор - вставил удаление объекта из списка. А теперь нужно в конструктор вставить проверку, не существует ли уже такой формы. Получаем:
P.S. В принципе, формы тут только для примера. На деле, у TMyForm ещё куча наследников, поэтому складывать в список имя класса нормально. Там могут быть и TMyDrawForm, и TMySimpleForm, и т.п. И каждая из них должна быть уникальна. Вместо форм, на самом деле, можно использовать любые объекты, не обязательно визуальные. Итого, главный вопрос: как в конструкторе проверить что-либо и вместо нового объекта вернуть другой? |
| Автор: rodnover 25.8.2011, 20:04 |
| Сделать конструктор приватным и использовать классовую функцию. Шаблон называется http://ru.wikipedia.org/wiki/Singleton |
| Автор: bems 25.8.2011, 21:35 |
толку в этом мало. Просто не вызывать его напрямую. |
| Автор: omickron 26.8.2011, 09:26 |
Ага, понял. Правда, для TForm это не прокатит - там виртуальный конструктор уже описан в public. Ну почему мало? Если конструктор будет приватным, его вызвать не получится. И для создания объектов придётся использовать или классовую функцию, или фабрику. |
| Автор: superVad 26.8.2011, 10:55 |
| omickron, а может лучше так спроектировать интерфейс программы, что бы просто нельзя было одну форму 2 раза вызвать? |
| Автор: bems 26.8.2011, 14:07 |
| всегда для любого класса можно вызвать публичный конструктор унаследованный от TObject |
| Автор: sCreator 27.8.2011, 11:37 | ||
Где то так
|