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

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

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

Re[9]: DialogResultに自作のEnumを使用するには?


(過去ログ 177 を表示中)

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

■101567 / inTopicNo.1)  DialogResultに自作のEnumを使用するには?
  
□投稿者/ tip (1回)-(2023/03/15(Wed) 20:30:29)

分類:[.NET 全般] 


VB.NETに関する質問です。


フォーム上に複数のボタンが配置されたフォームを
ShowDialogを使ってダイアログとして表示し、
そのいずれかのボタンを押すことで
フォームを閉じ、どのボタンを押したかを返り値として取得したいのですが、
ボタンの数が少ない場合には、
DialogResultを使うことができるのですが
数が多くなってくると不便です。

そのため、自分で定義したEnumを返り値として取得したいのですが
どのようにすれば良いですか?



引用返信 編集キー/
■101568 / inTopicNo.2)  Re[1]: DialogResultに自作のEnumを使用するには?
□投稿者/ 魔界の仮面弁士 (3591回)-(2023/03/15(Wed) 21:35:45)
2023/03/16(Thu) 14:56:56 編集(投稿者)

No101567 (tip さん) に返信
> フォーム上に複数のボタンが配置されたフォームを
> ShowDialogを使ってダイアログとして表示し、
> そのいずれかのボタンを押すことで
> フォームを閉じ、どのボタンを押したかを返り値として取得したいのですが、
> ボタンの数が少ない場合には、
> DialogResultを使うことができるのですが
> 数が多くなってくると不便です。

FontDialog や OpenFileDialog を真似てみてはいかがでしょう。(自分はそうしています)


FontDialog は OK/Cancel ボタンしかありませんが(Apply ボタンも表示できますが)、
Font プロパティを使って、「どのフォントが選択されたのか」を表すことができます。

OpenFileDialog は OK(開く)/Cancel ボタンしかありませんが(Help も表示できますが)、
FileName / FileNames プロパティを使って、「どのファイルが選択されたのか」を表すことができます。


自作ダイアログでも同様に、ShowDialog メソッド自体は
Cancel されたかどうかだけを表すように、「どのボタンが押されたのか」
という情報は、別の Enum 値をもつプロパティで返すようにします。


もしも ShowDialog と追加のプロパティの 2 つを併用するのが面倒なのであれば、
それらの呼び出しを一つのメソッドに押し込めて

 Public Shared Function ShowButtonsDialog(owner As IWin32Window) As ボタン種別
  Using dlg As New 自Form()
   If dlg.ShowDialog(owner) = DialogResult.Cancel Then
    Return ボタン種別.None
   Else
    'Return Me.SelectedButtonValue
    Return dlg.SelectedButtonValue
   End If
  End Using
 End Function

あるいは

 Public Function ShowButtonsDialog(owner As IWin32Window) As ボタン種別
  If Me.ShowDialog(owner) = DialogResult.Cancel Then
   Return ボタン種別.None
  Else
   Return Me.SelectedButtonValue
  End If
 End Function

などとしても良いでしょう。
メソッドに引数を追加して、ダイアログに表示する内容(Label や Icon など)を
呼び出し元から設定できるようにしておいても良いですね。



さらには、OpenFileDialog の FileOk イベントや FontDialog の Apply イベントのように
独自のイベントを追加するという手もあります。その場合、モーダル画面を
閉じていないまま、子画面側で操作されたときに、それに応じた処理を
呼び出し元画面に対してリアルタイム反映させるといった実装も可能です。
引用返信 編集キー/
■101569 / inTopicNo.3)  Re[2]: DialogResultに自作のEnumを使用するには?
□投稿者/ tip (2回)-(2023/03/16(Thu) 14:20:03)
ありがとうございます。

SelectedButtonValueというのは
自Formの外で定義した変数という意味でしょうか?

dlg.ShowDialogを実行すると
すぐにdlgのインスタンスは消えてしまうため、
dlgの実行中にdlgの外側で定義したSelectedButtonValueに値を代入し
dlgが消えた後でも変数を取得できるようにする、という意味で合っていますか?





引用返信 編集キー/
■101570 / inTopicNo.4)  Re[3]: DialogResultに自作のEnumを使用するには?
□投稿者/ 魔界の仮面弁士 (3592回)-(2023/03/16(Thu) 14:37:24)
No101569 (tip さん) に返信
> SelectedButtonValueというのは
> 自Formの外で定義した変数という意味でしょうか?

ダイアログ として呼ばれる側のフォーム側に追加した Property です。
自動実装プロパティでも構いません。

Form 外で保持するのは、管理が煩雑になってしまうので避けた方が良いでしょう。


> dlg.ShowDialogを実行すると
> すぐにdlgのインスタンスは消えてしまうため、

え。そんなことはないですよね?
インスタンス自体は、むしろ消えずに残るはず。

ShowDialog メソッドの解説にも書かれていますが、モーダルダイアログとして
呼び出された場合、たとえダイアログが ×ボタンで閉じられたり、Close メソッドで
閉じられたとしても、dlg のフォームは単に非表示になるだけです。

そのままではインスタンスが残ってしまうので、明示的に Dispose を呼び出すか、
Using で囲っておくことが求められます。
引用返信 編集キー/
■101571 / inTopicNo.5)  Re[4]: DialogResultに自作のEnumを使用するには?
□投稿者/ tip (3回)-(2023/03/16(Thu) 14:53:22)
2023/03/16(Thu) 14:54:15 編集(投稿者)

これって以下のように自Formのインスタンスを二回生成するという意味でしょうか?


Public Class Form1

 Public Sub aaa()

  Using dlg As New 自Form()
   Dim ButtonState = dlg.ShowButtonsDialog(Me)
  End Using

 End Function


End Class




Public Class 自Form

 Public Shared Function ShowButtonsDialog(owner As IWin32Window) As ボタン種別
  Using dlg As New 自Form()
   If dlg.ShowDialog(owner) = DialogResult.Cancel Then
    Return ボタン種別.None
   Else
    Return Me.SelectedButtonValue
   End If
  End Using
 End Function


End Class


引用返信 編集キー/
■101572 / inTopicNo.6)  Re[5]: DialogResultに自作のEnumを使用するには?
□投稿者/ 大谷刑部 (232回)-(2023/03/16(Thu) 14:59:15)
No101571 (tip さん) に返信
> 2023/03/16(Thu) 14:54:15 編集(投稿者)
>
> これって以下のように自Formのインスタンスを二回生成するという意味でしょうか?

違うでしょ。

プロパティープロシージャを定義して利用しろって言ってるんだと思いますけど。

https://learn.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/procedures/property-procedures

>>ダイアログ として呼ばれる側のフォーム側に追加した Property です。

てことだから。

引用返信 編集キー/
■101573 / inTopicNo.7)  Re[5]: DialogResultに自作のEnumを使用するには?
□投稿者/ 魔界の仮面弁士 (3593回)-(2023/03/16(Thu) 15:05:20)
No101571 (tip さん) に返信
> これって以下のように自Formのインスタンスを二回生成するという意味でしょうか?

あー。掲示板上に直書きしたので、おかしなことになっていますね。
Shared 版の実装は、
  Return Me.SelectedButtonValue
ではなく
  Return dlg.SelectedButtonValue
の間違いです。元投稿は編集しておきます。


呼び出されるダイアログ側には、 No101568
 Public Shared Function ShowButtonsDialog(owner As IWin32Window) As ボタン種別
 Public Function ShowButtonsDialog(owner As IWin32Window) As ボタン種別
のいずれか一方のみを用意します。
同じ名前で両方の実装をオーバーロードすることはできないので、
両方共存させたい場合は、別の Function 名にしておいてください。


呼び出し元からは、標準の ShowDialog の代わりに、
ShowButtonsDialog を呼び出すようにします。

たとえば 前者 (Shared メソッド版)の実装なら、呼び出し元からは
 Dim result = CustomDialogForm.ShowButtonsDialog(Me)
だけで呼べます。

後者 (インスタンス メソッド版)の実装なら、
 Using dlg As New CustomDialogForm(…)
  Dim result = dlg.ShowButtonsDialog(Me)
 End Using
という感じです。

独自のイベント処理を盛り込んだり、他にもいろいろなプロパティがある場合は、
後者の実装の方が融通が利くでしょう。一方、ボタン種別以外のやり取りが不要なら
前者の実装のみを用意した上で、ダイアログのコンストラクタも Private にしておきます。
引用返信 編集キー/
■101574 / inTopicNo.8)  Re[6]: DialogResultに自作のEnumを使用するには?
□投稿者/ tip (4回)-(2023/03/16(Thu) 15:12:16)
ありがとうございます。

インスタンス版を使った場合ですが、
CustomDialogFormの外と中で二回CustomDialogFormのインスタンスを生成することになると思いますが
合っていますか?

引用返信 編集キー/
■101575 / inTopicNo.9)  Re[7]: DialogResultに自作のEnumを使用するには?
□投稿者/ 魔界の仮面弁士 (3594回)-(2023/03/16(Thu) 15:46:31)
No101574 (tip さん) に返信
> インスタンス版を使った場合ですが、
> CustomDialogFormの外と中で二回CustomDialogFormのインスタンスを生成することになると思いますが

なりません。わざわざ再生成せずとも、自身のインスタンスを Me で取得できますよね?
引用返信 編集キー/
■101576 / inTopicNo.10)  Re[8]: DialogResultに自作のEnumを使用するには?
□投稿者/ tip (5回)-(2023/03/16(Thu) 16:03:29)
理解できました
どうもありがとうございました。

引用返信 編集キー/
■101577 / inTopicNo.11)  Re[9]: DialogResultに自作のEnumを使用するには?
□投稿者/ tip (6回)-(2023/03/16(Thu) 16:03:37)
No101576 (tip さん) に返信
> 理解できました
> どうもありがとうございました。
>
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -