Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 830

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Подскажите где тут ошибка...
Причем Delphi пишет следующее...

[Error] Unit2.pas(233): Constant object cannot be passed as var parameter

Приложение:
  1. showmessage(delete(ListRight.SelectedFolder.PathName, (length(ListRight.SelectedFolder.PathName)-length(ListRight.SelectedFolder.DisplayName)), length(ListRight.SelectedFolder.DisplayName)));


Дударчук Сергей Викторович Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Дударчук Сергей Викторович (статус: Посетитель)
Вопрос отправлен: 23 мая 2009, 21:34
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Паровоз

Здравствуйте, Дударчук Сергей Викторович!

var
s:String;
begin
s:=ListRight.SelectedFolder.PathName;
showmessage(delete(s,...
....
end;

Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 24 мая 2009, 11:28


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 24 мая 2009, 21:41; участников в обсуждении: 4.
Паровоз

Паровоз (статус: 10-ый класс), 24 мая 2009, 00:31 [#1]:

to Дударчук Сергей Викторович:
А что такое ListRight?
Дударчук Сергей Викторович

Дударчук Сергей Викторович (статус: Посетитель), 24 мая 2009, 05:08 [#2]:

to Дударчук Сергей Викторович:
А что такое ListRight?

ListRight - обьект shellListView
Косолапов Дмитрий Юрьевич

Косолапов Дмитрий Юрьевич (статус: 8-ой класс), 24 мая 2009, 10:22 [#3]:

По-моему первый параметр в delete как раз по ссылке передается, так что лучше всего PathName предварительно "забрать" в строковую переменную.
Вадим К

Вадим К (статус: Академик), 24 мая 2009, 18:13 [#4]:

Вся проблема в том, что delete модифицирует первый параметр. Поэтому там должна быть строка. А у Вас там просто свойство типа string. Но взять адрес от свойства без специально хака нельзя. А процедура требует...
Да, да процедура. А она ничего не возращает... Поэтому код, предложен Паровоз'ов тоже работать не будет. То есть, компилироваться даже не должен.
Но если свойство модифицировать не надо, а только вывести обрезанным, то нужно использовать функцию Copy
Галочка "подтверждения прочтения" - вселенское зло.
Паровоз

Паровоз (статус: 10-ый класс), 24 мая 2009, 21:03 [#5]:

Совсем забыл, что delete - процедура, поэтому, конечно нужно по-другому:
var
s:string;
begin
s:=ListRight.SelectedFolder.PathName;
delete(s, (length(ListRight.SelectedFolder.PathName)-length(ListRight.SelectedFolder.DisplayName)), length(ListRight.SelectedFolder.DisplayName));
showmessage(s);
А ListRight.SelectedFolder.PathName это не свойство, а функция, поэтому ничего модифицировать здесь просто нельзя.
Вадим К

Вадим К (статус: Академик), 24 мая 2009, 21:41 [#6]:

А скажите, зачем так сложно оставили, ведь можно упростить, причем заметно. Ну где то к
t:string;
t := ListRight.SelectedFolder.DisplayName;
delete(s, (length(s)-length(t)), length(t));
По поводу разницы свойство/метод. В данном случае это абсолютно не важно. Так как обычно, вызов свойства на чтение равнозначно вызову функции, а на запись - вызов процедуры.
Лишь иногда, компилятор может оптимизировать до прямой запис в переменную. Но это для оптимизиции.

Между тем, за код, который приведён в условии вопроса - на любом нормальном предприятии, где есть просмотр кода, выгнали бы.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 7 апреля 2020, 01:06
Выполнено за 0.02 сек.
Рейтинг@Mail.ru