CODE GEAR RadStudio を使っているので
C++Builder と Delphi が共存しています
C++BUILDER で作成すると
<< test.h >>
class TTest
{
public:
int X;
int Y;
void __fastcall Set(int SetX, int SetY);
};
<< test.cpp >>
void __fastcall Set(int SetX, int SetY)
{
TTest Test;
Test.X = SetX;
Test.Y = SetY;
}
これを Delphi に移植するとどうなりますか?
見比べる意味でそのまま書いていますが、実用を考えるなら
プロパティを使われたほうが良いかもしれません。
それと、Set関数ですが、自身のX,Yへの代入ですよね?
この部分は変更しました。
unit Unit1;
interface
type
TTest = class
public
X: Integer;
Y: Integer;
procedure SetData(SetX, SetY: Integer);
end;
implementation
{ TTest }
procedure TTest.SetData(SetX, SetY: Integer);
begin
X := SetX;
Y := SetY;
end;
end.
すみません、
間違いました。
<< test.h >>
class TTest
{
public:
int X;
int Y;
void __fastcall Set(int SetX, int SetY);
};
extern TTest Test
<< test.cpp >>
void __fastcall TTest::Set(int SetX, int SetY)
{
Test.X = SetX;
Test.Y = SetY;
}
<< unit1.cpp >>
#include "test.h"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Test.Set(0,0);
}
えと、テスト的にこんな感じで作ったのですが
エラーがでました。
type
TForm4 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TTest = class
public
X: Integer;
Y: Integer;
end;
var
Form4: TForm4;
Test: TTest;
implementation
{$R *.dfm}
procedure TForm4.Button1Click(Sender: TObject);
begin
Test.X := 100;
Test.Y := 200;
end;
プロパティ使ってみましたけど
結果同じようなエラーが出ます。
TTest = class
public
FX: Integer;
FY: Integer;
property X: Integer read FX write FY;
property Y: Integer read FX write FY;
end;
「void __fastcall TTest::Set(int SetX, int SetY)」
関数の動きですが、グローバルに置かれた自身の実体の
メンバ変数X, Yに代入していますが、それは結局のところ
自身のX, Yに入れることが目的ではないですか?
現在のソースコードまでですと同じ動きをしているように見えますが
Test1, Test2, Test3と作ってそれぞれに代入できるか試してみてください。
クリエイトすれば動作するようになりましたけど、
C++Builder では Create(New) しなくても使えるのですが
プログラム起動時に フォームの Create 以前に動かして
動作させるのが目的だったんですけど
initialization で create 入れるしかないのかな?
ちなみに その代わりといってはなんですが
c++Builder では initialization ってないみたいですね。
procedure TForm4.Button1Click(Sender: TObject);
begin
Test := TTest.Create;
Test.X := 100;
Test.Y := 200;
end;
procedure TForm4.Button2Click(Sender: TObject);
begin
ShowMessage('[' + IntToStr(Test.X) + ',' + IntToStr(Test.Y) + ']');
Test.Free;
end;
>C++Builder では Create(New) しなくても使えるのですが
Delphi2006以降かTurboでしたらclassをrecordに変えることで同じ動作になります。
Createの必要もありません。
TTest = record
...
それ以前のバージョンでしたらobjectが使えます。
TTest = object
...
そうですね。
classはCreateしないと実体を持たないので
Initalization→Finalizationかプロジェクトのソースにて
Create、Freeを行う必要があります。
また、classではなく、recordにすればCreateの必要はありません。
Delphiいくつだったか、2006以降あたりでrecordへの動作も実装できるようになりました。
リローd、、、
ツイート | ![]() |