|
2019/08/28(Wed) 14:48:11 編集(投稿者)
■No92122 (PANG2 さん) に返信 >>たとえば、こういうパターンの場合に失敗するかも。 > No.92119 > で解決されているのですか?
エラーになるか、成功するか、失敗するか、という質問でしょうか? そちらの環境での実験結果はどうでしたか?
No92119 の Public Sub CopySettings(template As NumericUpDown) Dim target As NumericUpDown target = Me.NumericUpDown1 の部分を Public Sub CopySettings(target As NumericUpDown, template As NumericUpDown) な実装に差し替えて、それを
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click NumericUpDown1.Hexadecimal = False NumericUpDown1.DecimalPlaces = 0 NumericUpDown1.Maximum = Decimal.MaxValue NumericUpDown1.Minimum = Decimal.MinValue NumericUpDown1.Value = NumericUpDown1.Maximum
NumericUpDown2.Hexadecimal = True NumericUpDown2.DecimalPlaces = 0 NumericUpDown2.Maximum = Integer.MaxValue NumericUpDown2.Minimum = Integer.MinValue NumericUpDown2.Value = NumericUpDown2.Maximum
CopySettings(NumericUpDown2, NumericUpDown1) End Sub
として呼んだ場合、例外を発することなく複製されるという点までは確認しました。
しかし、もしも CopySettings の実装を
Public Sub CopySettings(target As NumericUpDown, template As NumericUpDown) 'DirectCast(target, ISupportInitialize).BeginInit() With target .Hexadecimal = template.Hexadecimal .Increment = template.Increment .Maximum = template.Maximum .Minimum = template.Minimum .ThousandsSeparator = template.ThousandsSeparator .Value = template.Value End With 'DirectCast(target, ISupportInitialize).EndInit() End Sub
とした場合には、Hexadecimal の転送時点で OverflowException がスローされることになりました。
ISupportInitialize を有効にしていた場合は例外は発生しませんでしたが、 ISupportInitialize 無しで設定しようとするならば、依存関係にある プロパティの内容を考慮しながら値を設定していく必要がありそうです。
その点が、 No92115 で触れた >> ※ ISupportInitialize.BeginEdit & .EndEdit で挟むとなお良し。 や、 No92119 でも触れた >> どのプロパティとどのプロパティを、どの順番で複製するか という点に繋がってきます。
特にコントロールの場合、ValueChagned 等のイベントを設定して いることがあるかと思いますが、設定コピー時に、そうしたイベントが 呼ばれて欲しいケースもあれば、呼ばれて欲しくないケースもあるでしょう。 あるいは、設定のコピー中はイベントが発生しないようにして、すべての コピーが完了した後で呼び出される方が都合が良いかもしれません。
また、データバインド設定が影響してくる可能性もあるでしょう。
こうした点は、それぞれのアプリの実装状況によっても 変わってくるかと思いますので、汎用的なコピー実装を設ける場合、 そうした点も気に掛ける必要があるかもしれません。
|