フォームが2つあるときのプログラムの書き方

解決


tonma  2005-03-02 23:36:46  No: 13476  IP: [192.*.*.*]

初歩的な質問かもしれませんが、フォームが2つあるとき(Form1、Form2)にForm2のButton1をクリックしたときにForm1のコンポーネント配列したEdit[i]に文字を表示させたいのですが、そういった事は可能なのでしょうか?
form2のボタンクリックイベントに
----------------------------------------------
var i : integer;
begin
    i := strtoint(Edit1.Text);
    Form1.Edit[i].Text := XXXXX;
end;
----------------------------------------------
と書いても、うまくいきません。
解決法を教えてください。

編集    削除
りおりお  2005-03-02 23:40:45  No: 13477  IP: [192.*.*.*]

implementation のすぐ下に

uses
  Unit1;

というふうに、Form1 が宣言されているユニット名を uses します。
また、

> Form1.Edit[i].Text := XXXXX;

これですけど

Edit[i] が TForm1 クラスのフィールド変数になっていなければいけません。

編集    削除
tonma  2005-03-02 23:44:34  No: 13478  IP: [192.*.*.*]

早いレスありがとうございます。
usesのところにはUnit1を追加しています。
>Edit[i] が TForm1 クラスのフィールド変数になっていなければいけません。
すみませんが自身が力不足なので、Edit[i]をどのようにしたらいいのか、具体的に教えてもらえないでしょうか?お願いします。

編集    削除
りおりお  2005-03-03 00:04:34  No: 13479  IP: [192.*.*.*]

二つのフォームに関することは uses にユニット名を指定することで解決です。

> Edit[i]をどのようにしたらいいのか

これは、Form1 の たとえば Button1Click では、どのようにしてますか?
それが分からないと、回答しようがありません。

編集    削除
tonma  2005-03-03 00:18:30  No: 13480  IP: [192.*.*.*]

Form1にButtonはありませんが、もしあれば、同じように
----------------------------------------------
var i : integer;
begin
    i := strtoint(Form2.Edit1.Text);
    Edit[i].Text := XXXXX;
end;
----------------------------------------------
とします。
・・検討違いの回答でしたらすみませんが、質問を詳しく教えてください。

編集    削除
りおりお  2005-03-03 00:31:32  No: 13481  IP: [192.*.*.*]

それなら

Form1.Edit[i].Text := XXXXX;

でOKなのではないでしょうか。

編集    削除
りおりお  2005-03-03 00:35:37  No: 13482  IP: [192.*.*.*]

要するに Unit1 で Edit[i] の宣言がどうなってるか分からないのです。
宣言部分をコピペして示してみるといいんじゃないでしょうか。

TForm1 の フィールドだったら Form1.Edit[i] でアクセスできますし、
たんなるグローバル変数なら、 Edit[i] だけでもOKかもしれません。
Unit2 からどのように見えるかが分からないと回答できません。

編集    削除
kkk  2005-03-03 00:40:16  No: 13483  IP: [192.*.*.*]

うまくいかないという状況が不明です。
何らかのエラーが出るということですか?

編集    削除
tonma  2005-03-03 01:00:35  No: 13484  IP: [192.*.*.*]

状況を示します。
Unit1
-----------------------------
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}
var Ed : array[0..9] of TEdit;
procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
begin
  for i := 0 to 9 do begin
    Ed[i] := TEdit.Create(Self); 
    Ed[i].Parent := Form1;       
    Ed[i].Left := 50;            
    Ed[i].Top := i * 20;         
    Ed[i].text := IntToStr(i)+'番目のEdit'; 
  end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var i : integer;
begin
  i := strtoint(form2.edit1.text);
  Ed[i].text := 'aa';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  form2.Show;
end;

end.
-----------------------------

unit2
-----------------------------
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var i : integer;
begin
  i := strtoint(Edit1.Text);
  form1.Ed[i].text := 'aa';  //この部分が出来ないのです。
end;

end.
-----------------------------
上の2つのソースをそのままそれぞれのUnitに貼り付けてください。form1にはButtonを2つだけ、form2にはEditとButtonを1つずつ貼り付けてください。
Unit2のコメントをしている部分が不具合のでるところです。
この部分をうまく実行させるにはどうすればいいのでしょうか、という質問なのですが。。

編集    削除
りおりお  2005-03-03 01:14:05  No: 13485  IP: [192.*.*.*]

> var Ed : array[0..9] of TEdit;

この部分を

var
  Form1: TForm1;
  Ed : array[0..9] of TEdit;

のようにすると、Unit2 からも Ed[i] みたいにできる

編集    削除
りおりお  2005-03-03 01:15:12  No: 13486  IP: [192.*.*.*]

他のユニットから見えるのは、interface 部だけです。

編集    削除
tonma  2005-03-03 01:22:50  No: 13487  IP: [192.*.*.*]

>var
>  Form1: TForm1;
>  Ed : array[0..9] of TEdit;
このように変更しましたが、やはりコンパイル時にエラーがでます。
ここ以外に変更する点はありませんよね・・。。

編集    削除
kkk  2005-03-03 01:27:44  No: 13488  IP: [192.*.*.*]

>>var
>>  Form1: TForm1;
>>  Ed : array[0..9] of TEdit;
>このように変更しましたが、やはりコンパイル時にエラーがでます。
>ここ以外に変更する点はありませんよね・・。。

これは implementation部に書いたのではなくて interface部に記述してあるのですよね?

編集    削除
tonma  2005-03-03 01:31:30  No: 13489  IP: [192.*.*.*]

りおりおさんのおっしゃるとおりに、
> var Ed : array[0..9] of TEdit;
この部分を
>var
>  Form1: TForm1;
>  Ed : array[0..9] of TEdit;
に変更しました。
また、 interface部に記述すると、未定義の識別子エラーがでてしまいます。

編集    削除
kkk  2005-03-03 01:36:27  No: 13490  IP: [192.*.*.*]

>りおりおさんのおっしゃるとおりに、
りおりおさんはinterface部のつもりでおっしゃていると思います。
その場所ではなくて interface部の もともとForm1: TFormが宣言されていったところに変更してください。

編集    削除
Basser  2005-03-03 01:46:30  No: 13491  IP: [192.*.*.*]

>>var
>>  Form1: TForm1;
>>  Ed : array[0..9] of TEdit;
>に変更しました。
>また、 interface部に記述すると、未定義の識別子エラーがでてしまいます。

interface部に記述したからエラーになるのではありません。
  
  Ed : array[0..9] of TEdit;

はTForm1のメンバーではないからです。

  × form1.Ed[i].text := 'aa';
  ○ Ed[i].text:= 'aa';

編集    削除
tonma  2005-03-03 01:49:24  No: 13492  IP: [192.*.*.*]

implementationの上に書きましたが、Unit2の
    form1.Ed[i].text := 'aa';
の部分がうまく通りません。
------------------------
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;
  Ed : array[0..9] of TEdit;
implementation

uses Unit2;

=========={  省略  }==========
------------------------

編集    削除
tonma  2005-03-03 01:52:29  No: 13493  IP: [192.*.*.*]

Basser さんのおっしゃるとおりでした。
    Ed[i].text:= 'aa';
とすることによって、うまく実行できました。
皆さん、ありがとうございました。

編集    削除