[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/03/06(Tue) 15:56
投稿者名:FR
Eメール:
URL :
タイトル:
ユーザーコントロールがある場合の最大化
ガッさん、ダンボさん回答ありがとうございます。
ガッさんのご指摘通り新規投稿にしました。ご迷惑おかけしました。
また、ダンボさんのコードを記述してみましたが、
「予期しないエラーが発生しました。」
「エラー番号438 エラー内容:オブジェクトは、このプロパティまたは
メソッドをサポートしていません。」
というエラーが出て最大化しようとしてもフォームは最大化できますが、
他のコントロール類は最大化しません・・・。
どうしたらいいでしょうか?

投稿時間:2007/03/06(Tue) 16:25
投稿者名:ダンボ
Eメール:
URL :
タイトル:
Re: ユーザーコントロールがある場合の最大化
> 「予期しないエラーが発生しました。」
> 「エラー番号438 エラー内容:オブジェクトは、このプロパティまたは
> メソッドをサポートしていません。」

そりゃわからんですね。FRさんのFormのデザインがこちらには分かりませんもの。
ダンボの試験環境ではForm上にラベル1個テキストボクッス1個フレーム1個その中にオプションボタン1個とチェックボックス1個、タブストリップ1個、SSTab1個その中に3タブ、各々のタブにラベル1個テキストボクッス1個づつ。

真髄は伝えたのだから後は個々のデバッグあるのみということで。
ヒント:どのオブジェクト?どのプロパティ?エラー箇所は?→エラーが起きる理由

投稿時間:2007/03/06(Tue) 16:46
投稿者名:FR
Eメール:
URL :
タイトル:
Re^2: ユーザーコントロールがある場合の最大化
> ダンボの試験環境ではForm上にラベル1個テキストボクッス1個フレーム1個その中にオプションボタン1個とチェックボックス1個、タブストリップ1個、SSTab1個その中に3タブ、各々のタブにラベル1個テキストボクッス1個づつ。
>
> 真髄は伝えたのだから後は個々のデバッグあるのみということで。
> ヒント:どのオブジェクト?どのプロパティ?エラー箇所は?→エラーが起きる理由

ダンボさん、回答ありがとうございます。
デバッグしていきたいと思います。
ありがとうございました。

投稿時間:2007/03/06(Tue) 17:23
投稿者名:FR
Eメール:
URL :
タイトル:
Re^3: ユーザーコントロールがある場合の最大化
ダンボさんやガッさんの御意見を元に自分なりに以下のコードを記述してみました。
結果はメインフォーム上のコントロール類とSSTabは最大化されますが、SSTab上の
ユーザーコントロール類は駄目でした・・・。
よろしくお願いします。

Class1
Option Explicit

Public csControl As Control
Public csParent As Control
Public csHideSSTab As Boolean

Public csLeft As Double
Public csTop As Double
Public csWidth As Double
Public csHeight As Double
Public csFontSize As Double

メインForm
Private Clipped As Boolean
Private ctls As Collection
Private clpScaleWidth As Double
Private clpScaleHeight As Double

Form_Load
Call ClipControl

Private Function ClipControl()
    
    Dim Ctl As Control
    Dim ctlst As Resize
    
    On Error Resume Next
    
    Set ctls = New Collection
    clpScaleWidth = Me.ScaleWidth
    clpScaleHeight = Me.ScaleHeight
    
    For Each Ctl In Me.Controls
        
        Set ctlst = New Resize
        
        With ctlst
            Set .csControl = Ctl
            Set .csParent = Ctl.parent
                
            .csLeft = Ctl.Left
            .csTop = Ctl.Top
            .csWidth = Ctl.Width
            .csHeight = Ctl.Height
            .csFontSize = Ctl.FontSize
        End With
        
        Call ctls.Add(ctlst)
    Next
    
    Clipped = True
    
End Function

Private Sub Form_Resize()
    
    Dim Ctl As Control, CtlCln As New Collection
    Dim ratScaleWidth   As Double
    Dim ratScaleHeight  As Double
    Dim ctlst As Resize
    
         On Error Resume Next
         For Each Ctl In Controls
            If Ctl.Left < 0 Then CtlCln.Add Ctl
         Next
        
         tabView.Visible = False

        '水平、垂直方向の拡大率を決定する
        ratScaleWidth = Me.ScaleWidth / clpScaleWidth
        ratScaleHeight = Me.ScaleHeight / clpScaleHeight
        'それぞれのコントロールを拡大する
        For Each ctlst In ctls
            With ctlst
                If .csHideSSTab Then
                    .csControl.Left = .csLeft * ratScaleWidth - 75000
                Else
                    .csControl.Left = .csLeft * ratScaleWidth
                End If
                .csControl.Top = .csTop * ratScaleHeight
                .csControl.Width = .csWidth * ratScaleWidth
                .csControl.Height = .csHeight * ratScaleHeight
                .csControl.FontSize = .csFontSize * ScaleWidth                          
             End With
        Next
        
      tabView.Visible = True
End Sub

投稿時間:2007/03/07(Wed) 00:08
投稿者名:ダンボ
Eメール:
URL :
タイトル:
Re^4: ユーザーコントロールがある場合の最大化
> ダンボさんやガッさんの御意見を元に自分なりに以下のコードを記述してみました。
> よろしくお願いします。

んなこと言われてもね。
ダンボのコードではうまく動作しなかなかったから御自分で改良(改悪)したということですか?
あのコードで動作しなければ責任とってつきあいますけど、何かFRさんコーディングミスをして
迷走を始めた気がします。

Resizeイベントでクラス登録をしようなんて所を見るとまるきりわかっていないんだなと。

            If (TypeOf ctl.Container Is SSTab) And (ctl.Left < 0) Then
                .csHideSSTab = True
                .csLeft = ctl.Left + 75000
            Else
                .csHideSSTab = False
                .csLeft = ctl.Left
            End If
が無いのに、
            If .csHideSSTab Then
                .csControl.Left = .csLeft * ratScaleWidth - 75000
            Else
                .csControl.Left = .csLeft * ratScaleWidth
            End If
があっても意味ないじゃないですか。
#(Option Explicitの他に、値が明示的に未設定な変数を参照したらエラーにする機能が欲しい)

このプログラムの動作原理は、
・フォームロード時にすべてのコントロールの座標と大きさを記録しておく
・フォームリザイズ時に、まず拡大率(縮小率)を求めておいて、すべてのコントロールの
 座標と大きさに対してその拡大率(縮小率)を掛ければ良い
・但しSSTab内のコントロールだけは単純には行かず、隠されたコントロールの本来の座標を
 記憶せねばならず、また拡大(縮小)するときもSSTabの仕様にあわせて隠し直さなければならない

投稿時間:2007/03/07(Wed) 16:22
投稿者名:FR
Eメール:
URL :
タイトル:
Re^5: ユーザーコントロールがある場合の最大化
> このプログラムの動作原理は、
> ・フォームロード時にすべてのコントロールの座標と大きさを記録しておく
> ・フォームリザイズ時に、まず拡大率(縮小率)を求めておいて、すべてのコントロールの
>  座標と大きさに対してその拡大率(縮小率)を掛ければ良い
> ・但しSSTab内のコントロールだけは単純には行かず、隠されたコントロールの本来の座標を
>  記憶せねばならず、また拡大(縮小)するときもSSTabの仕様にあわせて隠し直さなければならない

ダンボさん、回答ありがとうございます。
また、わかってなくてすいません・・・。
最大化コードはダンボさんの提示してくださったコードに直しました。
デバッグしてみたんですがClipControl内のFor Each文を循環して16回目の

If (TypeOf Ctl.Container Is SSTab) And (Ctl.Left < 0) Then

の後にForm_Load内に記述してある下記のエラー処理のCommonErrMsgに飛び

ErrHandle:
    CommanErrMsg
    Exit Sub

その後エラーが表示になります。
また、ユーザーコントロール内で各コントロールを強制的に配置している
箇所があり、これが関係して最大化できていないんでしょうか?

投稿時間:2007/03/10(Sat) 10:30
投稿者名:ダンボ
Eメール:
URL :
タイトル:
Re^6: ユーザーコントロールがある場合の最大化
> デバッグしてみたんですがClipControl内のFor Each文を循環して16回目の
> If (TypeOf Ctl.Container Is SSTab) And (Ctl.Left < 0) Then
> の後にForm_Load内に記述してある下記のエラー処理のCommonErrMsgに飛び
> ErrHandle:
>     CommanErrMsg
>     Exit Sub
> その後エラーが表示になります。

これが迷走の始まりでしたよね。だからヒントとして「どのオブジェクトのどのプロパティが
エラーになっているかを調べるべき」ということを言いました。
オブジェクト名はCtl.Nameでわかります。Ctl.Leftが無いコントロールというのは
少ないので、Ctl.Containerが無いんじゃないですか?その場合は無視して続行すれば
多分良しと。(このプログラムの心はコンテナがSSTabの場合だけを気にしているから)

> また、ユーザーコントロール内で各コントロールを強制的に配置している
> 箇所があり、これが関係して最大化できていないんでしょうか?

そりゃ論外でしょう。もっと具体的に聞かないと判断できないけれど強制再配置している
のならば(このプログラムも再配置なので)矛盾する可能性は大ですね。

投稿時間:2007/03/15(Thu) 23:12
投稿者名:FR
Eメール:
URL :
タイトル:
Re^7: ユーザーコントロールがある場合の最大化
> そりゃ論外でしょう。もっと具体的に聞かないと判断できないけれど強制再配置している
> のならば(このプログラムも再配置なので)矛盾する可能性は大ですね。

ダンボさん、回答ありがとうございます。また、遅くなってすみませんでした。
今までの御意見を参考にしながら自分なりに考えていこうと思います。