Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> var-параметр процедуры 
:(
    Опции темы
December
Дата 30.6.2004, 03:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



Greetings All!
У меня есть процедура, которая описана так:
Код
procedure LoadVar(var gInt:integer;VarName:string);overload;

Но при попытке скормить ей Form.Top
Код
LoadVar(MainForm.Top,'MainFormTop');

Компилятор говорит:
Цитата

There is no overloaded version of 'LoadVar' than can be called with these arguments.

Хотя обычные интеджеровские переменные она обрабатывает нормально. Как обойти эту траблу?


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Alex
Дата 30.6.2004, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Код
var
 t: Integer;
begin
 t:= MainForm.Top;
 LoadVar(t,'MainFormTop');
 MainForm.Top:= t;
end;



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Girder
Дата 30.6.2004, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Или так:
Код

procedure LoadVar(gInt:pinteger;VarName:string);
begin
if VarName='' then gInt^:=gInt^+200;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
LoadVar(@MainForm.Top,'');
MainForm.Top:=MainForm.Top+1;
MainForm.Top:=MainForm.Top-1;
end;



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
December
Дата 30.6.2004, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



alex-co
Так изврануться - не проблема, хоцца однообразия в процедурах, так, как написал Girder, за что ему большое спасибо.



--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Calypso
Дата 1.7.2004, 05:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 30.6.2004

Репутация: нет
Всего: нет



Удалено модератором!

А ничего подобного - Girder не ответил на вопрос.
Код
procedure LoadVar(gInt:pinteger;VarName:string);begin
if VarName='' then gInt^:=gInt^+200;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
LoadVar(@MainForm.Top,'');
MainForm.Top:=MainForm.Top+1;
MainForm.Top:=MainForm.Top-1;
end;

не канает т.к.
нада чтобы было
Код

procedure LoadVar(VAR gInt:pinteger;VarName:string);

Пацаны, дак ведь все эти топы и лефты это не переменные (хотя у них даже тип есть) это - своиства, хранящие данные в полях типа Ftop, Fleft о осуществляющие доступ через методы notify.gif
Я сделал так:
Код
procedure MyProc(var VF: Tform1);    overload;
begin
 VF.Top:=VF.Top-1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MyProc(Form1);
end;

или так
Код
procedure MyProc( VF: TObject);    overload;
begin
 if VF is TForm1 then
 (VF as TForm1).Top:=(VF as TForm1).Top-1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MyProc(Form1);
end;

Кстати а кто объяснит зачем нужен этот overload;
УДАЧИ hehe.gif

Это сообщение отредактировал(а) Pegas - 1.7.2004, 07:47
PM MAIL   Вверх
Girder
Дата 1.7.2004, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



А ты знаеш разницу biggrin.gif !!!, между
Код
var gInt:integer
и
Код
gInt:pinteger



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Петрович
Дата 1.7.2004, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Когда увидел код Girderа, был удивлен, и считал что это даже не должно скомпилиться. Поясню почему: Дело в том, что Top это свойство а не переменная и не поле. Т.е. сущность которая вообще-то не имеет адреса. Поэтому, применение к ней оператора @ по моему невозможно.
Кстати, именно по этой причине нельзя передавать свойство как var параметр.
Однако, решил проверить. Был крайне удивлен, когда выяснилось что мнение компилятора отличается от моего smile.gif. Приведенный Girderом пример РАБОТАЕТ. Однако, более подробное изучение вопроса показало, что этот код работает ТОЛЬКО если есть операторы
Код
MainForm.Top:=MainForm.Top+1;
MainForm.Top:=MainForm.Top-1;

Если их убрать, то код перестает работать.
Решил разобраться.
Свойство Top у tControl который является предком tForm описано так:
Код
property Top: Integer read FTop write SetTop;

При выполнении
Код
LoadVar(@MainForm.Top,'');
в LoadVar передается адрес поля FTop, что по сути НЕПРАВИЛЬНО. Следовательно, внутри LoadVar, все манипуляции проводятся с FTop, и при присваивании ему нового значения вызова SetTop, как предписано описанием свойства, не происходит. Но, именно в SetTop производится реальный перенос значения FTop tControlа в соответствующий объект Windows. Поэтому-то на экране ничего и не происходит! На лицо факт нарушения целстности данных.
Наличие в примере
Код
MainForm.Top:=MainForm.Top+1;
MainForm.Top:=MainForm.Top-1;
как раз и приводит к тому, что будет выполнен SetTop который приведет все в соответствие.
Резюме.
Несмотря на то, что компилятор допускает получение адреса свойства, использовать это НЕДОПУСТИМО!
Вообще, считаю что это ошибка в компиляторе.

Это сообщение отредактировал(а) Петрович - 1.7.2004, 08:54


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Girder
Дата 1.7.2004, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Цитата
Вообще, считаю что это ошибка в компиляторе.
Согласен.

Цитата
...нового значения вызова SetTop, как предписано описанием свойства, не происходит.
Я уже давно думаю как бы это проблему разрешить при написании своих компонентов. Идеи были, ... но все они не работают mad.gif (или не совсем корректно работают)
А вообще прикольно менять некоторые значения, которые поменять(легко) не удается biggrin.gif .

Это сообщение отредактировал(а) Girder - 1.7.2004, 10:17


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Calypso
Дата 1.7.2004, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 30.6.2004

Репутация: нет
Всего: нет



Girder
Код

А ты знаеш разницу  !!!, между
Код  
var gInt:integer

и
Код  
gInt:pinteger

bored.gif Да я усек разницу.
Хоть и выглядит это как косяк но компилятор генерирует один и тот же вызов процедуры
PM MAIL   Вверх
<Spawn>
Дата 1.7.2004, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Цитата(Calypso @ 30.6.2004, 21:22)
Кстати а кто объяснит зачем нужен этот overload;

Это указывает компилятору на то, что существует еще одна функция(метод) с таким же именем - различие в них в разном наборе параметров. Без данной директивы компилиться ни чего не будет(при наличии двух одиноковых в названии функций(методов одного класса)). Например:

Код
function MyFunction: Boolean; overload;
begin
end;

function MyFunction(Value: integer): Boolean; overload;
begin
end;



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Girder
Дата 1.7.2004, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Цитата
Да я усек разницу.
Т.в: Разница только в терминологии!
В первом случаи: Передача типизированного параметра по ссылке(читай передача указателя)
Во втором случаи: Передача типизированного указателя(читай передача указателя).

В первом случаи для доступа к данным нам ни чего делать не надо(все сделает компилятор), во втором случаи для доступа к данным нам надо применить операцию его(указателя) разыменования.

P.S. А еще бывают нетипизированные параметры и указатели wink.gif

Удачи.


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
December
Дата 1.7.2004, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



Ни фига себе тред развился! smile.gif
Петрович
Цитата
Несмотря на то, что компилятор допускает получение адреса свойства, использовать это НЕДОПУСТИМО!

Предложи допустимый вариант решения проблемы.
И на всякий случай: проблема не в том, чтобы изменить значение Form.Top, а чтобы с помощью процедуры загружать разные значения в разные свойства формы, то есть примеры типа
Цитата
if VF is TForm1 then(VF as TForm1).Top:=(VF as TForm1).Top-1;

и
Цитата
vart: Integer; begint:= MainForm.Top;LoadVar(t,'MainFormTop');MainForm.Top:= t;

не канают.
Всем спасибо за интерес, проявленый к теме.



--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Петрович
Дата 1.7.2004, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата
... чтобы с помощью процедуры загружать разные значения в разные свойства формы ...

Как я уже писал выше, передать свойство как var параметр НЕВОЗМОЖНО. Следовательно, так как ты хочешь, сделать нельзя.
Можно сделать вариант для published свойств, используя RTTI. Будет выглядеть что-то вроде такого:
Код

procedure LoadVar(Obj :tObject; LoadedPropertyName :String; ParametrName :String);
begin
 // здесь можно используя процедуры работы с RTTI
 // получить и/или установить значение свойства
 // LoadedPropertyName объекта Obj
end;
...
LoadVar(MainForm,'Top','MainFormTop');

Реализацию LoadVar оставляю другим, самому лень smile.gif


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
December
Дата 2.7.2004, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



Гм... Мне пока что существующий вариант больше нравится smile.gif



--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Петрович
Дата 2.7.2004, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата
Гм... Мне пока что существующий вариант больше нравится

А "существующий" это какой?


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0849 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.