クラスを作りました。
ボタンを貼り付けて、以下のようにテストプログラムを作成しました。
コンパイルで「W1036 変数'Test'は初期化されていない可能性があります」
と表示され、
実行してボタンを押した後にモジュールエラーが発生します。
以下のような作り方はできないのでしょうか?
TTest = class
public
A: Integer;
B: Integer;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Test: TTest;
begin
Test.A := 10;
Test.B := 10;
end;
クラスは宣言しただけでは実体のないまるで幽霊のようなもの。
使う前に実体(インスタンス)を作成しなきゃ。
クラスにこだわらないのであれば、
TTest = record
A: Integer;
B: Integer;
end;
でもいいかも。
どうもありがとうございます。
実はC++Builderからの移植をしているのですが、
C++Builder では New(Create) しなくても
実態ができるのですよね。
祟りかもねさんありがとうございます。
TTest = class
public
A: Integer;
B: Integer;
end;
TTest *Test; で宣言した場合
Test = new TTest;
delete Test;
ですが
TTest Test; で宣言すると
そのまま使えるみたいです。
つまり、移植する場合、Create,Freeの形で
すべて変更しなきゃなんないんですね。
にしのさんありがとうございます。
TTest = record
A: Integer;
B: Integer;
function AddData();
end;
function TTest.AddData();
begin
Result := A + B;
end;
Test: TTest;
GetDt: Integer;
GetDt := Test.AddData();
レコードでクラスのように処理する関数とか作成できますか?
c++Builder では可能みたいですね。(Cはよくわかんないけど)
Delphiのクラス(オブジェト)は暗黙にポインタであり、C++Builderで
>TTest *Test; で宣言した場合
と同等といえる。
>TTest Test; で宣言すると
>そのまま使えるみたいです。
この場合はコンストラクタが自動的に実行される?
でもデストラクタも自動的に実行されるのかあやしいかな。
>c++Builder では可能みたいですね。
そうなの?
> レコードでクラスのように
Delphi2006 以降なのかな?Record型でできるようになったのは。
それより以前は、非推奨ということで消滅しそうで消滅しなかったobject型を使えばよろしい。
TTest = object
〜
end;
この辺の説明は、ネット上になかなかないらしいので、ここを紹介しておきます
ttp://delfusa.blog65.fc2.com/blog-entry-109.html
> TTest = object
Delphiでは当初から非推奨のようですが、
2009になってもまだ使えています。
レコードのように代入でコピーできて、
クラスのように継承できるところが
結構使えると思うのですが、なぜに非推奨なのでしょうかね。
> Delphiでは当初から非推奨のようですが、
> 2009になってもまだ使えています。
お、いいことを聞きました。
今までobject型で作った資産は引き続き使えるのですね。
> 結構使えると思うのですが、なぜに非推奨なのでしょうかね。
「言語仕様の変更で、使えなくなる可能性がありますよ」ということでは?
object型使いの自分としては、生き残っていてくれているのがありがたいです。
ツイート | ![]() |