TObject(整数)の意味

解決


daiwa  2005-10-07 23:00:44  No: 17950

下記コードは動くのですが、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できるのでしょうか?


むく  2005-10-07 23:15:59  No: 17951

>TObject(i) は整数をTObject型にcastするという意味なのですか?
そうです。

>実数もTObject型にcastできるのでしょうか?
TObjectは全てのクラスのおおもとである(そう理解してます)ので
整数(Integer)をCastする事が出来ます。
私もこの方法は良く利用します。
あるデータデースのテーブルデータからユニークキーと名前を抜き出して、
Stringsに  
AddObject(名前,TObject(ユニークキー));
のように代入し、利用すると見た目もすっきりいい感じなので。


にしの  2005-10-07 23:33:23  No: 17952

TComboBoxのItemsなど、特定のTStringsのサブクラスにおいて、TObject(-1)が使えなかったりするので注意が必要です。


えーと  2005-10-07 23:44:23  No: 17953

>>実数もTObject型にcastできるのでしょうか?
>TObjectは全てのクラスのおおもとである(そう理解してます)ので
>整数(Integer)をCastする事が出来ます。

これは誤解です。Delphi の実装では、オブジェクト参照はポインタと同値なので
たんにポインタにキャストしているだけです。TObject がすべてのクラスの上位
クラスであることとはなんの関係もありません。

ですから、ポインタと幅が違う実数はキャストできません。


むく  2005-10-08 00:01:49  No: 17954

>ですから、ポインタと幅が違う実数はキャストできません。
そうなんですか?
確かにCurrencyで試したら出来ませんでした。間違い訂正できて
良かったです。ありがとうございました。


daiwa  2005-10-08 02:30:04  No: 17955

>オブジェクト参照はポインタと同値なのでたんにポインタにキャストしているだけです

i  が整数なら
St.AddObject(a[i],TObject(i));

St.AddObject(a[i],Pointer(i));
と同じということですね?

むく様、にしの様、えーと様ありがとうございました。


えーと  2005-10-08 03:05:34  No: 17956

すみません、ちょっと誤解を生むようなことを書いたような気がするので・・・

> TObject がすべてのクラスの上位クラスであることとはなんの関係もありません。

今回の話題のような整数をキャストする場合はこのとおりです。

でも、オブジェクト(クラスのインスタンス)を代入するときは、むくさんのいう
とおり、OOP の基本「上位クラスには下位クラスを代入できる」を最大限利用する
ために、TObject になっています。イベントハンドラの Sender:TObject と同じ
ですね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加