Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2010, 15:39   #1
Solrainer7
 
Регистрация: 09.07.2010
Сообщений: 3
Вопрос Вопрос по классам делфи и их использованию.

Уважаемые знатоки программирования.
Подскажите по работе с классами делфи.
Создаю кнопку програмно.

Код:
Procedure event_on_something(Sender:Tobject);
var but2:tbutton;
begin

but2 := tbutton.create(form2);

with but2 do begin
                  caption:=ololo;
                  parent:=form2;
end;
end;
Почему я объекту but2 должен присваивать tbutton.create, почему я не могу просто сделать but2.create, ведь переменная but2 уже является экземпляром класса tbutton.
или but2:=but2.create(form2);

ЗЫЖ.: не надо писать "как надо написать", меня больше интересует вопрос "почему так, а не эдак"
Solrainer7 вне форума Ответить с цитированием
Старый 12.07.2010, 15:56   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Solrainer7 Посмотреть сообщение
Почему я объекту but2 должен присваивать tbutton.create, почему я не могу просто сделать but2.create, ведь переменная but2 уже является экземпляром класса tbutton.
С какой стати? Переменная в данном случай всего лишь указатель и сейчас он указывает пальцем в небо. Вы же не создали экземпляр класса. В момент создания экземпляра копируются поля (методы вызываются всегда те же самые). Как Вы собираетесь пользоваться внутренними данными, если они еще не получены из образца? Описание класса это только клише, эталон. А Create это станок который копирует их, оставляет оттиски если хотите. как в старых печатных машинках были металлические буковы. Так вот не макнув буковку в чернила и не оставив оттиск на бумаге, буков Вы не увидите. Даже если у Вас и есть печатная машинка. Ну образно выражаясь дело обстоит таким образом.
Или по-другому - даже если у Вас есть ДНК (описание класса в type), это не означает что у Вас сразу будет стадо овечек. Необходимо их клонировать... Create этим и занимается.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 12.07.2010 в 16:12.
Utkin вне форума Ответить с цитированием
Старый 12.07.2010, 16:12   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Почему я объекту but2 должен присваивать tbutton.create
Конструкторы, это функции, которые создают обьект, размещают его в памяти, и возвращают адрес на ячейки с которых данные объекта начинаются.
Если ты напишешь просто but2.create не присвоив результат ничему, обьект то создастся, но он не будет привязан ни к какой переменной, не будет иметь якоря, как говаривают спецы, а следовательно для Делфи это мусор в памяти.

К тому же изначально у переменная обьекта инициализируется в nil. Это 0.
Ты попробуй обратится в виндоусе к ячейке памяти по номеру 0 - тебя так далеко пошлют...
Поэтому нужно сначала создавать от класса экземпляр, и обязательно результат конструктора связывать с некой переменной, которая будет на него указывать.

Между прочим ты можешь писать:
Код:
but2 := tbutton.create(form2);
but3 := but2.create(form2);
Это сработает потому что but2 уже созданна, и не равна nil, потому с нее можно вызывать конструктор.

Так что дело только в том что изначально инициализация обьектных переменных проходит в nil
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.07.2010, 16:13   #4
ji_ji
Пользователь
 
Аватар для ji_ji
 
Регистрация: 24.06.2010
Сообщений: 20
По умолчанию

Потому что не был создан экземпляр класса, вы не сможете через but2 вызывать методы и свойства данного класса.
but2 := tbutton.create(form2)
здесь мы создаем экземпляр класса tbutton, тем самым мы через but2 можем вызывать методы и свойства tbutton.
Если что то не правильно поправьте меня. Полезно будет вам почитать про архитектуру системы компонентов в делфи.
А теперь мой вопрос к профи, я просто чет подзапаминовал а объект это и есть тот самый экземпляр класса?
я в жж

Последний раз редактировалось ji_ji; 12.07.2010 в 16:15.
ji_ji вне форума Ответить с цитированием
Старый 12.07.2010, 16:21   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а объект это и есть тот самый экземпляр класса?
Эту терминологию можно трактовать кто как хочет.
Я лично считаю что это одно и тоже.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.07.2010, 16:24   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Главный вопрос - выделение памяти под структуры класса . Это как указатели, работали с ними? Вот есть такая операция new - выделение память под структуру данных. Без нее структурой пользоваться нельзя. Ибо указатель указывает на нечто, что не соответствует данной структуре. В Create во-первых происходит выделение памяти, аналогично new, а, во-вторых, указателю присваивается адрес только что созданной структуры. В принципе, при желании, можно самому сделать некоторое подобие класса, но это уже только если интересно.

Цитата:
Я лично считаю что это одно и тоже.
Я тоже .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 12.07.2010, 19:16   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

надо делать именно TButton.Create
потому что как бы то не было, конструктор получает параметр, этот параметр это указатель на VMT того класса который <>.Create.
так как переопределение и вирт методы используются повсеместно, то надо делать так.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по использованию randomizer в паскале Kati Помощь студентам 1 08.03.2010 23:48
Вопрос по использованию Worksheet? Vadim_abs Microsoft Office Excel 8 11.11.2009 11:54
Вопрос по использованию SQLite в delphi ROFF Помощь студентам 1 06.05.2009 09:26
Вопрос по использованию OLE yngwie Общие вопросы C/C++ 0 19.03.2009 00:56
вопрос по использованию конструкции if zetrix Microsoft Office Excel 0 31.10.2006 07:52