初歩的な質問かもしれませんが、フォームが2つあるとき(Form1、Form2)にForm2のButton1をクリックしたときにForm1のコンポーネント配列したEdit[i]に文字を表示させたいのですが、そういった事は可能なのでしょうか?
form2のボタンクリックイベントに
----------------------------------------------
var i : integer;
begin
i := strtoint(Edit1.Text);
Form1.Edit[i].Text := XXXXX;
end;
----------------------------------------------
と書いても、うまくいきません。
解決法を教えてください。
implementation のすぐ下に
uses
Unit1;
というふうに、Form1 が宣言されているユニット名を uses します。
また、
> Form1.Edit[i].Text := XXXXX;
これですけど
Edit[i] が TForm1 クラスのフィールド変数になっていなければいけません。
早いレスありがとうございます。
usesのところにはUnit1を追加しています。
>Edit[i] が TForm1 クラスのフィールド変数になっていなければいけません。
すみませんが自身が力不足なので、Edit[i]をどのようにしたらいいのか、具体的に教えてもらえないでしょうか?お願いします。
二つのフォームに関することは uses にユニット名を指定することで解決です。
> Edit[i]をどのようにしたらいいのか
これは、Form1 の たとえば Button1Click では、どのようにしてますか?
それが分からないと、回答しようがありません。
Form1にButtonはありませんが、もしあれば、同じように
----------------------------------------------
var i : integer;
begin
i := strtoint(Form2.Edit1.Text);
Edit[i].Text := XXXXX;
end;
----------------------------------------------
とします。
・・検討違いの回答でしたらすみませんが、質問を詳しく教えてください。
それなら
Form1.Edit[i].Text := XXXXX;
でOKなのではないでしょうか。
要するに Unit1 で Edit[i] の宣言がどうなってるか分からないのです。
宣言部分をコピペして示してみるといいんじゃないでしょうか。
TForm1 の フィールドだったら Form1.Edit[i] でアクセスできますし、
たんなるグローバル変数なら、 Edit[i] だけでもOKかもしれません。
Unit2 からどのように見えるかが分からないと回答できません。
うまくいかないという状況が不明です。
何らかのエラーが出るということですか?
状況を示します。
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のコメントをしている部分が不具合のでるところです。
この部分をうまく実行させるにはどうすればいいのでしょうか、という質問なのですが。。
> var Ed : array[0..9] of TEdit;
この部分を
var
Form1: TForm1;
Ed : array[0..9] of TEdit;
のようにすると、Unit2 からも Ed[i] みたいにできる
他のユニットから見えるのは、interface 部だけです。
編集 削除>var
> Form1: TForm1;
> Ed : array[0..9] of TEdit;
このように変更しましたが、やはりコンパイル時にエラーがでます。
ここ以外に変更する点はありませんよね・・。。
>>var
>> Form1: TForm1;
>> Ed : array[0..9] of TEdit;
>このように変更しましたが、やはりコンパイル時にエラーがでます。
>ここ以外に変更する点はありませんよね・・。。
これは implementation部に書いたのではなくて interface部に記述してあるのですよね?
りおりおさんのおっしゃるとおりに、
> var Ed : array[0..9] of TEdit;
この部分を
>var
> Form1: TForm1;
> Ed : array[0..9] of TEdit;
に変更しました。
また、 interface部に記述すると、未定義の識別子エラーがでてしまいます。
>りおりおさんのおっしゃるとおりに、
りおりおさんはinterface部のつもりでおっしゃていると思います。
その場所ではなくて interface部の もともとForm1: TFormが宣言されていったところに変更してください。
>>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';
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;
=========={ 省略 }==========
------------------------
Basser さんのおっしゃるとおりでした。
Ed[i].text:= 'aa';
とすることによって、うまく実行できました。
皆さん、ありがとうございました。