- PR -

画面終了後に戻る画面がちらつきます。抑止できますか?

投稿者投稿内容
M@tch
会議室デビュー日: 2005/10/01
投稿数: 13
投稿日時: 2005-12-15 11:57
こんにちは。いつもお世話になってます。
以下の内容についてご教授頂きたく投稿させて頂きます。
解決策をご存知の方は方法を教えて下さい。
-------------------
VB.NET2003
-------------------
<内容>
A.dll内にある画面(メニュー)からB.dllにある画面(Sub処理)を呼出し
B.dllの画面(Sub処理)を終了してA.dllの画面(メニュー)に戻るときに
A.dllの画面(メニュー)がちらつきます。
この「ちらつき」を抑止する方法はありますか?

<現在のコーディング内容>
A.dllの画面(メニュー)からB.dllの画面(Sub処理)を表示するときは
Frm.ShowDialog()で表示し、終了するときはB.dll画面内の終了処理に
Me.Close()
Me.Dispose()
と書いて終了しております。これだけではだめなのでしょうか?

初心者的な内容で申し訳ありませんがご教授の程、よろしくお願いします。


甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-12-15 12:19
引用:

M@tchさんの書き込み (2005-12-15 11:57) より:
こんにちは。いつもお世話になってます。
<現在のコーディング内容>
A.dllの画面(メニュー)からB.dllの画面(Sub処理)を表示するときは
Frm.ShowDialog()で表示し、終了するときはB.dll画面内の終了処理に
Me.Close()
Me.Dispose()
と書いて終了しております。これだけではだめなのでしょうか?


普通はそれだけで十分です。したがって画面がちらついて見える原因は他にあると思います。メニュー画面に配置しているコントロールは何ですか?Activateイベントなど、フォームが入れ替わったときに実行される処理に何を記述していますか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-15 12:26
引用:

Matchさんの書き込み (2005-12-15 11:57) より:

A.dll内にある画面(メニュー)からB.dllにある画面(Sub処理)を呼出し
B.dllの画面(Sub処理)を終了してA.dllの画面(メニュー)に戻るときに
A.dllの画面(メニュー)がちらつきます。
この「ちらつき」を抑止する方法はありますか?


B によって隠された領域にある A 側のコントロール数が多いのでしょう。
基本的には画面設計を見直すしかないです。

引用:

Me.Close()
Me.Dispose()


Dispose は呼び出し側のお仕事じゃなかったかな?

コード:

    Private Sub Button1_Click(...) Handles Button1.Click
        Dim hForm2 As Form2

        Try
            hForm2 = New Form2()
            hForm2.ShowDialog()
        Finally
            If Not hForm2 Is Nothing Then
                hForm2.Dispose()
            End If
        End Try
    End Sub


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2005-12-15 12:35
ダイアログ?と閉じるときに、
メニューのあるフォームを Activate したらどうなりますか?
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2005-12-15 12:42
ダイアログから呼び出し元を参照するには、Owner プロパティ。
ShowDialog のときに、owner を指定できますので、
そこで呼び出し元(メニューフォーム自身)に指定。

ダイアログを閉じるときに、

Me.Owner.Activate() 'Owner = メインメニューフォームのはず

としてメインメニューをアクティブにする。

多分、これのことじゃないかと思います。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-15 13:15
引用:

masaさんの書き込み (2005-12-15 12:35) より:

ダイアログ?と閉じるときに、
メニューのあるフォームを Activate したらどうなりますか?

引用:

masaさんの書き込み (2005-12-15 12:42) より:

ダイアログから呼び出し元を参照するには、Owner プロパティ。
ShowDialog のときに、owner を指定できますので、
そこで呼び出し元(メニューフォーム自身)に指定。
ダイアログを閉じるときに、
Me.Owner.Activate() 'Owner = メインメニューフォームのはず
としてメインメニューをアクティブにする。
多分、これのことじゃないかと思います。


結局、描画で手間取っているので、Closing などで Active にしてもムダですよね。

端末の構成によっては気にならないので、導入先の端末を見直すか、
おそらく重いであろう、A 側の画面設計の見直しになると思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2005-12-15 13:59
引用:

A.dll内にある画面(メニュー)からB.dllにある画面(Sub処理)を呼出し
B.dllの画面(Sub処理)を終了してA.dllの画面(メニュー)に戻るときに
A.dllの画面(メニュー)がちらつきます。



一般的なちらつきとは別という点で言うと
私も先日、閉じたら親画面がカメラのようにフラッシュするという現象がありました。
そのときの解決策というか失敗はきちんとOwnerが引き渡されていなかったということだったと記憶しています。
どう直したかというと、例えばControlを指定していたものをControl.FindFormにしたとか、そういうことだったような。。。
この現象であれば、Owner引数に親「フォーム」のIWin32Windowが指定されているか確認してみてください。

[ メッセージ編集済み 編集者: まどか 編集日時 2005-12-15 14:11 ]
M@tch
会議室デビュー日: 2005/10/01
投稿数: 13
投稿日時: 2005-12-15 14:08
甕星さん、じゃんぬねっとさん、masaさん ご教授ありがとうございました。
甕星さんの仰るように私のPCはPenVの866でメモリは512に上げてはいるのですが
開発するにはスペックが低いのでその影響もあるかと思われます。すいません。。
また、A.dllの画面(メニュー)のActivatedイベントには「Me.Refresh()」と
記述してます。あまり意味が無いのでしょうか?

じゃんぬねっとさんの仰るようにDisposeはアプリケーション間でオブジェクトを
共有できるようにしている側でのリソース開放となっておりましたので、その
意味からいくと、A.dll側の画面(呼出元メニュー)でDisposeをかけるのが正解と
理解しました。

samaさんの手法も今から実行してみたいと思います。
皆さん、本当にありがとうございました。助かりました。



スキルアップ/キャリアアップ(JOB@IT)