下記コードは動くのですが、TObject(i)が理解できません。
var
i:integer;
a:array[1..2] of string;
St:TStringList;
//-----
begin
a[1]:='aaa';
a[2]:='bbb';
St:=TStringList.Create;
for i:=1 to 2 do St.AddObject(a[i],TObject(i));
St.Free;
end;
TObject(i) は整数をTObject型にcastするという意味なのですか?
実数もTObject型にcastできるのでしょうか?
>TObject(i) は整数をTObject型にcastするという意味なのですか?
そうです。
>実数もTObject型にcastできるのでしょうか?
TObjectは全てのクラスのおおもとである(そう理解してます)ので
整数(Integer)をCastする事が出来ます。
私もこの方法は良く利用します。
あるデータデースのテーブルデータからユニークキーと名前を抜き出して、
Stringsに
AddObject(名前,TObject(ユニークキー));
のように代入し、利用すると見た目もすっきりいい感じなので。
TComboBoxのItemsなど、特定のTStringsのサブクラスにおいて、TObject(-1)が使えなかったりするので注意が必要です。
>>実数もTObject型にcastできるのでしょうか?
>TObjectは全てのクラスのおおもとである(そう理解してます)ので
>整数(Integer)をCastする事が出来ます。
これは誤解です。Delphi の実装では、オブジェクト参照はポインタと同値なので
たんにポインタにキャストしているだけです。TObject がすべてのクラスの上位
クラスであることとはなんの関係もありません。
ですから、ポインタと幅が違う実数はキャストできません。
>ですから、ポインタと幅が違う実数はキャストできません。
そうなんですか?
確かにCurrencyで試したら出来ませんでした。間違い訂正できて
良かったです。ありがとうございました。
>オブジェクト参照はポインタと同値なのでたんにポインタにキャストしているだけです
i が整数なら
St.AddObject(a[i],TObject(i));
は
St.AddObject(a[i],Pointer(i));
と同じということですね?
むく様、にしの様、えーと様ありがとうございました。
すみません、ちょっと誤解を生むようなことを書いたような気がするので・・・
> TObject がすべてのクラスの上位クラスであることとはなんの関係もありません。
今回の話題のような整数をキャストする場合はこのとおりです。
でも、オブジェクト(クラスのインスタンス)を代入するときは、むくさんのいう
とおり、OOP の基本「上位クラスには下位クラスを代入できる」を最大限利用する
ために、TObject になっています。イベントハンドラの Sender:TObject と同じ
ですね。
ツイート | ![]() |