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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■54749  ShowDialogで呼び出されたフォームの処理について
□投稿者/ assa -(2010/11/01(Mon) 10:59:00)

    分類:[VB.NET/VB2005 以降] 

    お世話になります。

    フォームAにボタンコントロールを置き、ボタンのクリックイベントでフォームBをShowDialogで呼び出す処理を考えています。

    プログラムの実行中、フォームBを呼び出すボタンが複数回押される事を想定し、フォームAでボタンが押される度にフォームB側で特別な処理を行いたいのですが、
    ActivatedイベントなどでActiveになった原因(ShowDialog)などを判断する事は出来ますか?
    ShowDialogによりフォームBがActiveになった時のみ特別な処理を行い、他の理由でActiveになった場合には処理を行わないというようにしたいのです。
    フォームA側でShowDialogの直前に特別な処理を行えば良いのですが、できればフォームB内で行いたいと考えています。

    開発環境はVB2010です。

    良い解決方法がありましたらご教授下さい。
    宜しくお願い致します。
親記事 /過去ログ91より / 関連記事表示
削除チェック/

■54748  fpspreadのfomuraで時刻の加減
□投稿者/ 柴犬 -(2010/11/01(Mon) 10:53:05)

    分類:[VB.NET/VB2005 以降] 

    お世話になります。

    VB.NET 2003にて、FpSpreadを使用しているのですが、
    Spread内のセル計算で時刻データの加減を行いたいと思っております。

    セルA1、A2に時刻を入力し、A3にA1,A2の差を計算するとしたらどのようなやり方があるか、
    詳しい方、ご教授よろしくお願いします。

    ちなみに、セルA1、A2のセルタイプはDateTimeを使用し、A3はTextを使用します(24時間を越える時刻表記がしたいため)。

    A
    1 8:00
    2 17:00
    3 9:00
    ~~~~~~ 期待する結果

    一応、自分で考えたのは
    =CONCATENATE(ABS(LEFT(A2, LEN(A2)-3) - LEFT(A1, LEN(A1)-3)), ":", ABS(RIGHT(A2, 2) - RIGHT(A1, 2)))
    なのですが、どうやら、DateTimeからTextに変換できていないため計算ができないようでした。

    よろしくお願いします。
親記事 /過去ログ92より / 関連記事表示
削除チェック/

■57468  Re[6]: InnerTextによるXMLノードの取得
□投稿者/ 上条 -(2011/02/28(Mon) 18:36:03)
    > 私の提示したのはSplitを使っていませんよ。送られてきたXMLをSplitしないで
    > Srcの代わりに処理するようにしてみて下さい。XMLがタグの区切りで終わっていれば
    > 何行あっても同時に処理出来るかと思います。
    
    やってみましたが何も表示されなかったため
    xml = xml.Replace('\0', '\n');の後にshuさんのコードを記述しました。
    すると途中まで同じテキストを表示し
    改行コードを含んだテキストは表示されずに処理が続行されました。
    
    ------------------------------------------
    Datagridviewで以下のような表示になる
    
    1番目
    1番目
    1番目
    1番目
    1番目
    1番目
    7番目
    8番目
    10番目(改行コードを含む9番目は表示されず10番目からの表示となる)
    
    ------------------------------------ソース
    while (true)
                {
                    byte[] resBytes = new byte[MAX_RECEIVE_SIZE];
                    int resSize = sock.Receive(resBytes, resBytes.Length, System.Net.Sockets.SocketFlags.None);
    
                    if (resSize == 0)
                    {
                        return;
                    }
                    xml = prev + Encoding.UTF8.GetString(resBytes, 0, resSize);
                    
                    xml = xml.Replace('\0', '\n');←これが無いと何も表示されない
                    string come2 = "";
                    var xdoc1 = new XmlDocument();
                    xdoc1.LoadXml(String.Format("<root>{0}</root>", xml));
               
                    foreach (XmlNode ndtmp in xdoc1.ChildNodes)
                    {
                        foreach (XmlNode nd in ndtmp.ChildNodes)
                        {
                            var attr = nd.Attributes;
                            if (nd.Name == "chat")
                            {
                                come2 = String.Format(nd.InnerText);
                            }
                        }
                    }
                    this.dataGridView1.Rows.Add(come2);
                    //これより下にbreak;はありますが省略しています
                }
記事No.57446 のレス /過去ログ96より / 関連記事表示
削除チェック/

■88576  Re[7]: フォームの連続的な書き換えに関して
□投稿者/ パヨンパヨン -(2018/09/08(Sat) 19:27:53)

    ありがとうございます。

    確認したところ、ご指摘の通り、
    frm.BeginInvoke(Sub() SetText(Form1.TextBox3, i))

    としてあるのがエラーの原因で、
    frm.BeginInvoke(Sub() SetText(Me.TextBox3, i))
    とするとうまくいきました。



    > 【問題点1】ラムダ式の遅延評価と変数のスコープ

    ラムダ式のことは理解しています。
    ご指摘ありがとうございます。


    > 【問題点2】既定のフォームインスタンス Form1 と明示的インスタンス frm

    > Form1.TextBox3 を扱うために、何故 frm の BeginInvoke を呼び出しているのでしょうか。

    これはフォーム上に全てのコードを書いてしまうと長くなって読みづらいので
    普段は、別のモジュール上にコードを書いているためです。
    他のコードをコピーして流用したため、残ってしまいました。


    > 【問題点3】オブジェクトの管理

    そうですね、Taskの中でエラーが起こると、
    どの箇所にエラーが起きたのか明示的に表示されないので
    不便です。




    念のため、再度確認なのですが、

    ''方法1
    Invoke(New Action(Of String, String, Color)(AddressOf 複数の引数), x, y, z)

    '方法2
    'Invoke(Sub() 複数の引数(x, y, z))

    ''方法3
    'Invoke(New MethodInvoker(
    ' Sub()
    ' TextBox1.Text = x
    ' TextBox2.Text = y
    ' TextBox1.BackColor = z
    ' End Sub))


    という三つの方法をご提示くださりましたが、
    これらはどれを使っても計算速度やPC負荷などに全く違いは見られないと考えて良いのでしょうか?
    単純に考えると

    '方法2
    'Invoke(Sub() 複数の引数(x, y, z))

    がもっともコードが短く単純なので、ベストチョイスのように思えますが、
    使い分けなどがございますでしょうか?

記事No.88546 のレス /過去ログ152より / 関連記事表示
削除チェック/

■88583  Re[8]: フォームの連続的な書き換えに関して
□投稿者/ 魔界の仮面弁士 -(2018/09/08(Sat) 23:13:39)
    こちらで実験すると、再現するどころかエラーになってしまったので、
    ちょっと悩んでいたのですが、投稿いただいた質問コードは
    実際のコードと同一というわけではなかったのですね。

    No88576 (パヨンパヨン さん) に返信
    > としてあるのがエラーの原因で、
    > frm.BeginInvoke(Sub() SetText(Me.TextBox3, i))
    > とするとうまくいきました。

    いずれにせよ、マルチスレッドを意識したコードにするのなら、
    フォームの「既定のインスタンス」を使わないコーディングに慣れておいた方が良いですよ。


    >>【問題点1】ラムダ式の遅延評価と変数のスコープ
    > ラムダ式のことは理解しています。
    一番最初の質問である
     「最後に代入された値しか表示されません。」
    の要因かとも思ったので、一応指摘させていただきました。


    >>【問題点2】既定のフォームインスタンス Form1 と明示的インスタンス frm
    >>Form1.TextBox3 を扱うために、何故 frm の BeginInvoke を呼び出しているのでしょうか。
    > これはフォーム上に全てのコードを書いてしまうと長くなって読みづらいので

    Form に書くべき処理は、本来はそのフォーム自身のふるまいだけなので、
    ビジネスロジック等は、別の Class や Module に分けたりしますね。

    それでも Form のコードが多くなってしまう場合には、
    Partial で分割するという方法もあるようです。


    > 普段は、別のモジュール上にコードを書いているためです。
    > 他のコードをコピーして流用したため、残ってしまいました。

    frm が Shared な変数あるいは Module 上の変数だとすると、
    同一フォームの複数インスタンスが生成されていた場合には
    都合が悪いかも知れません。


    >> ''方法3
    > 'Invoke(New MethodInvoker(
    > ' Sub()
    ちなみにこれは、
    Invoke(New Action(Sub()

    Invoke(Sub()
    でも OK です。いずれも同じ意味になります。

    ※上記は MyBase.Invoke の意味なので、Module 等に記述する場合には
     対象コントロールの Invoke メソッドの呼び出しに変更する必要があります。



    > '方法2
    > 'Invoke(Sub() 複数の引数(x, y, z))
    > がもっともコードが短く単純なので、ベストチョイスのように思えますが、

    先の例の場合、「Private Sub 複数の引数(…)」を用意していましたよね。

    クラスやモジュールに、再利用性の無い(かつ、比較的短い処理の)メソッドが
    多数存在してしまうことを嫌うような場合においては、方法3 のように、
    ラムダ式やローカル関数で済ませる場合もあるということです。

    ちなみにローカル関数は VB には無い機能です。(C#7.0 以降)



    > という三つの方法をご提示くださりましたが、
    > これらはどれを使っても計算速度やPC負荷などに全く違いは見られないと考えて良いのでしょうか?
    厳密にいえば、まったく同じコンパイル結果になるわけではありません。
    パフォーマンス差については、各種条件によってかわってくるものなので、
    ご自身で実際に検証頂いた上でご判断ください。

    ただ、手順や仕組みはどうあれ、同じ結果を得られるのであれば、
    その時々で使いやすいものを選んでいけば良いのではないでしょうか。


    で。直接的な速度差はさておき、コンパイル結果がもっとも単純となるのは方法1 です。

    >> '方法1
    >> Invoke(New Action(Of String, String, Color)(AddressOf 複数の引数), x, y, z)
    これは匿名型等は必要とせず、元のコードのとおりに、
     Dim act As Action(Of String, String, Color) = AddressOf Me.複数の引数
     MyBase.Invoke(act, New Object() { x, y, z })
    のような形にコンパイルされるだけで済みます。
    (実際には act という変数が作られるわけではないですが、説明のために付加しています)


    しかし方法2 や 3 の場合は、局所変数である x/y/z の 3 つ(それと、Me を含めた 4 つ)の値を
    フィールド変数として閉包した匿名クロージャと、匿名デリゲートが作成されることになります。

    たとえば
    >> '方法2
    >> Invoke(Sub() 複数の引数(x, y, z))
    というコードのコンパイル結果は、Visual Basic 的な文法イメージでいうと
     Dim closure As New 匿名型() With { .[Self] = Me, .[x] = x, .[y] = y, .[z] = z }
     Dim act As 匿名デリゲート = AddressOf closure.Lamda
     MyBase.Invoke(act, New Object() { x, y, z })
    のようになるため、手順的には方法 1 よりも一手間増えます。

    また、これの呼び出しのために
     Partial Class Form1
      Friend Delegate Sub 匿名デリゲート()
      Friend Class 匿名型
       Public [Self] As Form1
       Public [x] As String
       Public [y] As String
       Public [z] As Color
       Friend Sub Lamda()
        Me.[Self].複数の引数(Me.[x], Me.[y], Me.[z])
       End Sub
      End Class
     End Class
    に相当する物が内部的に作られることにもなりますね。
記事No.88546 のレス /過去ログ152より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -