C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 指定したFormが2重起動されないようにするには


(過去ログ 110 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■65189 / inTopicNo.1)  指定したFormが2重起動されないようにするには
  
□投稿者/ LOC (3回)-(2013/02/12(Tue) 12:29:58)

分類:[.NET 全般] 

お世話になっております。LOCと申します。

現在、Windowsフォームアプリケーションを開発しております初心者です。
-----------------------------------------
開発環境:VS2010、VB.NET
-----------------------------------------

フォームの2重起動させず、フォームがすでに起動している場合には、
最前面に表示させたいと考えております。


以下のような共通メソッドでフォームが開いているかチェックし、
さらに別のメソッドでフォームを開く(開いている場合は、最前面に表示)ようにしたいと考えております。

指定したフォームをインスタンス生成する方法がわかりません。


Public Shared Function IsOpenForm(callform As Form) As Boolean

For Each f As Form In Application.OpenForms
If (f.Name.Equals(callform.Name)) Then
Return True
End If
Next

Return False
End Function


すべて、共通関数で処理したいと考えているのですが、可能でしょうか。
ご存知でしたら、ご教授お願い致します。

引用返信 編集キー/
■65191 / inTopicNo.2)  Re[1]: 指定したFormが2重起動されないようにするには
□投稿者/ shu (179回)-(2013/02/12(Tue) 13:12:01)
No65189 (LOC さん) に返信
>
> フォームの2重起動させず、フォームがすでに起動している場合には、
> 最前面に表示させたいと考えております。

Public Class Form1
Inherits System.Windows.Forms.Form
End Class

だとして

Form1.Show()
Form1.BringToFront()
とすればよいです。





> 以下のような共通メソッドでフォームが開いているかチェックし、
> さらに別のメソッドでフォームを開く(開いている場合は、最前面に表示)ようにしたいと考えております。
>
> 指定したフォームをインスタンス生成する方法がわかりません。
>
指定をどのように行うかです。
提示コードだと該当フォームのインスタンスを渡すようになっているので
提示コードより前の処理が分からないという事でしょうか?
引用返信 編集キー/
■65192 / inTopicNo.3)  Re[2]: 指定したFormが2重起動されないようにするには
□投稿者/ LOC (4回)-(2013/02/12(Tue) 14:17:21)
No65191 (shu さん) に返信
>
> Form1.Show()
> Form1.BringToFront()
> とすればよいです。

shuさん、返信ありがとうございます。
最前面に表示することができました。



> 指定をどのように行うかです。
> 提示コードだと該当フォームのインスタンスを渡すようになっているので
> 提示コードより前の処理が分からないという事でしょうか?


説明不足で申し訳ありません。やりたいことははっきりしているのですが、どうにもうまく説明できません。



私の動作のイメージとしては以下通りです。
Form1のボタンクリック
 ⇒ Form2が開いているか 
    ⇒ 開いている  ⇒ 開いているフォームをアクティブにする


    ⇒ 開いていない ⇒ インスタンス生成 ⇒ フォームを表示


下記コードの xxxxx を動的に指定できるかをお聞きしたいと思っておりました。
指定できるのであればどのような引数を持たせたらよいのでしょうか。

For Each d as Form InApplication.OpenForms
If (TypeOf(d) Is xxxxx) Then
'〜フォーム起動済み〜
End If
Next


 
引用返信 編集キー/
■65193 / inTopicNo.4)  Re[3]: 指定したFormが2重起動されないようにするには
□投稿者/ shu (180回)-(2013/02/12(Tue) 14:41:03)
No65192 (LOC さん) に返信
> 下記コードの xxxxx を動的に指定できるかをお聞きしたいと思っておりました。
> 指定できるのであればどのような引数を持たせたらよいのでしょうか。
> 
> For Each d as Form InApplication.OpenForms
>     If (TypeOf(d) Is xxxxx) Then
>         '〜フォーム起動済み〜
>     End If
> Next
TypeOf a is b
は
aがbクラスであってもbクラスの派生クラスであっても当てはまるので
適切な判断にはなりません
a.GetType() is b.GetType()
とするとaのインスタンスとbのインスタンスの型(クラス)が一致するときのみTrueとなります。

もしインスタンス作成前にチェックするなら型を渡してチェックし
型情報からコンストラクタを呼ぶ処理になるかと思います。

        Dim TpForm2 = GetType(Form2)
        Dim exists = False

        For Each frm As Form In Application.OpenForms
            If frm.GetType Is TpForm2 Then
                exists = True
                frm.BringToFront()
            End If
        Next

        If Not exists Then
            Dim frm as Form = DirectCast(TpForm2.GetConstructor(Type.EmptyTypes).Invoke(Nothing), Form)
            frm.Show()
        End If

引用返信 編集キー/
■65194 / inTopicNo.5)  Re[3]: 指定したFormが2重起動されないようにするには
□投稿者/ howling (186回)-(2013/02/12(Tue) 14:47:18)
2013/02/12(Tue) 14:50:44 編集(投稿者)

すみません、開いているForm全てから検索すると思っていなかったため、
自分でForm2のインスタンスを直接見れる状態の事について書いてしまいました。

不要な情報を与えてしまうおそれがありますので、このコメントは削除致します。
引用返信 編集キー/
■65204 / inTopicNo.6)  Re[4]: 指定したFormが2重起動されないようにするには
□投稿者/ LOC (5回)-(2013/02/12(Tue) 19:06:38)
No65193 (shu さん) に返信
> TypeOf a is b
> は
> aがbクラスであってもbクラスの派生クラスであっても当てはまるので
> 適切な判断にはなりません
> a.GetType() is b.GetType()
> とするとaのインスタンスとbのインスタンスの型(クラス)が一致するときのみTrueとなります。
>
> もしインスタンス作成前にチェックするなら型を渡してチェックし
> 型情報からコンストラクタを呼ぶ処理になるかと思います。

TypeOfメソッドで書いていたらエラーがでて悩んでおりました。
shuさんに教えていただいた通りに実装したら
思っていた通りに動作いたしました。

大変助かりました。ありがとうございました。

また回答してくださった、howling さんありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -