Текущий архив: 2003.02.06;
Скачать: CL | DM;
ВнизЧего хочет компилятор? Найти похожие ветки
← →
Pk (2003-01-28 11:43) [0]Извините за ламерский вопрос, но никак не могу понять в чем проблема. Вызываю функцию Delete(Query1.SQL.Text,p,l) где p,l - числа типа Integer. Получаю ошибку - константовый объект не может быть передан как Var-параметр. В чем тогда отличие от примера с Helpа: var s: string;
begin
s := "...";
Delete(s,5,16);
← →
Dms (2003-01-28 11:48) [1]есть предположение, что надо
<имя_модуля>.Delete(...);
← →
Anatoly Podgoretsky (2003-01-28 11:52) [2]Свойства не имеют адреса, сначала присвой переменной, а в примере используется переменная.
← →
malkolinge (2003-01-28 12:21) [3]
> Anatoly Podgoretsky © (28.01.03 11:52)
> Свойства не имеют адреса, сначала присвой переменной, а
> в примере используется переменная.
Кстати не всегда. А в данном случае проблема в том, что свойство передаеться по ссылке.
← →
Cobalt (2003-01-28 21:29) [4]А мне казалось, что свойство нельзя передать в качестве var-параметра...
← →
Юрий Зотов (2003-01-29 00:14) [5]> Pk (28.01.03 11:43)
Чтобы понять суть ошибки, нужно:
1. Знать разницу между передачей параметров по ссылке и по значению. Это см. в книгах.
2. Посмотреть справку и исходники. Смотрим.
procedure Delete(var S: string; Index, Count:Integer);
Видим, что первый параметр передается по ссылке. То есть, вместо него самого передается его адрес. Таким образом, если изменить содержимое по этому адресу, то после возврата из Delete оно останется таким же измененным.
Идем дальше. Свойство SQL - это TStrings. Смотрим свойство TStrings.Text и видим:
property Text: string read GetTextStr write SetTextStr;
То есть, когда мы пытаемся получить значение SQL.Text, компилятор подставляет вызов метода GetTextStr. Но ведь его результат - это результат вычисления выражения (функция - это тоже выражение). Такие результаты хранятся, как временные и своего постоянного адреса они не имеет. Как же быть бедняге компилятору когда мы пишем:
Delete(Query1.SQL.Text, ...) ?
С одной стороны, Delete требует постоянного адреса. С другой стороны, GetTextStr такого адреса не дает. Что делать?
Вот поэтому он и ругается.
А в примере из хелпа используется не временный результат, а переменная S, которая имеет свой постоянный адрес в памяти. Поэтому проблем нет.
← →
icWasya (2003-01-29 09:26) [6]
var S:String;
S:=Query1.SQL.Text;
Delete(S,p,l) где
Query1.SQL.Text:=S;
Страницы: 1 вся ветка
Текущий архив: 2003.02.06;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.011 c