MDIフォームを使ってchild formをいくつか表示しています。
設計段階でchild formのwindowstateを最大化に設定していますが最大化に設定したフォーム以外のフォームを表示したときに最初に最大化されて表示していたフォームが自動的に小さくなってしまいます。フォームの最大化を固定するにはどのようにすればよいのでしょうか。

A 回答 (2件)

どもども、再び田吾作7です。



ぼくの知っている限りでは、常に最大化というのはMDIFormの子である限り、出来ません。(Windowsの仕様だと思うし・・・・)

「MDIFormの子もどき」とするのであれば可能です。
もどきというのは実際は子ではないのです。


手順を簡単に記すと(APIばっかりですが・・・)
1.MDIFormを開く
2.FindWindowExでMDIClient領域のハンドルを得る(クラス名="MDIClient")
3.常に最大化したいフォームを開く([MDIChild = False])
4.SetParentにてそのフォームをMDIClient領域が親になるようにする。
5.SetWindowLong(MDIFormWnd,GWL_WNDPROC,AddressOf オリジナル関数名)でウィンドウズのメッセージを監視する(プロセス監視)
6.サイズ変更終了時に最大化したいフォームの最大化時のサイズをセットする
(API忘れた・・・)
7.最大化のメッセージを送るSendMessage
ってな感じです。

もしこの方法を使用するのであれば、本来のMDIの子達の上に常に表示されてしまうので、子は使えません。よって、子を作成するには手順1から手順4を使用して、子を作成しなくてはいけません。さらに、MDIFormのメッセージをもっといろいろな種類を拾って、各子達を制御しなくてはならなく、また子達のメッセージも拾わなくてはいけなくなります。

これをやってたら大変ですよ。

ですので、プログラムの仕様の変更か、もしくはNo1の回答の手順を行うのがベストだと思います。

でわでわ
    • good
    • 0
この回答へのお礼

>ぼくの知っている限りでは、常に最大化というのはMDIFormの子である限り、出来ません。(Windowsの仕様だと思うし・・・・)

やはり、仕様の問題でしょうか。 どんなことを試してもだめだったので質問してみたのですが、やはりそうなのでしょうね。
一度、教えていただいた手法でがんばってみます。

お礼日時:2001/07/11 17:30

どもども田吾作7です



常に最大化というのは。。。

アクティブになった時に最大化してはだめですか?
Private Sub Form_Activate()
Me.WindowState = vbMaximized
End Sub


それがだめなら、
Private Sub Form_Activate()
Me.Left = 0
Me.Top = 0
Me.Width = MDIForm1.ScaleWidth
Me.Height = MDIForm1.ScaleHeight
End Sub

というように、MIDFormの表示領域いっぱいにサイズを指定して、
最大化に近いサイズで表示するとか?
フォームを「BorderStyle=無し」にしてしまえば、ユーザからサイズの変更を
されることもないし、、、
このとき注意すべきは、MDIFormのResize時にも、
このような最大化もどきを行うコードを実行しなければ
ならないことです。

やっぱ反則?

でわでわ
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルで特定のマイナス値を除く最大値と最小値について

エクセルで、ある特定の値(-99999)を除く最大値と最小値を

=MAX(IF(A1:A10<>-99999,A1:A10,""))
=MIN(IF(A1:A10<>-99999,A1:A10,""))

の配列数式を使って求めました。

ただ、A1:A10がすべて-99999の場合、0がかえってきてしまいます。
この場合、-99999と表示するにはどのようにすればよいのでしょうか?

1つの式で、上記2つの処理をするにはどのようにすればよいのでしょうか?

Aベストアンサー

修行中の身なので『指導』は勘弁してください。:D

>最大値は-99999以外の値がすべてマイナス値の場合に0がかえってきてしまいます。
提示の式
>=MAX(IF(A1:A10<>-99999,A1:A10,""))
これでも同じですよね?
なので空白セルはないと判断しました。

あるなら、ベタですが
=IF(AND(A1:A10=-99999),-99999,MAX(IF(A1:A10<>-99999,IF(A1:A10<>"",A1:A10,""))))
の配列数式で。

#他の方の案もお待ちになられたほうが良いかもしれません。

QVB2010でMDI親フォームから子フォームを表示

VB2010でソフトを作っております。
MDI親フォームから子フォームを表示させたいのですが…。
過去に少しだけVB6を使っていたことがありますが、クラスという概念に苦労しております
インスタンスや初期化といったところをうまく扱えばとは思うのですが、よろしくご指導お願いいたします。

1.MDI親フォーム(Form1)のボタンを押し、子フォーム(Form2)を表示させる
2.子フォームが表示されていなかったら表示させる
3.子フォームが表示されていたら何もしない

これだけの事ですがずいぶん悩んでおります。
全コードがこれです。

Public Class Form1
Private f2 As New Form2

Private Sub Form1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.IsMdiContainer = True
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim fChild As Form() = Me.MdiChildren
For Each f As Form In fChild
If f.Text = "Form2" Then
Exit Sub
End If
Next


f2 = New Form2
f2.MdiParent = Me
f2.Show()
f2.Activate()

End Sub


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

If f2 Is Nothing OrElse f2.IsDisposed Then
f2 = New Form2
f2.MdiParent = Me
End If
f2.Show()
f2.Activate()

End Sub

End Class


ボタン1でもボタン2でも、期待する動作はするのですが、

ボタン1ではアクティブになっているフォームの名前を力技で取得している気がして…
ボタン2では子フォーム(Form2)をすでに表示している状態でもさらにShowをしているのが気に入らなくて…

もっとスマートな方法がありましたら、ご指導お願いします。

VB2010でソフトを作っております。
MDI親フォームから子フォームを表示させたいのですが…。
過去に少しだけVB6を使っていたことがありますが、クラスという概念に苦労しております
インスタンスや初期化といったところをうまく扱えばとは思うのですが、よろしくご指導お願いいたします。

1.MDI親フォーム(Form1)のボタンを押し、子フォーム(Form2)を表示させる
2.子フォームが表示されていなかったら表示させる
3.子フォームが表示されていたら何もしない

これだけの事ですがずいぶん悩んでおります。
全コード...続きを読む

Aベストアンサー

Private f2 As New Form2

Private f2 As Form2
にして

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

If f2 Is Nothing OrElse f2.IsDisposed Then
f2 = New Form2
f2.MdiParent = Me
f2.Show()
End If
f2.Activate()

End Sub

としてみては?

Q平均勤続年数の記載は通常社員(役員、派遣除く)で算出されてますでしもうか?? 併せて、出向受け入れ者

平均勤続年数の記載は通常社員(役員、派遣除く)で算出されてますでしもうか??
併せて、出向受け入れ者ら上記正社員に含めないことが一般的でしょうか?

Aベストアンサー

正社員が対象で、その採用から退社(対職)まで、が対象のはずです。
役員は、なったときには「退職扱い」になります。

QWindowState Minimized(最小)で起動したものを、事後的にコードを使って最大化

画面を最小(WindowState Minimized)で起動したものを
コードを使って最大化するには、
どのプロパティを使えばいいのでしょうか。
サーバー用ソフトなので、タスクバーには、
表示されないので、システムトレイにアイコンを
おき、そこから、画面を表示できるようにしたい
のです。
(C#を使っていますが、VBでも大体同じに出来るの
で、お願いします)。

Aベストアンサー

WindowStateプロパティに
vsWindowStateMaximize か
FormWindowState.Maximized を設定すればいいと思います

Qエクセルで最小値から0を除く方法

早速ですが、エクセル入力したデータから最大値と最小値を求めようとしています。
最大値は=MAX(A1:A100)で求められるのですが、最小値には0が入っていると=MIN(A1*A100)では0となってしまいます。
0以外で最小値を求めたいのですが、どのように設定すればよいでしょうか?
どなたかご教授いただけると助かります。

Aベストアンサー

配列関数を使用することになります。
=MIN(IF(A1:A100=0,"",A1:A100))
と入れて、 Ctrl+Shift+Enter で決定します。
式が{}でくくられますが、
中身のIF文の通り、A1~A100のセルで0の値は 空白、それ以外はそのまま
で一度計算してその中の最小値を出します。

Q(VB6)MDI親FormのPictureプロパティの設定方法

MDIの親フォームのPictureプロパティに、コードで画像を貼りつけて、表示領域に全画面表示させたいのですが、できません。
MDIの親フォームでなければ、PaintPictureを使えるというのは調べましたが、MDIの親フォームではどのようにすればいいのでしょうか。

public Declare Function RedrawWindow Lib "user32" (ByVal hWnd As Long,
lprcUpdate As Any, ByVal hrgnUpdate As Long, ByVal fuRedraw As Long) As Long

Public Const RDW_ALLCHILDREN = &H80
Public Const RDW_ERASE = &H4
Public Const RDW_INVALIDATE = &H1
Public Const RDW_UPDATENOW = &H100Private

Sub Command1_Click()
Me.Picture = LoadPicture("C:\pic\aa.jpg")
Call RedrawWindow(Me.hWnd, ByVal 0&, 0&, RDW_ERASE Or _
RDW_INVALIDATE Or RDW_ALLCHILDREN Or RDW_UPDATENOW)
End Sub

MDIの親フォームのPictureプロパティに、コードで画像を貼りつけて、表示領域に全画面表示させたいのですが、できません。
MDIの親フォームでなければ、PaintPictureを使えるというのは調べましたが、MDIの親フォームではどのようにすればいいのでしょうか。

public Declare Function RedrawWindow Lib "user32" (ByVal hWnd As Long,
lprcUpdate As Any, ByVal hrgnUpdate As Long, ByVal fuRedraw As Long) As Long

Public Const RDW_ALLCHILDREN = &H80
Public Const RDW_ERASE = &H4
Public Const R...続きを読む

Aベストアンサー

拡大または縮小してとなると VB側で用意されたイベントだけでは無理なように思います

普通のFormなら Paintイベントがあるのでここを細工すればいいのですが ・・・

やるとするならば MDIFromをサブクラス化して WndProc(ウィンドウプロシージャ)を自前で定義して WM_PAINTや WM_ERASEBKGRNDなどを捕まえて修理しないといけないのかも
# 出来るかどうかは検証していません m(__)m

ただ、サブクラス化を行うと VBのIDEでのデバッグが出来なくなる点を考慮すると 面倒になりそうです

PictureBoxを貼り付けてしまうと PictureBoxの部分はクライアント領域から除外されてしまうので これも使えませんね
子フォームは このPictureBoxの下へ潜ってしみますし ・・・

Qエクセルで0を除く平均値と0の平均値を同時に表示させる方法について

エクセルで、0を除いた平均を、
{=AVERAGE(IF(A1:A10<>0,A1:A10,""))}の数式を使って求めた場合、
データがすべて0の列の平均はエラー値になってしまいます。

すべてが0の場合は0と表示させたいのですが、どのような方法がありますでしょうか?

1つの計算式を使って、上記の2つの処理は可能でしょうか?

Aベストアンサー

エラー値の場合に,0と表示する計算式ですが,いかがでしょうか?

=IF(ISERROR(AVERAGE(IF(A1:A10<>0,A1:A10,""))),0,AVERAGE(IF(A1:A10<>0,A1:A10,"")))

QForm1のボタンを押すとForm2が表示されて、Form1をクリックしたらBeep音

初歩的な質問ですみません。
タイトルそのまんま(しかも長い --;)なんですが。
よく見かけるもので、Form1でボタンを押すとForm1より小さいForm2が表示されて、そこでOKボタンを押さないとForm1に戻れなくて、その時にForm1の方をクリックするとBeep音が出る、っていうのがありますよね。あれはどうなっているんですか?Form2の表示まではできるんですけど、その先が分かりません。教えて下さい。お願いします。

Aベストアンサー

Form2.Show vbModal

でOKです。

QACCESSにてフィールド間の平均(空白除く)と空白の個数を反映するためのモジュール

ACCESS初心者です。

図のようなテーブルがあります。
このテーブルの右側にクエリで「各商品の平均値(空白セルは省く)」
ならびに「空白セルの個数」を反映したいと思っております。

過去に質問をさせていただいた案件(https://oshiete.goo.ne.jp/qa/9327298.html)の内容と類似することから、
恐らくモジュールならびにクエリ式を合わせ技にて両値を反映することになるかと想定しているのですが、調べてもなかなか当案件に類似した内容の記載を見出すことができません。

モジュール・クエリ両内容をどなたかご提案いただけないでしょうか?

何卒よろしくお願いいたします。

Aベストアンサー

図示されたようなテーブル設計はよくありません。
もしかしてクロス集計クエリから作成したテーブル?
それとも、他からインポートしたデータ?
欠点は、
日にち分のフィールドが必要、
月が替わると再度テーブルを作り直す必要がある、
かといって年間(365日)分だけ作るのも不可。フィールド数は最大でも255まで。
集計などの分析が困難など後々泥沼に。。。
http://www.accessdbstudy.net/entry/20140915/p1

商品名 日付    価格
イチゴ 2016/07/01 200
イチゴ 2016/07/03 400
イチゴ 2016/07/04 400
バナナ 2016/07/02 100
バナナ 2016/07/03 150
メロン 2016/07/01 200
メロン 2016/07/02 150
メロン 2016/07/03 100
メロン 2016/07/04 120
メロン 2016/08/01 200

のようなデザインであればクロス集計で、
テーブル名をT1とするとSQL文は、

TRANSFORM First(T1.価格) AS 価格の先頭
SELECT T1.商品名,
(DMax("日付","T1","日付 Between #2016/7/1# And #2016/7/31#")-DMin("日付","T1","日付 Between #2016/7/1# And #2016/7/31#")+1)- DCount("日付","T1","日付 Between #2016/7/1# And #2016/7/31# and 商品名='" & 商品名 & "'") AS 売切回数,
Int(Avg(T1.[価格])+0.5) AS 平均価格,
Max(T1.価格) AS 最大価格
FROM T1
WHERE T1.日付 Between #2016/7/1# And #2016/7/31#
GROUP BY T1.商品名
PIVOT Format(T1.日付,"mm/dd");

 で、
商品名 売切回数 平均価格 最大価格 07/01 07/02 07/03 07/04
イチゴ   1     333   400  200      400  400
バナナ   2     125   150      100  150
メロン   0     143   200  200   150  100  120
のようになります。
新規クエリをSQLビューに切り替えて上記のSQL文を貼り付けてみてください。
平均価格は四捨五入しています。
デザインビューに切り替えられますので確認してみてください。
売切回数を求める部分の出来が良くありません。
レコード数次第では遅くて使い物にならないかも?ご参考まで。

図示されたようなテーブル設計はよくありません。
もしかしてクロス集計クエリから作成したテーブル?
それとも、他からインポートしたデータ?
欠点は、
日にち分のフィールドが必要、
月が替わると再度テーブルを作り直す必要がある、
かといって年間(365日)分だけ作るのも不可。フィールド数は最大でも255まで。
集計などの分析が困難など後々泥沼に。。。
http://www.accessdbstudy.net/entry/20140915/p1

商品名 日付    価格
イチゴ 2016/07/01 200
イチゴ 2016/07/03 400
イチゴ 2016/07/04 4...続きを読む

QMDI:親フォームと子フォームを別EXEで実装するには

MDIでアプリケーションを作成したいと思っています。
その時に子フォームを親フォームとは別EXEで作りたいと思っています。
例えば
親フォームのボタンを押すと、子フォームEXEが起動し、親フォーム内に表示される。
このようなことは出来ますか?
出来るのでしたら、どうしたらよろしいでしょうか。
教えてください。

Aベストアンサー

手順的には
http://okweb.jp/kotaeru.php3?q=102408の#2
だと思います。
キーワードは「API関数:SetParent」
このAPIで、別EXEでもなんでも、内部に取り込むだけはできます。

しかしMDIを実現するためには、かなり制御を組み入れないといけません。
参考URLでも述べているように、最大領域だけならず終了時処理など、それ以外にも想像しえない本来のMDIとして用意されている標準制御を、実現しなければなりません。

かな~り手間だと思います。


人気Q&Aランキング

おすすめ情報