Unit間での配列パラメータの受け渡しをするには?

解決


Syake  2003-12-12 00:29:37  No: 6083

皆さんこんにちは

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.

で、「同一型でないと・・・」とコンパイルエラーになります。
どのようにしたらよいのでしょうか?
ご助言、ご教授いただければ幸いです。
よろしくお願いします。


にしの  2003-12-12 00:33:21  No: 6084

名前空間が違うためではないですか?
unit1.TDynamicArr
unit2.TDynamicArr
は、別物だからだと思います。
ざっと見ただけなので、動作は未確認です


Syake  2003-12-12 00:55:43  No: 6085

早速にありがとうございます。

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  2003-12-12 01:13:11  No: 6086

型宣言をして、その型を使えば使えます。


Syake  2003-12-12 01:29:46  No: 6087

HOtaさんこんにちは
すいません、理解できないのですが・・・(^_^;)
どこで、どの様に宣言したら良いのでしょうか?
地面を這うようなレベルの質問で申し訳ないのですが
よろしければ、お手数ですがご助言お願いします。


にしの  2003-12-12 03:08:56  No: 6088

どちらか片方の型宣言だけを使えばよろしいかと。
コンパイラは、unit1.TDynamicArrと、unit2.TDynamicArrを区別している訳で、やりたいことは同じ構造の型を使いたいと言うことですよね。
unit1.TDynamicArrだけ生かして、unit2.TDynamicArrを削除し、unit2からunit1をusesして使うか、その逆かです。
# usesは循環しないようにしてください。コンパイルエラーになります。


Syake  2003-12-12 17:27:08  No: 6089

グローバル変数を用いずに[手続き]などを通して配列
変数が利用できないものかと四苦八苦しておりました。
定義が同一で変数パラメータとして扱えば・・・などと
軽く考えたのが誤りのようです。
また一から出直します。

皆様お手数をおかけ致しました。
ありがとうございました。m(__)m


通りすがり  2003-12-12 18:03:59  No: 6090

解決のようですが、、、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  2003-12-13 08:14:24  No: 6091

通りすがりさん  Syakeです
ありがとうございます。

別Unitで共通の定義をしておくってことですか。
見通しはよくなりそうです。

ところで、Unit1ではimplementation部のuses節でMyDefsを
Unit2ではinterface部のuses説でMyDefsを分けて記述して
ありますが、これには何故でしょうか?
互いにimplementation部でもinterface部(この場合は)でも
構わない気がしないでもないのですが・・・


通りすがり  2003-12-13 17:09:26  No: 6092

> 何故でしょうか?
わたしの昔っからのクセです(^^;
なんとなく、、、
interface部のuses節で記述しなくてもよい場合は
implementation部のuses節に記述する。
という勝手なルールを決めています。
答えになってませんネ!


Halbow  2003-12-13 20:12:27  No: 6093

Halbow です。

> interface部のuses節で記述しなくてもよい場合は
> implementation部のuses節に記述する。

わたしもこのルールを使っています。循環参照をする可能性が減りますよね。


Syake  2003-12-15 17:57:13  No: 6094

皆様  おはようございます。

色々ご助言いただきましてありがとうございます。
今後ともよろしくお願いします。m(__)m


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

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






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