Здравствуйте, stuff, Вы писали:
S>Допустим, есть такой код:
S>S>function MyPos(substr: string; str: PString): integer;
S>begin
S> result := Pos(substr, str^); //ошибка, если использовать второй вариант
S>end;
S>
S>
S>S>procedure TForm1.Button1Click(Sender: TObject);
S>var
S> str, str1: string;
S>begin
S> str := 'The best for Magellan';
S> str1 := Copy(str ,14, 8);
S> //первый вариант
S> ShowMessage(IntToStr(MyPos('a', @str1))); //так работает
S> //второй вариант
S> ShowMessage(IntToStr(MyPos('a', PString(Copy(str ,14, 8))))); //работает но, возникает ошибка в функции MyPos
S>end;
S>
S>
S>Хотелось, что бы второй вариант работал, не пришлось бы создавать переменную str1.
S>Это можно как-то сделать?
По-моему никак.

Вызов Copy(str ,14, 8) во втором варианте высвобождает память для строки на выходе функциию. В параметр str функции MyPos попадает неопределенное значение. Тут косвенная подсказка:
For all conventions except cdecl, the procedure or function
removes parameters from the stack upon returning. With the cdecl convention, the caller removes parameters from the stack when
the call returns
Так что, как ни крути, либо переходи на Pos (твой метод конвертации string->PString->string довольно странный и смысла в данном случае не имеет), либо используй первый вариант.