名前 題名 ▼ Mr.XRAYさん > [生成したフォーム上のテキストボックスの内容が読み取れない] > 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. > GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link