Главная страница
    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
14-15874
Феликс
2003-01-18 13:26
2003.02.06
PERL VS PHP


1-15590
Tahion
2003-01-25 21:28
2003.02.06
Как заставить TPaintBox не стрираться при перекрытии его др. форм


3-15427
Toshik
2003-01-21 14:35
2003.02.06
Мастера помогите понять, что тут требуется!


14-15889
Calm
2003-01-20 12:42
2003.02.06
Удобный TaskBar. Где же он?


4-15989
Alpine
2002-12-22 15:45
2003.02.06
Как с помощью ShellExecute можно раскрыть медиа плейер на весь эк





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский