| 
| 
 | Вопрос # 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));
 По поводу разницы свойство/метод. В данном случае это абсолютно не важно. Так как обычно, вызов свойства на чтение равнозначно вызову функции, а на запись - вызов процедуры.
 Лишь иногда, компилятор может оптимизировать до прямой запис в переменную. Но это для оптимизиции.
 
 Между тем, за код, который приведён в условии вопроса - на любом нормальном предприятии, где есть просмотр кода, выгнали бы.
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |