皆さんこんにちは
Unit間で配列パラメータを受け渡ししたいのですが・・・
-----------------------------
unit Unit1;
type
TDynamicArr = array of Integer;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
Arr: TDynamicArr;
i: Integer;
begin
DataModule2.sum(Arr);
ShowMessage(IntTostr(Arr[3]));
end;
end.
-----------------------------------
unit Unit2;
type
TDynamicArr = array of Integer;
TDataModule2 = class(TDataModule)
private
{ Private 宣言 }
public
{ Public 宣言 }
procedure sum(var a :TDynamicArr);
end;
var
DataModule2: TDataModule2;
implementation
uses Unit1;
{$R *.dfm}
{ TDataModule2 }
procedure TDataModule2.sum(var a: TDynamicArr);
var
i :Integer;
begin
SetLength(A, 20);
for i := 0 to 19 do
begin
A[i] := i;
end;
end;
end.
で、「同一型でないと・・・」とコンパイルエラーになります。
どのようにしたらよいのでしょうか?
ご助言、ご教授いただければ幸いです。
よろしくお願いします。
名前空間が違うためではないですか?
unit1.TDynamicArr
unit2.TDynamicArr
は、別物だからだと思います。
ざっと見ただけなので、動作は未確認です
早速にありがとうございます。
Unitが別々なら同じように型を定義しても
別物として処理されるって事ですね。
-----------------------------------
unit Unit1;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
DataModule2.sum;
ShowMessage(IntTostr(DataModule2.DynamicArr[3]));
end;
end.
------------------------------------------
unit Unit2;
type
TDynamicArr = array of Integer;
TDataModule2 = class(TDataModule)
private
{ Private 宣言 }
public
{ Public 宣言 }
DynamicArr :TDynamicArr;
procedure sum();
end;
var
DataModule2: TDataModule2;
implementation
uses Unit1;
{$R *.dfm}
{ TDataModule2 }
procedure TDataModule2.sum();
var
i :Integer;
begin
SetLength(DynamicArr, 20);
for i := 0 to 19 do
begin
DynamicArr[i] := i;
end;
end;
end.
-----------------------------------------------------
結果的には、上記のような方法が妥当と言う事でしょうか?
型宣言をして、その型を使えば使えます。
HOtaさんこんにちは
すいません、理解できないのですが・・・(^_^;)
どこで、どの様に宣言したら良いのでしょうか?
地面を這うようなレベルの質問で申し訳ないのですが
よろしければ、お手数ですがご助言お願いします。
どちらか片方の型宣言だけを使えばよろしいかと。
コンパイラは、unit1.TDynamicArrと、unit2.TDynamicArrを区別している訳で、やりたいことは同じ構造の型を使いたいと言うことですよね。
unit1.TDynamicArrだけ生かして、unit2.TDynamicArrを削除し、unit2からunit1をusesして使うか、その逆かです。
# usesは循環しないようにしてください。コンパイルエラーになります。
グローバル変数を用いずに[手続き]などを通して配列
変数が利用できないものかと四苦八苦しておりました。
定義が同一で変数パラメータとして扱えば・・・などと
軽く考えたのが誤りのようです。
また一から出直します。
皆様お手数をおかけ致しました。
ありがとうございました。m(__)m
解決のようですが、、、HOtaさんの意見をとりいれて
---
unit MyDefs; // 共通な宣言等をこのユニットに集めて
interface
type
TDynamicArr = array of Integer;
implementation
end.
---
unit Unit1;
interface
uses
Windows, ...;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
uses MyDefs, Unit2; // *
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Arr: TDynamicArr;
begin
DataModule2.Sum(Arr);
ShowMessage(IntTostr(Arr[3]));
end;
end.
---
unit Unit2;
interface
uses
SysUtils, Classes, MyDefs; // *
type
TDataModule2 = class(TDataModule)
private
public
procedure Sum(var A: TDynamicArr);
end;
var
DataModule2: TDataModule2;
implementation
{$R *.dfm}
procedure TDataModule2.Sum(var A: TDynamicArr);
var
i: Integer;
begin
SetLength(A, 20);
for i := 0 to 19 do begin
A[i] := i;
end;
end;
end.
って感じではいかがですか?
通りすがりさん Syakeです
ありがとうございます。
別Unitで共通の定義をしておくってことですか。
見通しはよくなりそうです。
ところで、Unit1ではimplementation部のuses節でMyDefsを
Unit2ではinterface部のuses説でMyDefsを分けて記述して
ありますが、これには何故でしょうか?
互いにimplementation部でもinterface部(この場合は)でも
構わない気がしないでもないのですが・・・
> 何故でしょうか?
わたしの昔っからのクセです(^^;
なんとなく、、、
interface部のuses節で記述しなくてもよい場合は
implementation部のuses節に記述する。
という勝手なルールを決めています。
答えになってませんネ!
Halbow です。
> interface部のuses節で記述しなくてもよい場合は
> implementation部のuses節に記述する。
わたしもこのルールを使っています。循環参照をする可能性が減りますよね。
皆様 おはようございます。
色々ご助言いただきましてありがとうございます。
今後ともよろしくお願いします。m(__)m
ツイート | ![]() |