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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2011, 03:19   #1
sdsfy
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 27
По умолчанию Передача Property как Var параметр в функцию

Допустим есть некоторое свойство
Код:
Property Prop1: Integer Read FProp1 Write Fprop1;
Есть функция
Код:
function(var param1: integer): integer;
при передаче Prop1 как параметр функции, компилятор ругается, что не может передать Константу!!!! как var параметр!

Кто знает, что это может быть?

Вынужденно заводу однотипную переменную, в нее пишу значение Prop1, передаю в функцию, читаю из нее ответ обратно в Prop1.
sdsfy вне форума Ответить с цитированием
Старый 21.09.2011, 03:32   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, дык, правильно ругается. Ведь фактически Prop1 сводится к чтению FProp1 (если нужно значение Prop1) и изменением FProp2 (если идёт изменение Prop1).
И Вы абсолютно правильно нашли выход из ситуации (в общем случае!)
Но, разумеется, могут быть и другие варианты. Но они зависят от того, что вы делаете и зачем изменяете параметр в функции.

По хорошему, если функция должна изменить параметер, то это должна быть не функция, а метод класса. А ему FProp1 доступна по определению!

"по плохому", можно сделать публичной Fprop1 и передавать именно эту переменную в функцию (так делать категорически не рекомендую! Пишу только в рамках ознакомления)

ну и ещё вариант. можно передавать в функцию целиком объект, тогда внутри функции будет возможно изменять Prop1:
Код:
function(var obj1: MyTObj): integer;
....
  obj1.Prop1 := xxxxxx
....

p.s. но не вижу ничего плохого в том способе с добавочной переменной, который Вы "вынужденно" используете.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.09.2011, 03:47   #3
sdsfy
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 27
По умолчанию

Спасибо!

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Но, разумеется, могут быть и другие варианты. Но они зависят от того, что вы делаете и зачем изменяете параметр в функции.
Передается в COM объект. Публичной не сделать. В принципе, можно конечно отказаться от Property и делать все на переменных класса. Я просто наивно полагал, что Проперти можно воспринимать как переименованную переменную. Естественно в случае, когда она не читается и/или не пишется функциями.
sdsfy вне форума Ответить с цитированием
Старый 21.09.2011, 10:16   #4
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Код:
Property Prop1: Integer Read FProp1 Write Fprop1;
...
var
  P: Integer;
begin
  P := Prop1;
  FunName(P);

function FunName(var param1: integer): integer;
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 21.09.2011, 16:53   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Свойство <> поле. Оно его имитирует, но им не является.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 21.09.2011, 17:48   #6
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Публичной не сделать
Почему ? Что мешает ?
mss вне форума Ответить с цитированием
Старый 21.09.2011, 19:07   #7
sdsfy
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Почему ? Что мешает ?
НУ как я понимаю, COM сервер не видит контекста вызывающего объекта. Т.е. ее можно сделать публичной для модуля, в котором она находится. В COM-Сервер все равно она передается как параметр функции описанной в реализуемом интерфейсе.

Хотя, опять таки, возможно мы немного друг друга недопонимаем... в принципе, можно уйти от свойств к переменной. ее и передавать напрямую... тогда, вместо публичного свойства, будет публичная переменная...

Последний раз редактировалось sdsfy; 21.09.2011 в 19:16.
sdsfy вне форума Ответить с цитированием
Старый 21.09.2011, 20:00   #8
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
COM сервер не видит контекста вызывающего объекта
А он ему нужен ?
Не нужкн.
Все что ему нужно - ссылка на объект и инф-ция об имени св-ва, к которому ему следует обратиться.

Прямой путь к реализации IDispatch
mss вне форума Ответить с цитированием
Старый 21.09.2011, 21:20   #9
sdsfy
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Прямой путь к реализации IDispatch
Так далеко фантазировать, когда стоит вопрос, как передать простой Int параметр? Думаю, решения должны быть целесообразными
sdsfy вне форума Ответить с цитированием
Старый 21.09.2011, 22:32   #10
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
решения должны быть целесообразными
Чтобы они были целесообразными, следует внятно пояснить что мешает передать параметром непосредственно поле FProp1, на которое по read/write у тебя в классе ссылается св-во Prop1
mss вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Notice: Trying to get property of non-object. для property of static property Jakethefish PHP 8 16.08.2011 16:09
Передача списка указателей (TList) как параметр в dll sneksnek2006 Общие вопросы C/C++ 1 28.10.2010 11:33
Как передать в функцию параметр разных типов borispnz Общие вопросы Delphi 5 06.02.2010 08:37
Передача динамического массива как параметр ф-ции kurdt Общие вопросы Delphi 2 26.04.2009 17:35
Передача компонента как параметра в функцию hayhay Microsoft Office Excel 1 11.03.2008 15:53