移植するには?


怪盗ルピン  2010-02-03 00:13:17  No: 37386

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-03 00:36:16  No: 37387

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

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

<< 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-03 00:48:44  No: 37389

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

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-03 00:52:52  No: 37390

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

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

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


茶柱  2010-02-03 00:54:48  No: 37391

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


怪盗ルピン  2010-02-03 01:01:14  No: 37392

クリエイトすれば動作するようになりましたけど、
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-03 01:25:45  No: 37393

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

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

TTest = record
...

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

TTest = object
...


茶柱  2010-02-03 01:32:34  No: 37394

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

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


茶柱  2010-02-03 01:33:05  No: 37395

リローd、、、


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

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






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