移植するには?


怪盗ルピン  2010-02-02 15:13:17  No: 37386  IP: 192.*.*.*

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 に移植するとどうなりますか?

編集 削除
茶柱  2010-02-02 15:36:16  No: 37387  IP: 192.*.*.*

見比べる意味でそのまま書いていますが、実用を考えるなら
プロパティを使われたほうが良いかもしれません。
それと、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.

編集 削除
怪盗ルピン  2010-02-02 15:43:27  No: 37388  IP: 192.*.*.*

すみません、
間違いました。


<< 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);
}

編集 削除
怪盗ルピン  2010-02-02 15:48:44  No: 37389  IP: 192.*.*.*

えと、テスト的にこんな感じで作ったのですが
エラーがでました。

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;

編集 削除
怪盗ルピン  2010-02-02 15:52:52  No: 37390  IP: 192.*.*.*

プロパティ使ってみましたけど

結果同じようなエラーが出ます。

  TTest = class
  public
    FX:  Integer;
    FY: Integer;
    property X: Integer read FX write FY;
    property Y: Integer read FX write FY;
  end;

編集 削除
茶柱  2010-02-02 15:54:48  No: 37391  IP: 192.*.*.*

「void __fastcall TTest::Set(int SetX, int SetY)」
関数の動きですが、グローバルに置かれた自身の実体の
メンバ変数X, Yに代入していますが、それは結局のところ
自身のX, Yに入れることが目的ではないですか?
現在のソースコードまでですと同じ動きをしているように見えますが
Test1, Test2, Test3と作ってそれぞれに代入できるか試してみてください。

編集 削除
怪盗ルピン  2010-02-02 16:01:14  No: 37392  IP: 192.*.*.*

クリエイトすれば動作するようになりましたけど、
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;

編集 削除
jazzin  2010-02-02 16:25:45  No: 37393  IP: 192.*.*.*

>C++Builder では Create(New) しなくても使えるのですが

Delphi2006以降かTurboでしたらclassをrecordに変えることで同じ動作になります。
Createの必要もありません。

TTest = record
...

それ以前のバージョンでしたらobjectが使えます。

TTest = object
...

編集 削除
茶柱  2010-02-02 16:32:34  No: 37394  IP: 192.*.*.*

そうですね。
classはCreateしないと実体を持たないので
Initalization→Finalizationかプロジェクトのソースにて
Create、Freeを行う必要があります。

また、classではなく、recordにすればCreateの必要はありません。
Delphiいくつだったか、2006以降あたりでrecordへの動作も実装できるようになりました。

編集 削除
茶柱  2010-02-02 16:33:05  No: 37395  IP: 192.*.*.*

リローd、、、

編集 削除