喫茶XRAYトップページ


[9608] 解決はしたようですが 方向が...返信 削除
2016/2/19 (金) 23:55:55 Mr.XRAY
[生成したフォーム上のテキストボックスの内容が読み取れない]
http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201602/16020009.txt

tor さんの 2016/02/19(金) 23:49:30 のレス

>む、そっちに行ってしまいましたか……

ハハハッ.思わぬ方向に...
「勝てば官軍,動けば正義」ですが,何とも...
良い子の皆さんは真似しないでね.


[9611] タイプ(入力)ミスではないらしい返信 削除
2016/2/20 (土) 23:48:07 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.



[9612] Re:タイプ(入力)ミスではないらしい返信 削除
2016/2/21 (日) 09:16:15 Mr.XRAY
このことに関連する,当サイトの記事は以下の通りです.

他のフォームを使用する関係は,
[122_複数のフォームを使用するプロジェクト ( 入門者用 ) ]
http://mrxray.on.coocan.jp/Delphi/plSamples/122_PluralForms.htm

クラスのメンバとしての関数類を書く場所
http://mrxray.on.coocan.jp/Delphi/Others/A_UltraIntro01.htm#list1

[特別な領域] の設定は,拡張子が .dfm のファイルに保存される
[特別な領域を dfm ファイルで確認]
http://mrxray.on.coocan.jp/Delphi/Others/A_UltraIntro01.htm#07

クラスのメンバーのメソッドや関数作成でタイプミス防止
[関数等の宣言文から実装部 ( スケルトン ) を作成 - クラス補完]
http://mrxray.on.coocan.jp/Delphi/Others/A_IDETechnique.htm#02


-------------- 質問者が提示したコード -----------------------------
type
  TForm2 = class(TForm)
    Name: TEdit;
    function moji:String;
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

function moji: String;
begin
  Name.Text := 'test';
  Result := Name.Text;
end;

質問者が提示したコードは上のようになっています.
もし,function moji: String; をグローバルに使用するというのであれば,
以下のように書けます.
ただし,質問者の意図は不明です.
この関数をクラスのメンバとして,使いたいのか,グローバルな関数として
使いたいのか.

type
  TForm2 = class(TForm)
    Name: TEdit;
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

  function moji: String;  // ここに書くとグローバルになる

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

function moji: String;
begin
  //function moji は Form2 のメンバではないので Form2 が必要
  //Name(TEdit)はForm2 のメンバ
  Form2.Name.Text := 'test';
  Result := Form2.Name.Text;
end;


INCM/CMT
Cyclamen v3.82