德尔福 Pos 总是返回 0



我真的不知道为什么 Pos 总是返回 0 而不是字符串中的字符 ";" 位置 我必须得到一个输出内容类型的php页面的响应:文本/纯文本 所以一个示例输出是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;

你对Pos的调用是倒退的。参数为:

function Pos(const SubStr, Str: _ShortStr; Offset: Integer): Integer;

但您的代码假定它们是:

function Pos(const Str, SubStr: _ShortStr; Offset: Integer): Integer;

所以实际上它试图做的是在';'内寻找linha的值,当然,除非linha=';',否则它将返回0

另一种说法,正如 Rudy 所说,你的代码不是大海捞针,而是在针中寻找大海捞针。

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


附带说明一下,这只是性能提示。与其为每个值调用Pos两次,不如保留值的缓存副本...

P := Pos(';', linha);
uid := Copy(linha,1,P-1);
Delete(linha,1,P);

相关内容

  • 没有找到相关文章