TStringList ValueFromIndex не работает в PascalScript

Я пытаюсь использовать TStrings.ValueFromIndex (который работает в FreePascal и Delphi) в функции PascalScript, но это не работает, компилятор возвращает:

Неизвестный идентификатор "GETVALUEFROMINDEX"

Я хорошо им пользуюсь?
Доступна ли эта функция в PascalScript?
Если нет, есть ли простой способ сделать это?

КОД:

Function dummy(R: TStringList):String;
var
   i: Integer;
   RESULTv: string;
begin
   for i := 0 to ReqList.Count-1 do
     RESULTv := RESULTv + R.Names[i]+' -> '+ R.ValueFromIndex[i];
   dummy := RESULTv;
end;

person Adminiculo    schedule 31.12.2013    source источник


Ответы (2)


TStrings в PascalScript — это Delphi TStrings, но метод ValueFromIndex не доступен в PascalScript. Это можно увидеть, прочитав SIRegisterTStrings.

Значит, надо использовать то, что есть. Например, свойство Values:

RESULTv := RESULTv + R.Names[i] + ' -> ' + R.Values[R.Names[i]];

Или вы можете предпочесть избежать повторения с помощью

Name := R.Names[i];
RESULTv := RESULTv + Name + ' -> ' + R.Values[Name];

Это довольно неэффективно, но если вы не собираетесь самостоятельно анализировать пары имя/значение, это, вероятно, лучшее, что вы можете сделать.

Если вы чувствуете себя смелым, вы можете скомпилировать PascalScript самостоятельно и добавить вызов RegisterMethod в SIRegisterTStrings который зарегистрировал ValueFromIndex.

person David Heffernan    schedule 31.12.2013
comment
Однако использование Values[Name] не эквивалентно использованию ValueFromIndex(i), если список строк содержит несколько записей с одним и тем же именем. Так что либо перекомпилируйте PS, чтобы открыть ValueFromIndex, либо напишите свой собственный код, который анализирует необработанное значение Strings[i], чтобы удалить часть имени. - person Remy Lebeau; 31.12.2013
comment
@Remy В моем случае нет повторяющихся имен, поэтому это более простое решение подходит. - person Adminiculo; 02.01.2014

PascalScript — это не то же самое, что Delphi/FreePascal. Если вы посмотрите на исходный код для PascalScript (особенно в uPSC_classes.pas), вы увидите, что PascalScript просто обертывает родной Delphi/FreePascal TStringList, но не раскрывает все, что Delphi/FreePascal фактически реализует в TStringList. Например, для свойства ValueFromIndex нет открытой оболочки.

Обновление:

Поскольку PascalScript не предоставляет свойство ValueFromIndex, вы можете написать свой собственный код, который вручную анализирует строку, чтобы удалить ее часть имени (если вы не исправите сам PascalScript, чтобы добавить отсутствующую регистрацию свойства), например:

Function GetValueFromIndex(R: TStringList; Index: Integer):String;
var
  S: string;
  i: Integer;
begin
  S := R.Strings[Index];
  i := Pos('=', S);
  if I > 0 then
    ValueFromIndex := Copy(S, i+1, MaxInt)
  else
    ValueFromIndex := '';
end;

Function dummy(R: TStringList):String;
var
  i: Integer;
  RESULTv: string;
begin
  for i := 0 to ReqList.Count-1 do
    RESULTv := RESULTv + R.Names[i] + ' -> ' + GetValueFromIndex(R, i);
  dummy := RESULTv;
end;
person Remy Lebeau    schedule 31.12.2013
comment
но тогда почему синтаксическая ошибка возникает из-за пропущенного метода, а не самого пропущенного свойства? - person Arioch 'The; 31.12.2013
comment
Каково фактическое сообщение об ошибке? Я не пользователь PS, поэтому могу сказать только то, что я вижу в исходном коде PS, и что ValueFromIndex не зарегистрирован в парсере PS. - person Remy Lebeau; 01.01.2014
comment
Обходной путь уже упоминался — либо пропатчить сам PS, чтобы добавить отсутствующую регистрацию, либо реализовать собственную логику разделения в коде скрипта PS. - person Remy Lebeau; 01.01.2014
comment
@Remy Где в вашем ответе это упоминается? - person David Heffernan; 01.01.2014
comment
@DavidHeffernan: я не говорил, что это было в моем ответе. Это в вашем ответе и в моем комментарии к вашему ответу. - person Remy Lebeau; 01.01.2014
comment
Вы должны ответить на вопрос. - person David Heffernan; 01.01.2014