以前做DELPHI,还是DELPHI5,后来转到JAVA,现在因工作需要又要用DELPHI了,装了DELPHI7,用着用着就发现了一个问题,各位Delphi Fans请看我的代码:
var
  testList:TStringList;
begin
  testList := TStringList.Create;
  TestList.Add('0123456789');
  ShowMessage(testList.Strings[0]);
  ShowMessage(testList.ValueFromIndex[0]);
  testList.Free;
end.
你能说出答案吗?结果是:0123456789  123456789
ValueFromIndex见名知义应该是通过索引值在列表中找出值,但是为什么前面的0被丢掉了,开始我怀疑是自己的程序有问题,后来仔细检查自己的代码并没有做截取的操作,跟踪后发现:
property ValueFromIndex[Index: Integer]: string read GetValueFromIndex write SetValueFromIndex;
它是通过属性来实现的,基类是TStrings
function TStrings.GetValueFromIndex(Index: Integer): string;
begin
  if Index >= 0 then
    Result := Copy(Get(Index), Length(Names[Index]) + 2, MaxInt) else
    Result := '';
end;
原来是一个拷贝串,大家看出问题了吗?:)

解决方案 »

  1.   

    你还没有理解ValueFromIndex的意义~~Memo1.Lines.Values['Caption'] := 'Hello';
    Memo1.Lines.Values['Size'] := '100';运行的效果是
    --------------------------
    Caption=Hello
    Size=100
    --------------------------再调用
    Memo1.Lines.Values['Size'] := '123';运行的效果是
    --------------------------
    Caption=Hello
    Size=123
    --------------------------
    在TStings中可以用这样的变量表达,做配置文件是很方便和INI文件相当~~如上
    Memo1.Names[0]表示第一行的变量名,既:Caption
    Memo1.Values[Memo1.Names[0]]表示第一行的变量值,既:Hello从这样的代码来看,就是实现Memo1.Values[Memo1.Names[0]]的目的~~
    function TStrings.GetValueFromIndex(Index: Integer): string;
    begin
      if Index >= 0 then
        Result := Copy(Get(Index), Length(Names[Index]) + 2, MaxInt) else
        Result := '';
    end;当然这段代码确实存在问题,没有考虑没“=”的情况~~
    不过,你没有Name=Values格式为什么要调用ValueFromIndex属性?~~
      

  2.   

    同意,没有Name=Value格式,为什么要调用ValueFromIndex呢?
      

  3.   

    To zswangII(伴水清清)(职业清洁工) :
    感谢你让我明白了一些知识,至少做INI文件配置很方便了。:)我这里是定义的一个TStringList类,主要是有很多字符串需要保存(例如200个),我只是想根据索引取出值,并没有做一个Name/Value的映射关系,用.Strings是完全可以实现的。你的意思我明白,Size=123后来会替换掉Size=100,的确这做INI文件很方便,但是跟我提出的需求没有任何关系,仔细阅读TStringList.add源代码会发现,它的插入值不像Memo1.Lines.Values['Size'] := '123'这样,有Name/Value的映射关系,只有TestList.Add('0123456789');一个添加字符串的操作,那么按照你的意思,这里的Name是什么?我看了Add代码,也没有发现默认的Name是什么,还请教!
    function TStringList.Add(const S: string): Integer;
    begin
      Result := AddObject(S, nil);
    end;function TStringList.AddObject(const S: string; AObject: TObject): Integer;
    begin
      if not Sorted then
        Result := FCount
      else
        if Find(S, Result) then
          case Duplicates of
            dupIgnore: Exit;
            dupError: Error(@SDuplicateString, 0);
          end;
      InsertItem(Result, S, AObject);
    end;
      

  4.   

    同意,没有Name=Value格式,为什么要调用ValueFromIndex呢?
    关于这句我有个疑问:
    ValueFromIndex的声明是.ValueFromIndex[index]为什么不是.ValueFromIndex[Name]呢?
    请解释!
      

  5.   

    高手都不用Delphi了吗?怎么没有人回复?郁闷
      

  6.   

    ValueFromIndex[index]为什么不是.ValueFromIndex[Name]
    ----------------------
    那Values[Name]是干什么的???~~
    那不如叫ValueFromName了~~
      

  7.   

    To zswangII(伴水清清)(职业清洁工)testList := TStringList.Create;
      TestList.Add('0123456789');
      ShowMessage(TestList.ValueFromIndex[0]);我希望这位大虾解释一下这个123456789是怎么来的,谢谢!
      

  8.   

    我用的是delphi6,没你说的这个属性,想讨论一下都不行.
      

  9.   

    function TStrings.GetValueFromIndex(Index: Integer): string;
    begin
      if Index >= 0 then
        Result := Copy(Get(Index), Length(Names[Index]) + 2, MaxInt) else
        Result := '';
    end;
    //看看代码不就知道了~~
    Index = 0; Get(Index) = '0123456789'; Names[0] = ''; Length('') = 0;
    Result = Copy('0123456789', 0 + 2, MaxInt) = Copy('0123456789', 2, MaxInt);
    Result = '123456789';
      

  10.   

    testList := TStringList.Create;
      TestList.Add('0123456789');
      ShowMessage(TestList.ValueFromIndex[0]);我希望这位大虾解释一下这个123456789是怎么来的,谢谢!testList 里只有一行,TestList.ValueFromIndex[0]没有找到“=”
    就把“0”当成了name,
    “123456789”就是Value