なぜ変数がTStrings
として宣言され、TStringList
として作成されるのですか?
例:変数sl
はTStrings
として宣言されていますが、TStringList
として作成されています
var
sl : TStrings;
begin
sl := TStringList.Create;
// add string values...
sl.Add( 'Delphi' );
sl.Add( '2.01' );
// get string value using its index
// sl.Strings( 0 ) will return
// 'Delphi'
MessageDlg(
sl.Strings[ 0 ],
mtInformation, [mbOk], 0 );
sl.Free;
end;
完全に無害であるとはいえ、それはかなり無意味です。あなたは完全にsl
をTStringList
であると宣言することができ、私はいつもそのようにします。コードの読者にとっては、ローカル変数のリストが理解しやすくなります。
このコードでは、sl
には常にTStringList
インスタンスが割り当てられているため、sl
を宣言して基本クラス型がTStrings
になるように宣言しても何も得られません。ただし、さまざまな種類のTStrings
の子孫を変数に割り当てたコードがある場合、TStrings
として宣言することは理にかなっています。
変数をTStrings
型として宣言する状況は、通常、コードが明示的にインスタンスを作成していない場合です。たとえば、パラメータリストとして文字列リストを受け取ったユーティリティメソッドは、TStrings
を受け入れた場合、子孫を渡すことができるため、より便利です。以下に簡単な例を示します。
procedure PrintToStdOut(Strings: TStrings);
var
Item: string;
begin
for Item in Strings do
Writeln(Item);
end;
明らかに、パラメーターがTStrings
ではなくTStringList
と宣言されている場合、これははるかに有用です。
ただし、問題のコードはこの性質のものではなく、sl
がTStringList
型であると宣言された場合、コードはこれほど穏やかに改善されると思います。
TStrings
は、すべてのメソッドが実装されているわけではない抽象型です。
TStringList
はTStrings
の子孫であり、すべての関数を実装しています。コードでは、変数をTStringList
として宣言することもできます。
しかし、例えば関数定義では、TStrings
の代わりにTStringList
パラメータを受け入れることは理にかなっています:
procedure doSomething(lst: TStrings);
これにより、関数はTStrings
だけでなく、TStringList
のすべての実装で機能するようになります。
そのようにして、別のTStrings
の子孫をSL
変数に入れることができます(おそらくStrings
ではなくSL
と呼びます)。
あなたの場合、SL
の周りのロジックにはTStringList
の作成が含まれており、外部割り当てやパラメーター解析は含まれていないため、それは意味がありません。
ただし、ロジックを割り当てから分離した場合は、TStrings
の子孫を使用することでメリットが得られます。
たとえば、TMemoy.Lines
、TListBox.Items
、TComboBox.Items
など.
外から見ると、TStrings
のように見えますが、内部ではTStringList
ではなく、独自の子孫を使用しています。
TStrings
から派生したクラスのいくつかの例:
source\DUnit\Contrib\DUnitWizard\Source\DelphiExperts\Common\XP_OTAEditorUtils.pas:
TXPEditorStrings = class(TStrings)
source\fmx\FMX.ListBox.pas:
TListBoxStrings = class(TStrings)
source\fmx\FMX.Memo.pas:
TMemoLines = class(TStrings)
source\rtl\common\System.Classes.pas:
TStringList = class(TStrings)
source\vcl\Vcl.ComCtrls.pas:
TTabStrings = class(TStrings)
TTreeStrings = class(TStrings)
TRichEditStrings = class(TStrings)
source\vcl\Vcl.ExtCtrls.pas:
TPageAccess = class(TStrings)
THeaderStrings = class(TStrings)
source\vcl\Vcl.Grids.pas:
TStringGridStrings = class(TStrings)
TStringSparseList = class(TStrings)
source\vcl\Vcl.Outline.pas:
TOutlineStrings = class(TStrings)
source\vcl\Vcl.StdCtrls.pas:
TCustomComboBoxStrings = class(TStrings)
TMemoStrings = class(TStrings)
TListBoxStrings = class(TStrings)
source\vcl\Vcl.TabNotBk.pas:
TTabPageAccess = class(TStrings)
tStringListは、抽象TStringsクラスの具象実装です