DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
Nomal.NetでのIPv6の比較(5) | Nomal追加コントロールのtabindex値を既存の間に設定する方法(1) | Nomal.Net 5.0 におけるDLL参照問題?(7) | NomalVB.net非同期処理でtextboxに出力したい(2) | NomalToolStripStatusLabelの空白部分を埋めたい(2) | NomalOracle への OleDb 接続に失敗する(3) | Nomal正規表現で株価を取得したい(1) | Nomal親スレッドへ処理の移譲(7) | Nomalデザイナで編集・チェックアウトキャンセルすると(3) | NomalVB.NETで作成したDLLをVB6.0から呼び出す(3) | NomalVB.NETからRDゲートウェイを利用したリモートデスクトップ接続(4) | NomalクラスによるGetBytes関数のエンディアンの違い(2) | Nomal.Net 5.0 におけるServiceControllerの代替クラス(3) | Nomal[VB.NET]Excelのプロセスが終了しない(2) | NomalC#をVBに変換した際の強制的な参照渡し(2) | Nomal新たにshowしたフォームでのボタンのクリック(5) | Nomalリッチテキストボックスの文字を太文字にしたい(2) | NomalVB.netにおける固定長出力方法(3) | NomalDataObjectの使いまわし(5) | NomalLIstview のDataSource(2) | NomalClassの作り方(2) | NomalOpenFileDialogの初期ファイル名の表示が変(1) | NomalVB.NETのVBA化(2) | Nomal改行のコード(7) | NomalGoogle翻訳の結果の取得(2) | NomalStopwatchクラスのElapsedMillisecondsの挙動(2) | Nomal.net Chartで二重ドーナツグラフの作り方(3) | Nomalexeをショートカットから起動した場合のエラー(2) | Nomalデスクトップ と Desktop(6) | Nomalデザイナのプロパティウィンドウで静的プロパティを選択したい(3) | NomalPHPでシリアライズした、データをデシリアライズしたい(4) | Nomal二次元配列 インデックスが配列の境界外(2) | NomalVB.netで作成したexeのNgenによる弊害(1) | NomalDrawBezierの使い方について(7) | Nomalメジャーバージョンの異なるLog4netライブラリを参照したい(4) | NomalVB6→2005変換時のDeclare宣言のマーシャリング属性(8) | NomalGROUPBOXの複製について(vb.net)(1) | NomalActiveReports 3.0からActiveReports 7.0へのァイルコンバータについて(4) | NomalAccess OLEでExecuteNonQuery(3) | NomalKeyDownでの右コントロールキーイベント(2) | NomalExcel複数シートの印刷順序(3) | NomalWMPへno(3) | NomalDataGridViewの行番号(7) | Nomalapp.config定義によるネットワークトレースログの世代管理(2) | Nomalrelease/debugのどちらで作成されたものかを判断する方法(2) | NomalC#コンソールアプリでタイピング練習ソフト作成(3) | Nomal自分自身を呼び出すのはOKですか(1) | NomalWebBrowser Control foreachで値が消える(2) | NomalDeclare宣言するdllと参照追加をするdllの区別(4) | NomalTaskクラスを.NET Framework 2.0で実現させる方法(2) | NomalVS2017で作成されたDLLをVS2005で作成されたAPで使用する方法(4) | NomalWebBrowser Controlを使って、任意の値を取得(5) | NomalEditボックスに簡体字をセットする方法(2) | NomalList型でエラーが起きてしまい・・・(1) | Nomalフォルダ内の全ての容量を取得したい(4) | NomalWebClientが上手く動かない(2) | Nomal共変性と反変性ってこういうこと?(4) | Nomalモードレスフォーム Warning IDE0067を回避したい(7) | NomalLINQの拡張メソッドの定義(1) | Nomalこんな演算子初めて見ました。(5) | Nomalプロセスからウインドウを取得(4) | Nomalフォーム外のカーソルの変更(2) | NomalLINQのメソッド構文の書き方(3) | NomalVB.NETでCSVを読み込む際にSQL文を使いたい(3) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(2) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(5) | Nomalラムダ式の勉強中(2) | NomalWebClientで、短期間にDownloadStringAsyncを実行したい(2) | Nomalvb.net+SQLiteで複数データベースファイルへのトランザクション方法(3) | NomalNewの使い方間違ってますか?(4) | Nomalジェネリック型インターフェースを使った変数を扱いたい(3) | NomalC#をVBに変換(2) | NomalProcess.WaitForExitで正常に動作しない?(3) | NomalCatch時のex.StackTraceの情報(3) | Nomalユーザーコントロール内のテキストボックスのmodifiedプロパティ(4) | NomalPictureBox.Locationのキャンセル(3) | NomalJOIN操作の構文エラー(4) | NomalVisualStudioでマクロ(3) | NomalVisualStudioでExcelのVSTO開発(3) | NomalOracleDataAccess を参照したプログラムでデバッグモードが機能しなくなる(3) | NomalIE11では表示されるが、.netのWebBrowserでは、表示されないHPを表示する方法(7) | NomalマウスのないOSでマウスカーソルの表示(2) | NomalRDP接続でのネットワーク帯域制限(0) | NomalFILE.COPYでIOExceptionエラーが出る(11) | NomalToolStripMenuItemにShortcutKeysを指定した際の、元のコントロールを取得する方法(2) | Nomal動的にプロパティや変数の値の取得(4) | NomalVB6 ほかのアプリケーションを起動し そのアプリケーションは終了させる方法(4) | NomalMouseEventArgsのカレント座標(2) | Nomalリッチテキストボックスでの字間の調整(2) | NomalDrawImage でメモリ不足エラー(3) | Nomal必須コンポーネントの一覧に追加したい(0) | NomalCode128でバーコードが読み取れない(8) | NomalあるWindows10PCでビルドしたEXEがW8.1以下で実行エラー(5) | NomalApp.configのMy.Application.Log設定で使用できない属性が出る(0) | NomalVC++ → VB.Netに変換時に文法エラー(2) | Nomalvb2010を使用したmicrosoft Wordの任意の行の削除(0) | NomalVb.netからAccessへの接続について(3) | NomalSQL-Server Compact 4.0が表示されない(2) | Nomalバーコードの数字を非表示にしたい(2) | Nomal令和の日付への対応(3) |



■記事リスト / ▼下のスレッド
■34349 / 親記事)  ジェネリック型インターフェースを使った変数を扱いたい
□投稿者/ アフロ 一般人(1回)-(2019/11/01(Fri) 11:51:54)
  • アイコン環境/言語:[C# VisualStudio2012] 
    分類:[.NET] 

    ジェネリック型指定したインターフェースを扱っていて、行き詰ってしまいました。

    public interface IRoutine
    {
      // 基本の機能
    }

    public interface IRoutine<TParent> : IRoutine
    where T : IRoutine
    {
      // 親を設定する
      T Parent { get; set; }
    }

    ClassA : IRoutine<ClassA>
    {
    }

    ClassB : IRoutine<ClassB>
    {
    }

    としたとき、
    var routines = new IRoutine<T>[] {ClassA, ClassB}; // ※
    foreach(var routine in routines)
    {
      routine.Parent = 〇〇;
    }

    のように、ClassAとClassBを同じコレクションに入れて反復処理をしたいのですが、※の部分でうまく行きません。
    このような場合、変数の型指定はどのようにしてやれば良いのでしょうか?
    よろしくお願いします。

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34351 / ResNo.1)  Re[1]: ジェネリック型インターフェースを使った変数を扱いたい
□投稿者/ 魔界の仮面弁士 大御所(1246回)-(2019/11/01(Fri) 16:13:16)
  • アイコンNo34349に返信(アフロさんの記事)
    > public interface IRoutine<TParent> : IRoutine
    >     where T : IRoutine
    > {
    >   // 親を設定する
    >   T Parent { get; set; }
    > }

    このインターフェイスは、<T> を持つジェネリック クラスの
    子階層で定義されているということでしょうか?
    それともこれは誤記で、実際は T = TParent なのでしょうか?


    > ClassA : IRoutine<ClassA>
    これは「class ClassA : IRoutine<ClassA>」のことでしょうか?


    > var routines = new IRoutine<T>[] {ClassA, ClassB}; // ※

    元ソースが文法的に不正確である点はさておき、
     var t0 = typeof(IRoutine);
     var t1 = typeof(IRoutine<>);
     var t2 = typeof(IRoutine<ClassA>);
     var t3 = typeof(ClassA);
    において、
     t0.IsAssignableFrom(*) は、t0〜t3 いずれに対しても true
     t1.IsAssignableFrom(*) は、t1 自身以外はすべて false
     t2.IsAssignableFrom(*) は、t0〜t1 は false、t2 自身と t3 は true
     t3.IsAssignableFrom(*) は、t3 自身以外はすべて false
    という関係性を持ちます。


    ゆえに今回の型定義の場合、書くとしても
     var routines = new IRoutine[] { new ClassA(), new ClassB() };
     foreach (dynamic routine in routines)
     {
       routine.Parent = afro;
     }
    とするしかないでしょう。


    ただしこの場合、公開された
     class ClassA : IRoutine<ClassA>
     {
       public ClassA Parent { set; get; }
     }
    のような実装が対象であり、明示実装された
     class ClassA : IRoutine<ClassA>
     {
       ClassA IRoutine<ClassA>.Parent { set; get; }
     }
    なクラスに対しては使えません。
違反を報告
引用返信
■34352 / ResNo.2)  Re[2]: ジェネリック型インターフェースを使った変数を扱いたい
□投稿者/ アフロ 一般人(2回)-(2019/11/01(Fri) 17:47:28)
  • アイコン魔界の仮面弁士さん
    ご回答ありがとうございます。

    >>public interface IRoutine<TParent> : IRoutine
    >>    where T : IRoutine
    すみません。TはTParentの誤りです。

    >>ClassA : IRoutine<ClassA>
    > これは「class ClassA : IRoutine<ClassA>」のことでしょうか?
    仰る通り、class ClassA : IRoutine<ClassA>のつもりでした…

    dynamicという宣言の仕方を知らなかったので、そんな方法があったかと驚きました。
    是非取り入れてみたいと思います。
    助かりました。

    しかし、インターフェースは反復処理で力を発揮するものと思っていましたが
    ジェネリックにするとそうでもないのですかね… 今更な嘆きですが…

解決み!
違反を報告
引用返信
■34353 / ResNo.3)  Re[3]: ジェネリック型インターフェースを使った変数を扱いたい
□投稿者/ 魔界の仮面弁士 大御所(1247回)-(2019/11/01(Fri) 18:37:58)
  • アイコン2019/11/03(Sun) 15:28:57 編集(投稿者)

    No34352に返信(アフロさんの記事)
    > dynamicという宣言の仕方を知らなかったので、そんな方法があったかと驚きました。

    ジェネリックはコンパイル時点で型が確定していますが、
    dynamic の場合は実行時に動的に判定されます。

    そのため、ジェネリックに比べるとパフォーマンスは幾許か落ちますし、
    スペルミスや型の取り違いなどがあった場合も、
    コンパイル時点では検出されません。御注意ください。


    > しかし、インターフェースは反復処理で力を発揮するものと思っていましたが
    > ジェネリックにするとそうでもないのですかね…

    No34349 にあるような型定義だと使えませんが、ジェネリックの指定如何によっては
    共変性・反変性によって対処できることはありそうです。
    https://ufcpp.net/study/csharp/sp4_variance.html

    また、将来的には共変戻り値を使えるようになるかもしれません。
    ただし仮に実装されたとしても、.NET Framework では利用できず、
    .NET 5 あるいは .NET 6 以降になりそうです。
    https://ufcpp.net/blog/2019/10/pickuproslyn1004/



    > 今更な嘆きですが…
    今回の型パラメータ T が指し示す型は、
     interface IRoutine<T> : IRoutine where T : IRoutine
     {
      T Parent { get; set; }
     }
    と定義されています。

    なので、Parent プロパティが取り扱うインスタンスは、「少なくとも IRoutine 型を持つ」ことは間違いありません。

    その上で、実際のインスタンスについては、型定義が
     「class ClassA : IRoutine<ClassA>」
     「class ClassB : IRoutine<ClassB>」
    となっています。

    ClassA と ClassB は互いの継承関係を持ちません。
    両者の共通点は、「ジェネリックではない IRoutine インターフェイスを持つこと」だけです。

    この共通している IRoutine 型を使うことで、少なくとも
     『foreach (IRoutine routine in routines)』
    と書くことはできるでしょう。

    しかし IRoutine に Parent プロパティは無いので、
    このループ変数では、Parent に代入できません。

    型の確定した Parent を持つのは IRoutine ではなく、
    IRoutine<ClassA> や IRoutine<ClassB> 、
    あるいは ClassA や ClassB 型といった固有の型だけです。

    両者に共通した型が存在していない以上、このままでは
    ループ処理させることができないというわけです。
    (先述したように、dynamic やリフレクションを用いて、
    コンパイル時点ではなく実行時に解決させることならば可能)


    逆に言えば、これはつまり ClassA と ClassB の両方に対して
    「Parent プロパティを持つ共通の型」を継承もしくは実装しておくことで、
    foreach による取りまとめが可能になることを意味します。


    たとえば、こういう書き方をすることはできるでしょう。

    // 下記 2 つの定義はそのまま
    public interface IRoutine { /* 基本となる各種メンバー定義 */ }
    public interface IRoutine<T> : IRoutine where T : IRoutine
    {
      // Parent プロパティだけを定義
      T Parent { get; set; }
    }

    // 「Parent プロパティを持つ共通の型」を新たに定義
    abstract class RoutineBase : IRoutine<IRoutine>
    {
      // abstract または virtaual で定義
      public abstract IRoutine Parent { get; set; }
    }

    // 少なくとも「共通の型」を持つように実装する
    class ClassC : RoutineBase { … }
    class ClassD : RoutineBase, IRoutine<ClassD> { … }

    ***************

    var routines = new RoutineBase[] { new ClassC(), new ClassD() };
    foreach (RoutineBase routine in routines)
    {
      routine.Parent = IRoutine型の何か;
    }

    ===================

    上記では、「共通の型」として抽象クラスを設けていますが、
    もちろんインターフェイスのままでも OK です。


    // 「Parent プロパティを持つ共通の型」の定義
    interface IParent : IRoutine<IRoutine> { }


    // 少なくとも「共通の型」を持つように実装する
    class ClassE : IParent {
     public IRoutine Parent { get; set; }
    }
    class ClassF : IParent, IRoutine<ClassF> { … }

    ***************
    var routines = new IParent[] { new ClassE(), new ClassF() };
    foreach (IParent routine in routines)
    {
      routine.Parent = IRoutine型の何か;
    }


    あるいは、そもそも IRoutine<T> を廃止してしまい、上記 IParent を
     interface IParent : IRoutine
     {
       IRoutine Parent { get; set; }
     }
    にしてしまうという手もあります。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34347 / 親記事)  C#をVBに変換
□投稿者/ VBはじめました 一般人(11回)-(2019/11/01(Fri) 10:23:22)
  • アイコン環境/言語:[VisualStudio2017 VB.net] 
    分類:[.NET] 

    次のC#のコードをVBに変換したいと考えています。
    var queryMatchingFiles =
    from file in fileList
    where file.Extension == ".htm"
    let fileText = System.IO.File.ReadAllText(file.FullName)
    let matches = searchTerm.Matches(fileText)
    where matches.Count > 0
    select new
    {
    name = file.FullName,
    matchedValues = from System.Text.RegularExpressions.Match match in matches
    select match.Value
    };

    ****以後 自分で変換できた範囲 ********
    Dim queryMatchingFiles =
    From file In fileList
    Where file.Extension = ".htm"
    Let fileText = System.IO.File.ReadAllText(file.FullName)
    Let matches = searchTerm.Matches(fileText)
    Where matches.Count > 0
    Select New

    お願いがあります。
    New以後、どうやって変換すればいいか教えて頂けませんか?
    宜しくお願いいたします。

    C#のコードの出典は、https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/linq/how-to-combine-linq-queries-with-regular-expressions
    です。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34348 / ResNo.1)  Re[1]: C#をVBに変換
□投稿者/ 魔界の仮面弁士 大御所(1245回)-(2019/11/01(Fri) 11:03:11)
  • アイコンNo34347に返信(VBはじめましたさんの記事)
    > New以後、どうやって変換すればいいか教えて頂けませんか?

    Select New With {
     Key .Name = file.FullName,
     matchedValues = From match As System.Text.RegularExpressions.Match in matches Select match.Value
    }

    という感じでどうでしょう。

    クエリ構文のかわりにメソッド構文でも可。
違反を報告
引用返信
■34350 / ResNo.2)  Re[2]: C#をVBに変換
□投稿者/ VBはじめました 一般人(12回)-(2019/11/01(Fri) 14:27:41)
  • アイコン魔界の仮面弁士さんありがとうございます。
    助かりました。


解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34341 / 親記事)  Process.WaitForExitで正常に動作しない?
□投稿者/ 香魚 一般人(1回)-(2019/10/28(Mon) 20:36:15)
  • アイコン環境/言語:[Win10,Office2016,VB.NET(2017)] 
    分類:[.NET] 

    Public Class Form1
        Dim myapp As String = "excel.exe"
        'Dim myapp As String = "notepad.exe"
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim p As New System.Diagnostics.Process()
            p.StartInfo.FileName = myapp
            p.Start()
        End Sub
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Dim p As New System.Diagnostics.Process()
            p.StartInfo.FileName = myapp
            p.Start()
            p.WaitForExit()
            MsgBox("完了")
        End Sub
    End Class
    
    Button1はexcel.exeまたはnotepad.exeを起動します。
    
    Button2はexcel.exeまたはnotepad.exeを起動して
    そのプロセスが終了したら完了のメッセージボックスを表示します。
    
    実行環境 : Win10 + Office2016 + VB2017
    
    
    上記のプログラムを実行すると次のような動きになります。
    A)Button1を押すと、excel.exeが起動します。
      →問題なし。
    Aで起動したエクセルを終了します。
    
    B)Button2を押すと、excel.exeが起動し、WaitForExitで待機状態となります。
      エクセルを終了すると完了のメッセージボックスが表示されます。
      →問題なし。
    
    C)Button1を押して、excel.exeを起動します。
      エクセルが起動している状態で、Button2を押します。
      エクセルが2つ表示された状態になりますが、
      その状態で完了のメッセージが表示されてしまいます。
      →なぜかWaitForExitが働いていない状態。
    
    Cのケースでも、2つ目に起動したエクセルが終了するまで
    WaitForExitで待機状態にすることはできないでしょうか?
    
    ちないみに、コメントアウトしているnotepad.exeの方で試すと、
    Cのケースも問題なく待機状態となります。
    
    ちなみに、
    Win7 + Office2010 + VB2010 の環境で同じプログラムを実行すると
    excel.exeもnotepad.exeも
    Cのケースでも問題なく待機状態となります。
    

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34342 / ResNo.1)  Re[1]: Process.WaitForExitで正常に動作しない?
□投稿者/ Azulean 大御所(512回)-(2019/10/28(Mon) 22:04:58)
  • アイコン2019/10/28(Mon) 22:05:31 編集(投稿者)

    No34341に返信(香魚さんの記事)
    > Cのケースでも、2つ目に起動したエクセルが終了するまで
    > WaitForExitで待機状態にすることはできないでしょうか?

    残念ながらできません。

    Excel.exe は、すでに Excel.exe が起動していればそのプロセスに処理をお願いしてすぐに終了するように実装されているためです。

    ほかの方法で Excel.exe がいなくなっているかどうかを監視するということも考えられますが、ユーザーが最初から Excel.exe を起動していた場合にどうするかといった仕様検討が必要になります。
違反を報告
引用返信
■34344 / ResNo.2)  Re[1]: Process.WaitForExitで正常に動作しない?
□投稿者/ 魔界の仮面弁士 大御所(1244回)-(2019/10/29(Tue) 08:58:02)
  • アイコンNo34341に返信(香魚さんの記事)
    > Win7 + Office2010 + VB2010 の環境で同じプログラムを実行すると
    > excel.exeもnotepad.exeも
    > Cのケースでも問題なく待機状態となります。

    Excel 2010 までは、新規プロセスを起動していましたが、
    Excel 2013 からは既存プロセスを流用する設計に変わったためです。

    ただしオートメーションで起動する場合には、引き続き
    複数のプロセスとして同時に起動することができます。


    詳しいことはこちらをご覧ください。
    https://blogs.msdn.microsoft.com/office_client_development_support_blog/2012/02/14/office-4/
    https://blogs.msdn.microsoft.com/office_client_development_support_blog/2016/12/19/excel2013-changes-to-sdi/
違反を報告
引用返信
■34346 / ResNo.3)  Re[1]: Process.WaitForExitで正常に動作しない?
□投稿者/ 香魚 一般人(2回)-(2019/10/31(Thu) 21:19:59)
  • アイコンありがとうございました。

    windowsのバージョンが原因か
    excelのバージョンが原因か
    visualstudioのバージョンが原因か
    分からなかったのですが、
    excelのバージョンが原因であることが分かりました。

    excelでいろいろ調べたところ、
    /x スイッチを指定すれば、プロセス統合(?)されないようですので、
    それで対応してみたいと思います。

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34328 / 親記事)  Catch時のex.StackTraceの情報
□投稿者/ たくろう 一般人(1回)-(2019/10/26(Sat) 10:43:50)
  • アイコン環境/言語:[VB2017] 
    分類:[.NET] 

    2019/10/26(Sat) 10:47:40 編集(投稿者)
    2019/10/26(Sat) 10:44:43 編集(投稿者)
    2019/10/26(Sat) 10:44:34 編集(投稿者)
    
    --------------------------------
    01    Public Class Form1
    02        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    03            Try
    04                Dim l1 As Long = 1
    05                Dim l2 As Long = 0
    06                Dim l3 As Long
    07                l3 = l1 / l2 'ゼロ除算エラーを発生
    08            Catch ex As Exception
    09                Console.WriteLine(ex.StackTrace)
    10            End Try
    11        End Sub
    12        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    13            Try
    14                Test2()
    15            Catch ex As Exception
    16                Console.WriteLine(ex.StackTrace)
    17            End Try
    18        End Sub
    19        Private Sub Test2()
    20            Try
    21                Dim l1 As Long = 1
    22                Dim l2 As Long = 0
    23                Dim l3 As Long
    24                l3 = l1 / l2 'ゼロ除算エラーを発生
    25            Catch ex As Exception
    26                Throw
    27            End Try
    28        End Sub
    29    End Class
    --------------------------------
    
    例として、このようなプログラムがあります。
    #実際には会社でプログラムを書いてて、それを紙に印刷して持ち帰り
    #家で紙から再度手打ちしてプログラムを書いているので、
    #もしかすると、誤字脱字があるかもしれません。
    #社内ルールで会社から掲示板に投稿できない為、ご容赦ください。
    
    フォーム上にButton1とButton2の2つ配置されています。
    両ボタンとも処理内容は同じです。
    ただ、その処理をボタンのイベントプロシージャに直接書いているか
    サブプロシージャに書いているかの違いです。
    
    Button1を実行すると、エラーが発生して、
    ex.StackTrace(の出力結果)には
    「7行目でエラー」という情報があり、問題ありません。
    
    Button2を実行すると、エラーが発生して、
    ex.StackTrace(の出力結果)には
    「26行目でエラー」と「14行目でエラー」の2つの情報だけで、
    最初のエラー位置「24行目でエラー」という情報が含まれません。
    
    「24行目でエラー」という情報が含まれるようにしたいのですが、
    どのようにすれば良いでしょうか?
    
    
    ※サブプロシージャではTry-Catchしなければ良いのかもしれませんが、
      この例ではそうですが、実際には、データベースのトランザクションなどを行っており、
      サブプロシージャ内でもTry-Catchが必要となります。
    

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34330 / ResNo.1)  Re[1]: Catch時のex.StackTraceの情報
□投稿者/ 魔界の仮面弁士 大御所(1242回)-(2019/10/26(Sat) 17:27:32)
  • アイコンNo34328に返信(たくろうさんの記事)
    > 「24行目でエラー」という情報が含まれるようにしたいのですが、
    > どのようにすれば良いでしょうか?

    26 行目を
     Throw
    から
     System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(ex).Throw()
    に変更してみてください。

    https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.exceptionservices.exceptiondispatchinfo?WT.mc_id=DT-MVP-8907&view=netframework-4.5
違反を報告
引用返信
■34331 / ResNo.2)  Re[2]: Catch時のex.StackTraceの情報
□投稿者/ たくろう 一般人(2回)-(2019/10/26(Sat) 22:34:25)
  • アイコンNo34330に返信(魔界の仮面弁士さんの記事)
    > 26 行目を
    >  Throw
    > から
    >  System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(ex).Throw()
    > に変更してみてください。

    ありがとうございます。
    週明け、会社で確認してみます。

    #解決マークはその時に。

違反を報告
引用返信
■34343 / ResNo.3)  Re[2]: Catch時のex.StackTraceの情報
□投稿者/ たくろう 一般人(3回)-(2019/10/28(Mon) 23:03:28)
  • アイコンNo34330に返信(魔界の仮面弁士さんの記事)
    >  System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(ex).Throw()

    会社で試したところ、できました。

    「24行目でエラー」と「26行目でエラー」と「14行目でエラー」の
    3つの情報が含まれるようになりました。
    (3つの情報以外に、エラーとは直接関係ない(?)情報が含まれるようになってしまっていましたけども、問題ありません。)

    ありがとうございました。

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▲上のスレッド
■34336 / 親記事)  ユーザーコントロール内のテキストボックスのmodifiedプロパティ
□投稿者/ はる 一般人(1回)-(2019/10/28(Mon) 15:16:18)
  • アイコン環境/言語:[VS2017] 
    分類:[.NET] 

    テキストボックス(txtDate)カレンダーコントロール(txtCal)のユーザーコントロールを作成しています。

    これをフォームに貼りつけコントロール名をtxtSaleDateとします。
    txtSaleDateのtxtDateのmodifiedプロパティを参照するといつもfalseになってしまいます。(txtSaleDate.txtDate.Modifedで参照しています。)

    ユーザーコントロールでは参照できないのでしょうか?
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■34337 / ResNo.1)  Re[1]: ユーザーコントロール内のテキストボックスのmodifiedプロパティ
□投稿者/ 魔界の仮面弁士 大御所(1243回)-(2019/10/28(Mon) 15:49:07)
  • アイコンNo34336に返信(はるさんの記事)
    > テキストボックス(txtDate)カレンダーコントロール(txtCal)のユーザーコントロールを作成しています。

    カレンダーコントロールとは何でしょうか。
    txtDate は TextBox クラスで
    txtCal は DateTimePicker でしょうか?



    現状の実装が把握しきれていないのですが、
    TextBox(あるいはその基底たる TextBoxBase)クラスの
    Modified プロパティの事だとしたら、このプロパティは
    下記のように動作します。

    ・ユーザーがテキストを編集すると true になる
    ・コードから Text プロパティを編集すると false になる
    ・Modiled プロパティを意図的に true/false に書き換えることは可能


    > txtSaleDateのtxtDateのmodifiedプロパティを
    「txtSaleDateのtxtDate」とは、何を指しているのでしょうか?

    > txtSaleDate.txtDate.Modifedで参照しています。
    > ユーザーコントロールでは参照できないのでしょうか?
    txtSaleDate が UserControl だったりするのかな…。


    もしもユーザーコントロールが自身の子コントロールを public 等で
    公開しているのだとしたら、そのような実装は避けたほうが良いでしょう。
    (カプセル化の観点からみると、望ましくありません)
違反を報告
引用返信
■34338 / ResNo.2)  Re[2]: ユーザーコントロール内のテキストボックスのmodifiedプロパティ
□投稿者/ はる 一般人(4回)-(2019/10/28(Mon) 16:13:02)
  • アイコンNo34337に返信(魔界の仮面弁士さんの記事)

    すいません。書き直します。


    テキストボックス(コントロール名:txtDate)、DateTimePicer(コントロール名:txtCal)でユーザーコントロール(ユーザーコントロール名:CalCtrl)を作成します。

    これを何かのフォーム(form名:Form01)に上で作ったユーザーコントロールを貼りつけます。(コントロール名:txtSaleDate)

    form01でtxtSaleDateに日付を入力します。入力された日付が表示されていたものと同じであれば処理を実行したくないので

    違う日付を入力しても
    txtSaleDate.Validatingイベントで参照すると
    txtSaleDate.txtDate.modifiedはいつもfalseになっています。



    ユーザーコントロールでは参照できないのでしょうか?
違反を報告
引用返信
■34339 / ResNo.3)  Re[3]: ユーザーコントロール内のテキストボックスのmodifiedプロパティ
□投稿者/ shu 大御所(488回)-(2019/10/28(Mon) 16:59:02)
  • アイコンNo34338に返信(はるさんの記事)


    > テキストボックス(コントロール名:txtDate)、DateTimePicer(コントロール名:txtCal)でユーザーコントロール(ユーザーコントロール名:CalCtrl)を作成します。
    >
    > これを何かのフォーム(form名:Form01)に上で作ったユーザーコントロールを貼りつけます。(コントロール名:txtSaleDate)
    >
    > form01でtxtSaleDateに日付を入力します。入力された日付が表示されていたものと同じであれば処理を実行したくないので
    >
    > 違う日付を入力しても
    この入力でtxtDate.Textの内容の変更がユーザーによって行われているのでしょうか?それともtxtCalによるイベントなどで変更が行われているのでしょうか?後者であるとするとModifiedはTrueになりません。



違反を報告
引用返信
■34340 / ResNo.4)  Re[2]: ユーザーコントロール内のテキストボックスのmodifiedプロパティ
□投稿者/ はる 一般人(6回)-(2019/10/28(Mon) 17:20:48)
  • アイコンNo34337に返信(魔界の仮面弁士さんの記事)
    > ■No34336に返信(はるさんの記事)

    > ・コードから Text プロパティを編集すると false になる

    原因はこれでした。
    ありがとうございました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]






Mode/  Pass/


- Child Tree -

2021/02/28(Sun) 07:31:57 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする