[生成したフォーム上のテキストボックスの内容が読み取れない]
http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201602/16020009.txt
予想される動作をするテストプログラムのコードとその結果の図です.
キャストの問題としては取り上げていません.あしからず.
動作確認環境は Windows 7 U64(SP1) + Delphi XE(UP1) Pro です.
Form2 は自動生成ではなく,[使用可能なフォーム]にしています(推測です).
また,おそらく TFrame を使用すべきなのですが,それはそれで別問題とします.
---------------- Form1 のユニットのコード --------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Unit2;
type
TForm1 = class(TForm)
Button1: TButton;
MainPanel: TPanel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
//質問者のコードでは PForm : TForm となっている
//にもかかわらず,Create の時は TForm2 を使用している
//これもタイプミスかと思われたが,そうではないらしい
//Form2 を使用するという意味では基本的に不要
//unit2 にForm2: TForm2;というグローバル変数の定義がある
PForm : TForm2;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
PForm := TForm2.Create(nil);
PForm.Parent := MainPanel;
PForm.Left := 0; PForm.Top := 0;
PForm.Show;
// 上のコード実際には以下でよい
// この場合は,Form2 の解放処理は必要ない
// Form2 := TForm2.Create(Self);
// Form2.Parent := MainPanel;
// Form2.Left := 0;
// Form2.Top := 0;
// Form2.Show;
end;
// 質問者が提示したコードには PForm の解放処理はない
// PForm は,Owner を nil にして生成しているので,自動的には解放されない
// 明示的な解放処理が必要
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(PForm);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
S : string;
begin
//質問者のコードは s =: Form2.moji となっているが,
//OnCreate で TForm2 のインスタンスを生成している
//つまり,Form2 は自動生成になっていないと予想される
//したがって,Form2のインスタンスは存在していない
//生成済みのインスタンスである PForm を使用する
//これもタイプミス(入力ミス)と思われたが,そうではないらしい
//では何故,ここでエラーが発生しないのか ?
//もしかしたら,Form2 は自動生成なのか ?
S := PForm.moji;
MessageBox(Handle, PChar(S), '結果', MB_ICONINFORMATION);
// Form2 := TForm2.Create(Self); を使用した場合は
// S := Form2.moji; でよい
end;
end.
---------------- Form2 のユニットのコード --------------------------------
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Name: TEdit;
private
{ Private 宣言 }
public
{ Public 宣言 }
//質問者は Name: TEditの後に書いている
//通常はそのような場所には書かない
function moji:String;
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
{ TForm2 }
// 質問者のコードは function moji: String; となっていて,クラスのメンバーには
// なっていない
// では,何故,この関数の定義文がクラスのメンバとして書かれているのか
// 「オン書き」のためのタイプミスかと思われたが,そうではないらしい
function TForm2.moji: String;
begin
Name.Text := 'test';
Result := Name.Text;
end;
end.
|