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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2024, 03:20   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Процедура с объектом и без

Я ж правильно понимаю, что вызов процедуры объекта с 4 параметрами по занимаемому коду равнозначен обычной процедуре с 5 параметрами?


Я обнаружил, что все поля TEdit, параметры которых мне надо менять в ходе выполнения программы, всегда имеют одну и ту же высоту 21

И если сделать такую процедуру - сократит ли она код при многочисленном применении в теле программы?
Код:
EditsBoubds(Edit1:TEdit; const left1, top1, Width1: integer);
begin
  Edit1.SetBounds(left1, top1, Width1, 21);
end;
Я ж правильно понимаю, что Edit1.SetBounds на самом деле вызывает 5 параметров, один из которых ссылка на объект, а обычная процедура будет вызывать только 4 в таком случае?
Kronos913 вне форума Ответить с цитированием
Старый 12.04.2024, 09:24   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
сократит ли она код при многочисленном применении в теле программы?
многочисленное - это сколько ?
десятки , сотни, ... ?

вы заменили эти N вызовов ОДНОЙ процедуры на вызов другой процедуры числом параметров на 1 меньше
т.е. уменьшили "код вызова" скажем на 10 байт.
общий объем кода уменьшится на 10 * N байт.
(десятки)10 *10 = 100
(сотни) 10 *100 =1000
....
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 12.04.2024, 17:04   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Вопрос такой: я правильно понимаю, что в процедуру объекта всегда добавляется 1 параметр - ссылка на объект? И правильно ли я понимаю, что вызов процедуры объекта с 4 параметрами - идентичен вызову обычной процедуре с 5 параметрами?
Kronos913 вне форума Ответить с цитированием
Старый 12.04.2024, 17:06   #4
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

И чтобы не создавать тему - как узнать размер когда одной процедуры?
Просто у меня на компе заметить изменение итогового файла можно только если оно больше 512 байт
Kronos913 вне форума Ответить с цитированием
Старый 12.04.2024, 18:23   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Просто у меня на компе заметить изменение итогового файла можно только если оно больше 512 байт
Хороший повод перестать париться о ерунде и забить.
Vapaamies вне форума Ответить с цитированием
Старый 12.04.2024, 21:07   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Kronos913, если вас так беспокоит размер исполняемого файла, то первое, что вам надо сделать, это отказаться от библиотеки VCL, то есть от всяких там TButton, TEdit и вообще конструктора форм в Delphi. Узнайте про библиотеку KOL, которую специально создавали под ваши задачи. Кстати, ее можно интегрировать и в визуальный конструктор форм, если нет желания прописывать все ручками.
Arigato вне форума Ответить с цитированием
Старый 13.04.2024, 00:42   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
я правильно понимаю, что в процедуру объекта всегда добавляется 1 параметр - ссылка на объект? И правильно ли я понимаю, что вызов процедуры объекта с 4 параметрами - идентичен вызову обычной процедуре с 5 параметрами?
Нет. Не правильно. Ссылка на экземпляр объекта это неявный параметр. И он не занимает место в памяти. Это всего лишь содержимое регистра аккумулятора в момент вызова метода объекта.
northener вне форума Ответить с цитированием
Старый 13.04.2024, 03:04   #8
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Ссылка на экземпляр объекта это неявный параметр. И он не занимает место в памяти. Это всего лишь содержимое регистра аккумулятора в момент вызова метода объекта.
В контексте вопроса, как я его понимаю, это неправильный ответ. На самом деле вызов идентичен настолько, что при помощи приведения типа можно подменить одну процедуру другой. Пример писать на ночь глядя лень.

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Я ж правильно понимаю, что Edit1.SetBounds на самом деле вызывает 5 параметров, один из которых ссылка на объект, а обычная процедура будет вызывать только 4 в таком случае?
Edit1.SetBounds не вызывает, а передает 5 параметров, первый из которых — Self — ссылка на объект. Да, обычная процедура будет принимать 4 параметра, но как она узнает, к какому объекту или значению THandle применять получаемые значения? Придется или передавать дополнительным параметром, или хранить во внешней по отношению к процедуре переменной, превращая ее таким образом в замыкание. Оно вам надо? ООП было создано именно для инкапсуляции контекстов. Что реализовано компилятором — тем и надо пользоваться.

Вообще, как понимаю, вопрос тут не о длине кода как таковой, а о его ожидаемой эффективности с точки зрения компилятора или процессора, так ведь? Длина кода ≠ эффективность. В частности, при написании обычной прикладной программы я бы не задумывался о длине машинной инструкции, помещающей константу в стек, а руководствовался бы чисто прикладными соображениями, той же инкапсуляцией действий, но в прикладном смысле. Какова исходная задача?

Вот над чем можно задуматься в плане эффективности кода, если хочется попарить мозг и типа наработать опыт, — так это над оптимизацией обращений к процедурным свойствам:
Код:
begin
  Edit1.Width := 100;  // неявный вызов SetBounds()
  Edit1.Left := 8;     // неявный вызов SetBounds()
  Edit1.Right := 8;    // неявный вызов SetBounds()
end;

begin
  Edit1.SetBounds(8, 8, 100, Edit1.Height);  // один вызов SetBounds(), на чтение свойство Height непроцедурное
end;
Ради этого придется смотреть ассемблерный подстрочник и/или заглядывать в исходники VCL.
Vapaamies вне форума Ответить с цитированием
Старый 14.04.2024, 01:52   #9
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
В контексте вопроса, как я его понимаю, это неправильный ответ.
Ну вам виднее, если вы действительно вникли в контекст вопроса. Я лично и не пытался это сделать. Слишком это вредно для мозгов.
Я лишь рассказал ТС правду о том самом неявном параметре метода класса. Как именно он передается в этот самый метод.
northener вне форума Ответить с цитированием
Старый 14.04.2024, 15:01   #10
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Ну вам виднее, если вы действительно вникли в контекст вопроса.
Автор темы имеет привычку не давать обратной связи после решения вопроса, но замолкает он, как правило, после моих ответов, если они в теме есть. Из чего делаю вывод, что некий контакт налажен.

Маргинал всегда поймет другого маргинала, если захочет. Плюс, в отличие от многих, я прекрасно помню, как в свое время приходилось учиться в одиночестве и при отсутствии информации (Интернета еще не было), какие вопросы при этом возникали. Удивляет, конечно, что у вопросы у автора возникают уже при наличии Интернета, но, с другой стороны, если учиться без учебника и без наставника, кусочно-разрывно один на один с задачами, далеко не всё можно загуглить, особенно если не знаешь даже, как оное обозначить. Как в анекдоте: что мы раньше называли оргазмом — оказалось астма.

Так что, если вопрос не тупой, почему бы не дать на него небанальный ответ, расширяющий кругозор? Стараюсь держать марку.
Vapaamies вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление объектом MexL Общие вопросы C/C++ 1 28.01.2019 22:42
Работа с объектом Request OlgaRostov ASP.NET 2 14.12.2015 22:49
Проблема с COM объектом. Son Общие вопросы Delphi 0 10.01.2013 23:01
слежение за объектом Giku Свободное общение 12 18.04.2012 15:20
Проблема с COM объектом resu654 Общие вопросы Delphi 2 25.05.2009 23:00