|
Вопрос # 2 830/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Подскажите где тут ошибка...
Причем Delphi пишет следующее...
[Error] Unit2.pas(233): Constant object cannot be passed as var parameter
Приложение: Переключить в обычный режим- 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));
По поводу разницы свойство/метод. В данном случае это абсолютно не важно. Так как обычно, вызов свойства на чтение равнозначно вызову функции, а на запись - вызов процедуры.
Лишь иногда, компилятор может оптимизировать до прямой запис в переменную. Но это для оптимизиции.
Между тем, за код, который приведён в условии вопроса - на любом нормальном предприятии, где есть просмотр кода, выгнали бы.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|