Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/26: Рейтинг темы: голосов - 26, средняя оценка - 4.77
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
Delphi 6-7

Теоретический пробел в TObject.Create

01.09.2023, 13:00. Показов 7152. Ответов 180
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!

Возник у меня некий теоретический пробел по поводу конструктора TObject.Create.

C одной стороны, он ведет себя, как функция, возвращающая указатель на созданный экземпляр.
С другой стороны, сам Delphi считает его процедурой.
В хелпе указано, что TObject.Create выделяет память, но не инициализирует данные. Но память выделяет.
А в исходниках все тело конструктора состоит из begin/end.

Правильно ли я понимаю, что этот конструктор - что-то типа разновидности команды для препроцессора, где компилятор Delphi, встречая этот вызов, сам организовывает выделение памяти и возвращение адреса созданного экземпляра?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.09.2023, 13:00
Ответы с готовыми решениями:

Cannot convert 'void (_fastcall * (_closure )(TObject *,char &))(TObject *,char &)' to 'TKeyPressEvent'
доброго времени суток. роект был создан в builder 2007, а при попытке его скомпилировать на rad studio 2010 выдается ошибка: ...

Reverse for 'create' not found. 'create' is not a valid view function or pattern name
Всем привет, появилась проблема. Всё делал по инструкции, по итогу всё равно выбило ошибку: NoReverseMatch at / Reverse for 'create'...

TFilestream.create [cannot create file]
function bat: string; begin with TFileStream.Create(extractfilepath(application.ExeName)+'bin\gcc\bin\compile.bat', fmCreate) do ...

180
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
09.09.2023, 18:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Constcat Посмотреть сообщение
Object'у не требуется конструктор, если отсутствуют виртуальные методы.
Я не про object, а про class писал.

Добавлено через 4 минуты
Цитата Сообщение от Constcat Посмотреть сообщение
кто-то решил, что экземпляр класса нужно обязательно создавать в куче (что, как по мне - очень странное решение.
Чем же оно странное? Мы же знаем, что стек не резиновый, а куча, всё же, гораздо больше стека, а в современных программах объектов может быть дофига, так что, помещать их в кучу вполне разумное решение.

Правда, я забыл, стек один на весь процесс или у каждого потока свой? Но это не принципиально, в принципе.
0
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
09.09.2023, 19:09
Цитата Сообщение от Beltar Посмотреть сообщение
Это, если конструктор находится в ветке if'а или в case, и в одном случае переменная инициализируется одним конструктором, а в др. другим. Именно это и есть полиморфизм.
Ну, вот... А я уже раскатал губу послушать об интересных решениях... Эх...

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

Добавлено через 18 минут
Цитата Сообщение от northener Посмотреть сообщение
Поздно. Записи уже давно не чистые данные.
Я наслышан. Но поскольку Дельфи у меня не пережила цифру 7, то я об этом "не знаю". )))))

Цитата Сообщение от Beltar Посмотреть сообщение
Имею я право так сделать? Имею. Какая ветка будет вызвана в каждом случае неизвестно. В случае дельфового record такое невозможно, т. к. память под Unit будет выделена на стеке при вызове процедурки с этой переменной, в размере, необходимом для этой переменной. С классом просто, есть выделенная память под ссылку, в которую будет засунута ссылка на созданный экземпляр, который знает свой класс. Отсюда и вопрос, если в объектной модели, объекты похожи на структуры, пусть и с наследованием, то как с ними сделать подобное?
Ну, почему же? Объявим два разных типа рекорд. Потом переменную - указатель на рекорд1. Выделим память размером рекорд2. Ссылку в переменную. Далее используя приведение типов работаем с выделенной областью через переменную. По сути та же фигня, что у ООП-магии. Не пробовал (естественно, см. выше), но, если Борланды не вставили зехеров на отстрел хитромудрых, то всё вполне законно. И никакого хакерства. )))) Теперь оформляем это всё в стиле потомок-предок. И никакая Варвара Лескова не заметит подставы. ))))

Добавлено через 6 минут
Цитата Сообщение от Beltar Посмотреть сообщение
Вообще-то методы у записей всего-лишь способ сделать нормальным поиск процедурок подходящих для них, т. к. функционально
А писать комментарии и компоновать код не левой задней ногой - во все времена считалось делом ненормальным и, вообще, нечестивым!

Кстати, кто такие хелперы?
0
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
09.09.2023, 19:15
Цитата Сообщение от XpomAI Посмотреть сообщение
Ну, почему же? Объявим два разных типа рекорд. Потом переменную - указатель на рекорд1. Выделим память размером рекорд2. Ссылку в переменную. Далее используя приведение типов работаем с выделенной областью через переменную. По сути та же фигня, что у ООП-магии. Не пробовал (естественно, см. выше), но, если Борланды не вставили зехеров на отстрел хитромудрых, то всё вполне законно. И никакого хакерства. )))) Теперь оформляем это всё в стиле потомок-предок. И никакая Варвара Лескова не заметит подставы. ))))
Можно сделать через юнионы, объявив самым первым поле, в которое записываем тип записи, которую будем создавать. Далее после проверки этого поля обращаемся к структурке соответствующим тайп-кастом. Т. е. фактически реализуем то, что у нас компилятор делает автоматически. Закат солнца вручную, слава принцессе Селестии. Плюс неэффективно т. к. разметить память сразу придется по макс. размер из возможных.
0
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
09.09.2023, 19:21
Цитата Сообщение от Beltar Посмотреть сообщение
Сама запись в виде "дрова.колоть(топором)" более удобна, чем "колоть(топором, дрова)".
Слово "удобный" - очень спорно в данном случае. Прежде всего всё зависит от той абстрактной модели, которая используется программописателем для решения поставленной задачи. Причём, очень часто главенствующее влияние оказывают не объективные факторы, а предпочтения программиста. Кому-то нравится копать лопатой, а кому-то лопатой копать. А есть ещё такие, что предпочтут копатой лопать. Результат будет один и тот же. Это относится почти ко всей вашей полемике с Constcat.
0
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
09.09.2023, 19:24
Цитата Сообщение от XpomAI Посмотреть сообщение
Кстати, кто такие хелперы?
var N:Integer;
ShowMessage(N.ToString);

Реализация на примере добавления кнопке TSpeedButton свойства Checked из реального проекта, причем перед этим там уже был написан код под TCheckBox, у которого это свойство есть, но я решил сделать свой чекбокс из кнопки, устанавливая\снимая картинку, т. е. хелпер чутка уменьшал переделки.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  TSpeedButtonHelper=class helper for TSpeedButton
    function Checked:Boolean;
    procedure SetChecked(Value:Boolean);
  end;
 
{ TSpeedButtonHelper }
 
function TSpeedButtonHelper.Checked: Boolean;
begin
Result:=ImageIndex>-1;
end;
 
procedure TSpeedButtonHelper.SetChecked(Value: Boolean);
begin
if Value then ImageIndex:=0
            else ImageIndex:=-1;
end;
2
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
09.09.2023, 19:38
Цитата Сообщение от Beltar Посмотреть сообщение
объявив самым первым поле, в которое записываем тип записи, которую будем создавать
Согласен, если нужно идентифицировать тип. В противном случае, сами пишем, сами и определяем, зачем нам ещё доп. записка. Насчёт эффективности - таж фигня. Непосредственно перед выделением памяти мы знаем под что и, соответственно, сколько нужно выделить памяти.

И кто такие юнионы? Мы ещё в Дельфи?

Добавлено через 9 минут
Цитата Сообщение от Beltar Посмотреть сообщение
Реализация на примере добавления кнопке TSpeedButton свойства Checked из реального проекта, причем перед этим там уже был написан код под TCheckBox, у которого это свойство есть, но я решил сделать свой чекбокс из кнопки, устанавливая\снимая картинку, т. е. хелпер чутка уменьшал переделки.
Если я правильно понял - такая себе глухая побочная ветка наследования, которая даже не "видится", как наследование. Наверное, очень удобно подшаманить уже имеющиеся компоненты. Спасибо, я до этого не добрался. ))))
0
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
09.09.2023, 19:47
Юнионы - это записи с вариантными полями. Да я пальцы сломаю, такое печатать. Термин из Си просто короче. А вообще они как бы deprecated. Но я против. Я как должен без них байты размечать??

Цитата Сообщение от XpomAI Посмотреть сообщение
Если я правильно понял - такая себе глухая побочная ветка наследования, которая даже не "видится", как наследование
Просто способ приделать существующему типу новые методы и вызывать их через точку. Т. е. для встроенного Integer.ToString где-то определен в хелпере метод ToString, который просто вызывает IntToStr. В C# ЕМНИП имитация для атомарных типов синтаксиса классов с вызовом через точку, называется unboxing. Там есть, нам тоже надо.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
09.09.2023, 20:16
Цитата Сообщение от XpomAI Посмотреть сообщение
И кто такие юнионы? Мы ещё в Дельфи?
Это в си. В паскале это record с case.
0
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
09.09.2023, 20:54
Цитата Сообщение от Rayvenor Посмотреть сообщение
Сообщение от Beltar
1) Процедура это функция, не возвращающая обязательно результата.
Сообщение от XpomAI
Согласитесь, если процедуру определять таким образом, то функцию можно определить, как процедуру, обязательно возвращающую результат. Нет?
Оба два нет. Из ваших определений следует, что процедура может возвращать результат. Но и функция тоже может возвращать, а может не возвращать результат. И получается что разницы нет. А она есть.
Давать им определения лучше через забытое понятие подпрограммы. И процедура и функция это подпрограммы. Функция отличается от процедуры тем, что может быть операндом выражения, а процедура - нет.
Любите вы изобретать велосипед. )))))
Я городил огород, чтоб таким образом показать Beltar-у, что манипуляции с определениями очень легко вывернуть в противоположную сторону.
А, вообще, процедура и функция - это очень старые понятия, у которых давно есть строгие определения, не нуждающиеся в уточнении. И возникли они до появления Си, до появления Паскаля. Верно замечено, что они определяются через подпрограмму. Функция - подпрограмма, возвращающая значение. Процедура - подпрограмма, не возвращающая значение. Всё! Можно добавить сложноподчинённых рюшечек, на любителя. А последняя фраза не есть определение - следствие. По крайней мере, я ни разу не видел системы определений выворачивающей из-за этоо угла. )))

Добавлено через 11 минут
Цитата Сообщение от Beltar Посмотреть сообщение
Функция, не возвращающая значение в Си все равно называется функцией. Понятно, что термин этот пришел из математики, хотя в чисто математическом смысле функция в программировании должна быть чистой, т. е. не вносить никаких изменений вне себя, кроме возврата результата. procedure же - чисто паскалевский термин. Может алголовский, но мне лень проверять.
Си, конечно, очень старается быть законодателем мод. И небезуспешно. ))))

Добавлено через 17 минут
Цитата Сообщение от AzAtom Посмотреть сообщение
Сообщение от Constcat
кто-то решил, что экземпляр класса нужно обязательно создавать в куче (что, как по мне - очень странное решение.

Чем же оно странное? Мы же знаем, что стек не резиновый, а куча, всё же, гораздо больше стека, а в современных программах объектов может быть дофига, так что, помещать их в кучу вполне разумное решение.
Правда, я забыл, стек один на весь процесс или у каждого потока свой? Но это не принципиально, в принципе.
Динамическую память придумали не сразу за классами. Она была много раньше. В неё можно было поместить переменные любого типа (может и были ограничения, это не меняет сути). Поэтому предоставление кучи для размещения class-ов и object-ов не кажется странным. Странным кажется "запрет" размещать их в статической памяти. В современной (да и не только) программе можно наворотить ворох тех же записей или массивов. Если делать это не аккуратно (даже в динамике), вы задолбаетесь в магазин за новыми планками памяти бегать. Кстати, при чём здесь стек? Его можно положить и более изыскано. Если не обращать внимание на ортодоксов, то никто не отменяет рекурсию из-за любви к стеку.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
09.09.2023, 21:10
Цитата Сообщение от XpomAI Посмотреть сообщение
Странным кажется "запрет" размещать их в статической памяти.
Мне никто не запрещал. Но я и не пытался. Программа сама туда их не кладёт. И хорошо - больше места для рекурсии останется.
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
09.09.2023, 22:40  [ТС]
Цитата Сообщение от Beltar Посмотреть сообщение
Меня до сих пор трясет от того, что происходит в програмке на Си, если пропустить амперсанд в каком-нибудь printf.
Есть такое. В c++ один и тот же символ может означать в зависимости от контекста совершенно разные вещи. Амперсанд - и взятие адреса, и передача параметра по ссылке. И работает как absolute в Delphi.)))))

Добавлено через 3 минуты
Цитата Сообщение от AzAtom Посмотреть сообщение
Чем же оно странное? Мы же знаем, что стек не резиновый, а куча, всё же, гораздо больше стека, а в современных программах объектов может быть дофига, так что, помещать их в кучу вполне разумное решение.
Странное оно тем, что опять за разработчика решают, что для него полезно.
Object'ы при том же функционале вполне себе существуют в стеке.
А если отойти от Delphi в сторону c++, то там экземпляры создаются там, где нужно разработчику.
Или там какой-то другой стек?)))))

Добавлено через 7 минут
Цитата Сообщение от AzAtom Посмотреть сообщение
Мне никто не запрещал.
Экземпляр класса можно создать только в динамике. Разве это не запрет?

Добавлено через 2 минуты
Цитата Сообщение от Beltar Посмотреть сообщение
Просто способ приделать существующему типу новые методы и вызывать их через точку.
А я вот не понял. Чем это отличается от банального наследования нужного класса и оверрайда нужных методов?
0
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
09.09.2023, 22:43
Цитата Сообщение от AzAtom Посмотреть сообщение
Мне никто не запрещал.
Хм-м. Но никто и не разрешал. ))))) Абидна, да!

Цитата Сообщение от Constcat Посмотреть сообщение
Object'ы при том же функционале вполне себе существуют в стеке.
Цитата Сообщение от AzAtom Посмотреть сообщение
И хорошо - больше места для рекурсии останется.
Снова стек. Вообще, статические переменные, особенно крупные, можно и в сегменте данных хранить. Дался вам этот стек! Рекурсируйте в нём в своё удовольствие. )))
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
09.09.2023, 22:47
Цитата Сообщение от XpomAI Посмотреть сообщение
и в сегменте данных хранить
Речь про TP, DOS, и реальный режим процессора?

Добавлено через 24 секунды
Цитата Сообщение от XpomAI Посмотреть сообщение
Абидна, да!
Мне - нет.
0
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
09.09.2023, 22:49
Цитата Сообщение от AzAtom Посмотреть сообщение
Речь про TP, DOS, и реальный режим процессора?
Нет. Дельфи, вроде, в DOS-е не живёт, нет?
0
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,662
09.09.2023, 22:49
Цитата Сообщение от Constcat Посмотреть сообщение
absolute в Delphi.
Это директива размещения переменной по абсолютному адресу. Ни разу не пользовался. Получить адрес @.

Цитата Сообщение от XpomAI Посмотреть сообщение
Я городил огород, чтоб таким образом показать Beltar-у, что манипуляции с определениями очень легко вывернуть в противоположную сторону.
Я вам сказал, что о терминах договариваются. Договорились ли о терминах во всем сообществе программистов еще вопрос, раз в Си вводили свою терминологию, в Паскале свою, про фортрановскую я вообще не в курсе, знаю только что у них индексация массивов Col, Row, а не как у людей.

Цитата Сообщение от Constcat Посмотреть сообщение
А я вот не понял. Чем это отличается от банального наследования нужного класса и оверрайда нужных методов?
Во-первых, в самой дельфе это применяется и для атомарных типов, во-2, у меня, как вы видели был хелпер к компоненту, который наследовать нежелательно. Ну или наследование через перехватчик делать.

Так-то статистически у меня, наверное, 95% случаев использования данной функции - это ToString, но даже это полезно.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
09.09.2023, 22:51
Цитата Сообщение от Constcat Посмотреть сообщение
Разве это не запрет?
Я бы сказал не "запрещено", а "других вариантов не предусмотрено".
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
09.09.2023, 22:52  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Речь про TP, DOS, и реальный режим процессора?
Ну почему? Например, про Windows 10/MacOs. Там экземпляры класса вполне себе живут в стеке (сегменте данных - спешиал для XpomAI)))).
Правда, под c++, а не под Delphi. Но стек ведь тот же?
0
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
09.09.2023, 22:54
Цитата Сообщение от Beltar Посмотреть сообщение
Я вам сказал, что о терминах договариваются. Договорились ли о терминах во всем сообществе программистов еще вопрос
Отлично! Оставим вопрос открытым, пока кто-нибудь не принесёт выдержки из резолюции Всемирного Съезда Программистов. Не против? )))

Добавлено через 1 минуту
Цитата Сообщение от AzAtom Посмотреть сообщение
Я бы сказал не "запрещено", а "других вариантов не предусмотрено".
Это софистика. Смысл и последствия всё равно одни.
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
09.09.2023, 22:54  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Я бы сказал не "запрещено", а "других вариантов не предусмотрено".
Это уже какой-то эвфемизм)))) Все, что угодно я могу создать на стеке (даже object), а вот экземпляр класса не могу. Это ли не запрет?)))))
0
0 / 0 / 0
Регистрация: 02.09.2023
Сообщений: 27
09.09.2023, 23:04
Цитата Сообщение от Constcat Посмотреть сообщение
Например, про Windows 10/MacOs. Там экземпляры класса вполне себе живут в стеке (сегменте данных - спешиал для XpomAI))))
Сегмент стека = Сегмент данных?

Добавлено через 7 минут
Цитата Сообщение от AzAtom Посмотреть сообщение
Речь про TP, DOS, и реальный режим процессора?
Я Вам больше того скажу. Накидывая в кучу, мы потенциально уменьшаем размер стека.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.09.2023, 23:04

how can i create mainmenu with any fonts wich i wont and how can i create mainmenu with diferent style?
please tell me how can i create mainmenu with any fonts wich i wont and how can i create mainmenu with diferent style?

CREATE SEQUENCE - ошибка синтаксиса в "CREATE"
Выполняю некоторое задание по вузу, в ERBuilder создаются таблицы, связи между ними задаются, добавляются последовательности(или триггеры),...

Каждую группу из n последовательно стоящих символов ‘’ (пробел) и '\t' (табуляция) заменить на один пробел
Каждую группу из n последовательно стоящих символов ‘’ (пробел) и '\t' (табуляция) заменить на один пробел

В строке заменить пробел между слов на запятую и пробел
В строке заменить пробел между слов на запятую и пробел

Заменить неразрывный пробел NBSP на обычный пробел в файле
здравствуйте написал скрипт: with open('russianSpeaking.js', 'r', encoding='utf-8') as f: # чтение из файла f_text = f.read() ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru