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

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

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

全過去ログを検索

<< 0 >>
■21372  Re[8]: プログラマの地位って・・・
□投稿者/ シャノン -(2008/07/01(Tue) 13:14:31)
    No21369 (中吉 さん) に返信
    > ■No21345 (シャノン さん) に返信
    >>■No21331 (επιστημη さん) に返信
    > >>アタマ使ってないプログラマが多いってことでしょね。
    > >>裏を返せばプログラマにアタマ使わせない設計してんでしょね。
    >>
    >>それが良いことと考えている人もいます。
    >>馬鹿でも務まるためにはそうでなければならん、と。
    >>
    >>もうね、いっぺん死んで来いと。
    >
    > 「プログラマにアタマ使わせない設計」
    > これができれば、最高だとマジで思ってます。
    > コーダの人がほとんど何も考えず、むしろ自動でコードをはけるくらいの設計なんてまさに見果てぬ夢です。
    > ただ、本当にできるとは思っていません。
    > #プログラマとコーダをいう分け方をするのであれば、プログラマは設計する側だと思いますけれど^^;
    >
    > なので、そう考えている人に対して氏んでこいなんてとても思えません。
    > それはソフトウェア工学の敗北だと思います。
    > むしろ、設計を手掛けている人間に対してとても失礼だと思います。
    > #プログラマをバカにしている設計者がいたら、最大のdisをくらわしてやりたい気持ちは一緒です。

    実のところ、プログラマがアタマを使う必要があるかどうかという問題は2の次だと思うのです。
    問題は、いかに高品質なプログラムを書くか、です。
    その上で、同じ品質を達成できるのならば、労力は少ない方がいい、ということになると思います。

    ですから、プログラマがアタマを使わない設計にした結果、そうでない場合より品質が落ちるのに、それを認識していないのなら「逝ってよし」と言われても仕方がないと思います。
    (いい意味で)プログラマがアタマをフル回転させたのと同じ結果を、そうしなくとも得られるという見込みがあるのならば、その時は省エネを追求すればいいでしょう。
    が、悲しいかな、後者というのはかなーり少ないんじゃないかと思うわけです。
記事No.21321 のレス /過去ログ41より / 関連記事表示
削除チェック/

■57455  Re[1]: HTTPのPOST
□投稿者/ shu -(2011/02/28(Mon) 10:33:18)
    No57454 (robrob さん) に返信

    (1)req.SendChunked = trueとしない場合はうまくいくのでしょうか?
    (2)受信側はちゃんと対応されているのでしょうか?
記事No.57454 のレス /過去ログ96より / 関連記事表示
削除チェック/

■88050  Re[1]: IFの中をimage同士でつなぐ
□投稿者/ shu -(2018/07/31(Tue) 07:09:27)
    No88049 (y3 さん) に返信
    >
    > 本当に初心者ですが優しい方教えてくれたら幸いです。。
    >
    > If hontai(0).tag = hontai(3).tag And hontai(3) = hontai(6).tag Then
    >    Label2.Text = CDec(Label2.Text) + 150
    > end if
    >
    > とやりたいのですが、
    > '演算子 '=' は 型 'Bitmap' と 'Nothing' に対して定義されていません。'
    > と出てしまいます。どうすればいいでしょうか?

    比べているものが同じものであるのなら = を is にすればよいです。
記事No.88049 のレス /過去ログ151より / 関連記事表示
削除チェック/

■88567  Re[4]: フォームの連続的な書き換えに関して
□投稿者/ パヨンパヨン -(2018/09/08(Sat) 13:06:20)
    ありがとうございます。
    
    こちらの勘違いでした、
    Invokeしないとエラーになりますね。
    
    
    ところで、一つ気になったことなのですが、
    今までInvokeあるいはBeginInvokeするために、
    どこかのWebサイトに書かれていたコードを参考にして
    
        Delegate Sub delegate_SetText(i As Integer)
    
        Public SetText_dgl As New delegate_SetText(AddressOf SetText)
    
        Public Sub SetText(i As Integer)
            Form1.TextBox3.Text = i.ToString()
        End Sub
    
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    
            Task.Factory.StartNew(
                   Sub()
    
                       For i = 1 To 100
    
                           frm.BeginInvoke(SetText_dgl, i)
                           Thread.Sleep(10)
    
                       Next
    
                   End Sub)
    
        End Sub
    
    のようにして書いていました。
    
    これよりも、提示してくださった以下のコードの方が短くて良いと思います。
    
    
        Public Sub SetText(i As Integer)
            Form1.TextBox3.Text = i.ToString()
        End Sub
    
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    
            Task.Factory.StartNew(
                   Sub()
    
                       For i = 1 To 100
    
                           frm.BeginInvoke(Sub() SetText(i))
                           Thread.Sleep(10)
    
                       Next
    
                   End Sub)
    
        End Sub
    
    これらのコードは同じ挙動をすると考えて良いのでしょうか?
    
記事No.88546 のレス /過去ログ152より / 関連記事表示
削除チェック/

■88575  Re[6]: フォームの連続的な書き換えに関して
□投稿者/ 魔界の仮面弁士 -(2018/09/08(Sat) 18:58:12)
    No88568 (パヨンパヨン  さん) に返信
    > でも、この方法だと複数の引数を受け取れないようなのですが
    
    受け渡せますよ?
    
    下記の例で行くと、方法 1 がそれにあたりますが、
    方法 2 や 3 でも同じ結果が得られます。
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Task.Factory.StartNew(
            Sub()
                For i = 1 To 100
                    Dim x As String = i.ToString()
                    Dim y As String = (100 - i).ToString()
                    Dim z As Color = Color.FromArgb(255 * i \ 100, 128, 128)
    
                    ''方法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))
    
                    Thread.Sleep(10)
                Next
            End Sub)
    End Sub
    
    Private Sub 複数の引数(a As String, b As String, c As Color)
        TextBox1.Text = a
        TextBox2.Text = b
        TextBox1.BackColor = c
    End Sub
    
    
    
    > 以下のコードだとエラーになります
    
    VB バージョンが不明な点も気になりますが、それには目を瞑るとしても、
    どの部分で何というエラーになるのかぐらいは書いて欲しいです…。
    
    
    
    > frm.BeginInvoke(Sub() SetText(Form1.TextBox3, i))
    
    【問題点1】ラムダ式の遅延評価と変数のスコープ
    
    まずは引数 i。上記の変数 i はループカウンタですが、
    ラムダ式は遅延実行されるものであることに注意してください。
    (VB コンパイラのバージョンによっては、これは BC43234 の警告となります)
    
    たとえば、このようなラムダ式があったとします。
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim act(9) As MethodInvoker
            For i As Integer = 0 To 9
                act(i) = Sub() Debug.Print(i)
            Next
    
            Array.ForEach(act, Sub(method) method())
        End Sub
    
    この場合、0, 1, 2, 3, …, 8, 9 が出力されるようにも思えますが、
    実際には、すべて 10 が出力されることになるでしょう。
    
    連番で出力されるためには、
      For i As Integer = 0 To 9
        act(i) = Sub() Debug.Print(i)
      Next
      Array.ForEach(act, Sub(method) method())
    ではなく、
      For i As Integer = 0 To 9
        Dim 局所変数 As Integer = i
        act(i) = Sub() Debug.Print(局所変数)
      Next
      Array.ForEach(act, Sub(method) method())
    とする必要があります。
    
    
    
    > frm.BeginInvoke(Sub() SetText(Form1.TextBox3, i))
    
    【問題点2】既定のフォームインスタンス Form1 と明示的インスタンス frm
    
    Form1.TextBox3 を扱うために、何故 frm の BeginInvoke を呼び出しているのでしょうか。
    
    TextBox3 を操作するために、TextBox3 (またはその親フォーム等)の
    BeginInvoke/Invoke を呼ぶのではなく、それとは別のインスタンスで
    あると予想される「frm 変数」のインスタンスに対して
    実行依頼を投げている点が不自然に思えました。
    
    UI スレッドが一つしか無い場合には、結果的には正しいスレッドで動くのですが、
    それならばそもそも、わざわざ frm.BeginInvoke と書く必要は無く、
    単に BeginInvoke で良いわけで。(Button2 から呼んでいるのですから)
    
    あるいは逆に、SplashScreen 利用時などといった、
    UI スレッドが複数あるようなケースだとしたら、UI スレッドでの操作のために、
    TextBox3 (またはその親フォーム等)ではなく、別のインスタンスであると
    予想される frm に対して実行依頼を投げているの点が不自然です。
    
    
    それに、frm は「明示的にインスタンス化されたフォーム変数」であるように
    見えますが、Form1 はそうではなく、いわゆる My.Forms.Form1 相当の
    「既定のフォームインスタンス」では無いでしょうか。
    
    もしそうなら、このコードの Button2_Click が Form1 内に書かれていた場合、
    BC31139 のコンパイルエラーになりうる可能性があります。
    いずれにせよ、既定のインスタンスに頼ったコードは避けた方が良いでしょう。
    (複数のスレッドをまたぐような場面で使いたいのであれば尚の事)
    
    
    
    > frm.BeginInvoke(Sub() SetText(Form1.TextBox3, i))
    
    【問題点3】オブジェクトの管理
    
    BeginInvoke メソッドや Invoke メソッドは、スレッドセーフであることが
    保証されているため、どのスレッドから呼び出しても問題にはなりません。
    
    しかし、Form1.TextBox3 というのは、
     Friend WithEvents TextBox3 As TextBox
    というフィールド変数ですよね。
    この変数へのアクセスはスレッドセーフになっていませんので、
    望ましいコードとは言えません。
    
    
    
    ■No88567 (パヨンパヨン  さん) に返信
    > Public Sub SetText(i As Integer)
    >     Form1.TextBox3.Text = i.ToString()
    > End Sub
    
    「frm.BeginInvoke から呼ばれた SetText」は、
    frm が管理されているスレッド上で動作しますから、
    そこで呼び出された SetText 内から
    Form1 の TextBox3 フィールドにアクセスするのは OK です。
記事No.88546 のレス /過去ログ152より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -