Hello, everybody
I wonder why the following codes will cause a runtime error of "Abstract
method called"?
What Peter said ;-) A method marked with the identifier 'abstract' has no implementation. It is a 'pure virtual' method in C++ speak. Only a subclass that 'overrides' the method and provides an implementation can have the method validly called.
And TStringList is also weird, though run properly, the result is wrong:
This is your mistake. It stems from a lesser known ability of the TStringList to hold values in the format 'Name=Value', like in an Inifile. If you had values in that format, you could call 'sl.Names[i];' and get the 'name' section of that item.
e.g.
sl.add('one=1'); //index 0
sl.add('onetwo=2'); //index 1
sl.add('onethree=3'); //index 2
sl.Names[1] = 'two' (zero based index)
sl.Values['two'] = 2
Therefore:
sl.Values[sl.Names[1]] = 2
The solution to your problem is to use either of the following:
s := sl[i];
(or)
s := sl.strings[i];
They are both exactly the same. Delphi has the concept of default parameters, and 'strings' is the default for the TStringList (FPC people please feel free to correct me if the default concept is not imcluded in FPC.)
sl.Names[i] is simply blank because the string is in the wrong format.
Incedentally, you can say:
writeln(sl[i]);
if you like. You don't have to explicitly create your own storage for it.
Matt
---------------------------------------------
This message was sent using Mistral WebMail.
http://www.mistral.co.uk/