Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.06;
Скачать: [xml.tar.bz2];

Вниз

Чего хочет компилятор?   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.01 c
1-15716
yaric
2003-01-26 19:35
2003.02.06
TRichEdit и выравнивание


1-15535
REA
2003-01-28 12:02
2003.02.06
Нужно ли выгружать BPL


1-15662
_vitek_
2003-01-25 02:56
2003.02.06
Random глючит...


7-15960
Arkady
2002-12-02 10:48
2003.02.06
Буфер клавиатуры


6-15797
Brat-2
2002-12-14 16:00
2003.02.06
Проблема использования IdHTTP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский