MDI親フォームから、子フォームのコンポーネントのプロパティを操作

解決


からたけ  2005-02-13 19:01:19  No: 13204

はじめまして。今日Delphiをはじめました。
とても初歩的(だと思われる)質問なのですが、
Delphiのヘルプや、ウェブでのキーワード検索の結果をみてもわからなかったので、質問させてください。

<開発環境>
Delphi 6 Personal
WindowsXP professional

<何をつくっているか>
今日はじめたばかりなので付属のヘルプファイルのチュートリアルを見ながらメモ帳をつくってたのですが、そのまま作ったのでは面白くないとおもい、ユニットを二つ使って、親フォームのTabControlと、エディタ部分を持つ子フォームの動作を連動させてタブ型のエディタを作っています。

<何をしたいのか>
複数ある子フォームの表示形式を一気に変えたい(フォント、折り返し、スクロールバーなど)
たとえば、メニューの「右端で折り返す」にチェックを入れると
①以降開かれる子フォームのWordWrapはみなTrueになる。
②今表示されている子フォームのWordWrapがみなTrueになる
フォントなどについても同様です。

<そのために何をしたか>
親フォームのユニット(NameはMain)のソースに子フォーム(NameはChild,複数生成される可能性のあるフォームです。)のエディターのプロパティのフォントを操作するために以下のソースコードを書きました。

<ソース関係のあると思われる部分>
---------------------------------------------------
procedure TMain.Font1Click(Sender: TObject);
begin
        if FontDialog1.Execute then
  begin
     if FontDialog1.Execute then Child.Memo1.Font := FontDialog1.Font ;
  end ;
end;
------------------------------------------------------

<実行結果>
フォントダイアログがでる。→フォントやサイズなどを選ぶことはできる→OKを押すと、フォントダイアログが再びロードされる→その状態からもう一回OKをおすと、
---------------------------
デバッガ例外が発生
---------------------------
プロジェクト Editor.exe が EAccessViolation クラスの例外を生成しました。
'Access violation at address 00482361 in module 'Editor.exe'. Read of address 000002F0'
プロセスは停止しています。再開するにはステップ実行または実行を選択してください。
---------------------------
というメッセージが出てくる。→さらに続けて実行すると
---------------------------
editor
---------------------------
Access violation at address 00482361 in module 'Editor.exe'. Read of address 000002F0.
---------------------------
OK   
---------------------------
というメッセージが出てくる

子フォームがCreateされている場合、されていない場合で同じ挙動を示しました。そもそも、Createされていないもののプロパティを操作することはできないのでは?と思い子フォームのTMemoコンポーネントのデフォルトプロパティを操作すればよいのでは?と思ったのですが、ヘルプファイルを見る限りでは、僕には「コンポーネント作成の時のデフォルトプロパティの宣言」にかかわる項目しか見つけられませんでした。

どうか、よろしくおねがいします。
からたけ。


通りすがり  2005-02-13 22:56:08  No: 13205

MDIChildren, MDIChildCount, MDIActiveChild などを調べてみてはいかがでしょう?


通りすがり  2005-02-13 22:58:34  No: 13206

ごめんなさい。
(誤)MDIActiveChild
(正)ActiveMDIChild
です。


からたけ  2005-02-14 07:27:17  No: 13207

>通りすがりさん
ありがとうございます。
MDIChildrenだけでは特定のフォームにアクセスすることができないみたいですね。よびだせるのは子フォームそのもののメソッド、プロパティで、そいつのもつコンポーネントには直接はアクセスできない様子。
with MDIChildren[Index] do  の中で、Child.Memo1.Font:=FontDialog1.Font;
と言うようにしてみたりだめなようです。しかしヒントはいただけたので、
さらに調べてみたいと思います。解決したら、ご報告いたします。

このような所で質問をさせていただくのは初めてなのですが、
質問の内容の説明はもっとここを直すべきだ、とか、
2,3時間ヘルプやwebをあさっただけじゃだめだ。何週間も情報を探し回ってから、質問しろ、
など、質問の仕方に悪いところがあればご指摘お願いいたします。
これからお世話になることも多いとおもうので…


からたけ  2005-02-14 08:21:30  No: 13208

すでに開いているものに対しての変更は、
TChilde(MDIChildren[インデックス]).コンポーネント名
でアクセスすることができることがわかりました。
webで探したんですが、これってヘルプにのってるのかな…まともにヘルプから必要な情報を得られるようになりたいです…ひとまずこれで半分解決です。
通りすがりさん、ありがとうございました。

あとは、以降新規作成されるものについても表示形式を統一するには、どいうしたらよいか、です。
子フォームが作成されていない状態で、子フォームのプロパティのデフォルト値を変えられるかどうか、引き続き調査します。


りおりお  2005-02-14 08:40:32  No: 13209

> webで探したんですが、これってヘルプにのってるのかな

これは、クラスの基本的事項です。フォームにのせたコンポーネントは、そのフォーム
のフィールド変数になる、ってことを理解すると当然のことだと思います。


りおりお  2005-02-14 08:44:10  No: 13210

>以降新規作成されるものについても表示形式を統一するには、どいうしたらよいか

新規で作成されるとき、OnCreate などで親フォームのところの変数を見にいって、
自分で設定させるといいです。親フォームでは、設定を変えるたびにその変数に反映させて
おくだけです。


通りすがり  2005-02-14 15:14:36  No: 13211

> このような所で質問をさせていただくのは初めてなのですが、

Mr.XRAYさんのホームページに有用なサイトの紹介がありますので
参考にされるとよいと思います。
http://homepage2.nifty.com/Mr_XRAY/Links.htm#Mail

(あっ!!私自身がマナーを守っているかは。。。)


からたけ  2005-02-14 17:21:02  No: 13212

疑問に思っていたことは、りおりおさんがおっしゃられてたようにすることで解決できました。みなさんありがとうございました。

>りおりおさん
>これは、クラスの基本的事項です。フォームにのせたコンポーネントは、そのフォームのフィールド変数になる、ってことを理解すると当然のことだと思います。

そもそも何も理解していなかったということですね…
昨日からはじめて、いくつかDelphiの入門講座のようなことをやってくれているウェブページをいくつか見たのですが、ObjectPascalの変数型だとか、制御文だとか繰り返し文に関することであったり、ほんとに簡単なIDEの使い方だったりで、そのようなことはまったく学習していませんでした。もっと勉強してから質問すべきでした。とりあえずヘルプファイルのプログラマーズガイドくらいはしっかり理解して、VCLリファレンスを眺めたりして修行してきます。

>通りすがりさん
紹介ありがとうございます。Mr.XRAYさんのリンク集はきのうdelphi自体をはじめてすぐにブックマークをして、(Halbowさんのページがキーワード検索で見つかったのでそこから。)目を通してありました。でも今読み返すと書き方が徹底されていなかったようですね。

ありがとうございました。


りおりお  2005-02-14 17:42:30  No: 13213

>とりあえずヘルプファイルのプログラマーズガイドくらいはしっかり理解して、
>VCLリファレンスを眺めたりして修行してきます。

まだ1日目だったのですね!僭越ながら、1日目にしてはとてもしっかりした質問
だったと思います。上記のような姿勢がある限り、上達は早いでしょう。
いつか、ここで回答者側に回って頂くことを期待しております。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加