--追記--
imihito様より 「自分の環境でもISEからはエラーは出ないですね」との情報を頂いたので別PCで確認を取ったところそちらのPCではエラーは出ませんでした。
1/18 時間があれば再度 該当PCにて検証したいと思います。
検証した結果エラーは出なくなっていました。
前提・実現したいこと
前回の質問でimihito様に頂いたコードの中に
New-Module
と Export-ModuleMembet
が使われているのですが
どういうものだかよくわかりません。
公式のヘルプを見たのですがそれでもわかりません。
触ってみてカプセル化のようなものだと検討をつけて
試に 頂いたコードを書き換えて タイマーをスクリプトブロック内に入れて
みたのですが
動作的には正しく動くのですがエラーが頻発します。
New-Module
と Export-ModuleMembet
の正しい使い方、及び挙動と
何故 該当のソースコードの内容でエラーが出てしまうのか教えて頂きたいです。
お願い致します。
発生している問題・エラーメッセージ
"Opacity" の設定中に例外が発生しました: "破棄されたオブジェクトにアクセスできません。 オブジェクト名 'Form' です。" 発生場所 D:\Users\Desktop\Formサンプル.ps1:60 文字:13 + $mainForm.Opacity = $newOpacity + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], SetValueInvocationException + FullyQualifiedErrorId : ExceptionWhenSetting
該当のソースコード
powershell
1using namespace System.Windows.Forms 2using namespace System.Drawing 3 4Set-StrictMode -Version Latest 5 6[scriptblock]$_Get_Form = { 7 #フォームの作成 8 [Form]$Form = 9 New-Object -TypeName Form -Property @{ 10 Width = 600 11 Height = 300 12 Opacity = 0.1 13 Text = 'Test' 14 TopMost = $true 15 } 16 17 #データグリッドビューの作成 18 [string[]]$ListName = @('test1', 'test2') 19 [DataGridView[]]$List = 20 $ListName | 21 ForEach-Object -Process { 22 # 共通の設定は生成時に`-Property`で設定 23 New-Object -TypeName DataGridView -Property @{ 24 AutoSizeColumnsMode = [DataGridViewAutoSizeColumnsMode]::AllCells 25 AutoSizeRowsMode = [DataGridViewAutoSizeColumnsMode]::AllCells 26 Name = 'List_{0}' -f $_ 27 Dock = [DockStyle]::Fill 28 } 29 } 30 #$List[0].Add_SelectionChanged($_ListNowUp) 31 $List[0].MultiSelect = $false 32 #$List[1].Columns[0].DefaultCellStyle.WrapMode = [DataGridViewTriState]::True 33 34 [SplitContainer]$SplitContainer = [SplitContainer]::new() 35 $SplitContainer.Panel1.Controls.Add($List[0]) 36 $SplitContainer.Panel2.Controls.Add($List[1]) 37 $SplitContainer.Name = "SplitContainer_1" 38 $Form.Controls.Add($SplitContainer) 39 40 [Timer]$mouseMonitor = 41 New-Object -TypeName Timer -Property @{ 42 Interval = 50 43 Enabled = $true 44 Tag = $Form 45 } 46 $X = 1 # こちらの$XをAとする 47 $mouseMonitor.add_Tick({ 48 Write-host $X # Aの$Xの値が出力される 49 [Form]$mainForm = $Form # [Form]::ActiveForm 50 51 # タイトルバー含めたフォームの大きさは`Bounds`から、 52 # マウスの位置は`[Cursor]::Position`から取得できるため 53 # フォームの中に、マウスが入っているかどうかで確認 54 [Double]$newOpacity = 55 if ($mainForm.Bounds.Contains([Cursor]::Position)) { 56 1 57 } else { 58 0.1 59 } 60 61 if ($mainForm.Opacity -ne $newOpacity) { # 負荷軽減のため(意味があるか未確認) 62 $mainForm.Opacity = $newOpacity 63 } 64 $Script:X += 10 # Aの$Xの値が加算される 2回目以降の実行結果から値が保持されていることが確認できる 65 }) 66 67 Export-ModuleMember -Variable Form, mouseMonitor, List 68} 69 70# `Export-ModuleMember`で設定した要素(Form, List)をメンバーとして持つPSCustomObjectを生成($Scirpt:~を避けたかったため) 71[psobject]$formContainer = New-Module -AsCustomObject -ScriptBlock $_Get_Form 72 73# タイマーの生成 74$X = 2 # こちらの$XをBとする 75$formContainer.mouseMonitor.Start() 76$formContainer.Form.ShowDialog() > $null 77$formContainer.Form.Dispose() 78$formContainer.mouseMonitor.Dispose() # Formとの紐付けが無いため、忘れないように
補足情報(FW/ツールのバージョンなど)
Win10
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/18 03:01
2019/01/18 11:59
2019/01/19 00:43 編集