Delphi Pos总是返回0

Rod*_*etz 1 delphi string web-services indy

我真的不知道为什么Pos总是返回0而不是char“;” 在字符串中的位置我必须得到一个php页面的响应,该php页面输出一个Content-Type:text / plain所以一个示例输出是 2;fulano;fulano;0 3;ciclano;ciclano;0 4;beltrano;beltrano;0 5;foo;foo;0 8;jose;jose;0 9;maria;maria;0

和代码是

var
  linha,uid,login,senha,email,tipo : WideString;
  resposta : TStringList;
  I : Integer;
begin
  try
    resposta := TStringList.Create;
    resposta.Text := frmMain.IdHTTP1.Get(frmMain.cdsConfig.FieldByName('WebService').AsString+'listdest.php');
    for I := 0 to resposta.Count-1 do
    begin
      linha := resposta.Strings[i];
      if i = 0 then
        Delete(linha,1,1); // the first line have one wierd $FEFF
      if length(linha) > 5 then
        begin

          uid := Copy(linha,1,Pos(linha,';')-1);
          Delete(linha,1,Pos(linha,';'));
          login:=Copy(linha,1,Pos(linha,';')-1);
          Delete(linha,1,Pos(linha,';'));
          senha:=Copy(linha,1,Pos(linha,';')-1);
          Delete(linha,1,Pos(linha,';'));
          email:=Copy(linha,1,Pos(linha,';')-1);
          Delete(linha,1,Pos(linha,';'));
          tipo:=Copy(linha,1,Pos(linha,';')-1);
          Delete(linha,1,Pos(linha,';'));
        end;
    end;
    //dlgWait.Close;
  except on E :Exception do
    begin
      MessageBox(Self.Handle,PWideChar(E.Message),'Erro',MB_OK+MB_ICONERROR+MB_APPLMODAL);
      dlgWait.Close;
      FreeAndNil(resposta);
    end;
  end;
Run Code Online (Sandbox Code Playgroud)

Jer*_*dge 5

您的呼叫Pos向后。参数为:

function Pos(const SubStr, Str: _ShortStr; Offset: Integer): Integer;
Run Code Online (Sandbox Code Playgroud)

但是您的代码假定它们是:

function Pos(const Str, SubStr: _ShortStr; Offset: Integer): Integer;
Run Code Online (Sandbox Code Playgroud)

因此,实际上,它试图执行的操作是寻找linha内部的值';',当然,除非linha= ';',否则它将返回0

正如Rudy所说的那样,另一种表达方式不是在大海捞针中寻找针,而是在大海捞针中寻找针。

在这些调用的第一个和第二个参数之间交换。


附带说明,这只是性能提示。而不是Pos每个都调用两次,而是保留值的缓存副本...

P := Pos(';', linha);
uid := Copy(linha,1,P-1);
Delete(linha,1,P);
Run Code Online (Sandbox Code Playgroud)