烏賊先生のプログラミング道場
烏賊の呟き

日記風プログラミング雑記

私の人生を大きく変えたプログラミングの有用性の認知と其の普及に日々愉しく過ごし、自身プログラミング三昧の生活を送って居ますが、其の中で感じた事等を、不規則 日記風に気儘に書き綴る事に仕ました。

主に、講座や資料に項を設けて纏める程の事は無い様な事を、散文風に書き綴る積もりです。孰れ、纏まれば、項を設ける予定ですが、今は只、思い付くが儘に、書き散ら して行く事に成ると思います。

猶、右図は、自画像ですが、少し格好良く成り過ぎました (^o^)。
烏賊自画像

RichTextBoxコントロール
平方根の手計算


 RichTextBoxコントロール 2011年09月18日

RichTextBoxコントロールは、Visual Basic 6.0では、追加コンポーネントでしたが、Visual Basic.NET(7.0)以降では、コモンコントロールに分類される様に成りました。 其れ丈、テキスト入力域にも、カラフルさが求められる様に成ったと謂う事でせう。

併し、此のRichTextBoxコントロールは、プロパティウィンドウに、AllowDropプロパティが見当たりません。亦、イベント一覧でも、DragEnterやDragDropのイベントが有り ません。テキストエディタ等を作成する場合、此処に文書ファイル等をドラッグして表示させると謂う操作は、今では、当たり前の操作ですが、此れでは、ドラッグ&ドロッ プの操作が出来ないのかと思って了います。

併し、実際には、RichTextBoxコントロールのメンバ一覧を観ると、AllowDropプロパティも、DragEnterやDragDropのイベントも存在します。詰まり、実際には、RichTextBox コントロールにドラッグ&ドロップ操作は可能なのです。

RichTextBoxコントロールにドラッグ&ドロップ操作を実装するには、先ず、フォームのLoadイベントで、下記の様に、AllowDropプロパティをTrueに設定し、DragEnterと DragDropのイベントハンドラを追加します(下記では、RichTextBoxコントロールに、rtfEditorと謂う名前を付けて居ます)。
rtfEditor.AllowDrop = True     ' ドラッグ&ドロップの許可
AddHandler rtfEditor.DragEnter, AddressOf rtfEditor_DragEnter
AddHandler rtfEditor.DragDrop, AddressOf rtfEditor_DragDrop
イベントハンドラを追加する前に、下記のイベントプロシージャ(メソッド)を記述して置くと、AddressOf入力後、プロシージャの一覧が表示されるので、便利です。

イベントプロシージャ(メソッド)は、下記の様に成ります。イベント引数eのデータ型は、System.Windows.Forms.DragEventArgsです。
' リッチテキストボックスの領域内にドラッグされた時の処理
Private Sub rtfEditor_DragEnter(ByVal sender As System.Object, _
  ByVal e As System.Windows.Forms.DragEventArgs)
  
  If (e.Data.GetDataPresent(DataFormats.FileDrop)) Then
    e.Effect = DragDropEffects.All
  Else
    e.Effect = DragDropEffects.None
  End If
End Sub

' リッチテキストボックスの領域内でドロップされた時の処理
Private Sub rtfEditor_DragDrop(ByVal sender As Object, _
  ByVal e As System.Windows.Forms.DragEventArgs)
  
  Dim F() As String = e.Data.GetData("FileDrop", False)

  If (F IsNot Nothing) AndAlso (F.Length > 0) Then
    ' ファイルの読込等の処理を記述
  End If
End Sub
猶、プロパティウィンドウやイベント一覧に表示されない現象は、Visual Basic 2010 Expressでも同じです。

 平方根の手計算 2011年09月19日

先日、アルゴリズムの講座で、教材には無い『平方根の手計算』の話を仕て、其の遣り方を教えて、プログラム化する様に指示した処、全員が30分以内にプログラムを完成 して下れました。MathクラスのSqrtメソッドを使用すれば、簡単に実現出来る事ですが、常々、組込メソッドとは、誰かが其のコードを書いて下れた物で有り、有り難く使 用させて貰うのは良いが、自分でも其の様なコードが書ける様に成らなくては成らないと謂い聴かせて居る私と仕ては、結構嬉しいです。

私も、プログラム例を書いて観ましたので、下記に其れを記して置きます。色々な記述法が考えられますが、此処では、解を文字列で生成する方法を採りました。
Public Class SquareRoot

  ' ボタン(手計算)がクリックされた時の処理
  Private Sub btnHand_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles btnHand.Click

    Dim S As String = txtNumber.Text
    Dim Q As Double
    If Double.TryParse(S, Q) Then
      Dim H, L, A As String   ' 整数部、小数部、結合文字列
      Dim D As Integer        ' 小数点位置
      Dim P As Integer        ' 着目位置
      Dim I, J As Integer     ' ループ用
      Dim N, M As Long        ' 被除数、除数
      Dim T As String = ""    ' 表示用

      ' 整数部と小数部の取得
      If S.Contains(".") Then
        H = S.Substring(0, S.IndexOf("."))
        L = S.Substring(S.IndexOf(".") + 1)
      Else
        H = S
        L = ""
      End If

      ' 整数部を偶数桁に整形
      If Not (H.Length Mod 2 = 0) Then
        H = "0" & H
      End If

      ' 小数部を偶数桁に整形
      If Not (L.Length Mod 2 = 0) Then
        L = L & "0"
      End If

      ' 小数点位置の取得
      D = H.Length \ 2

      ' 整数部と小数部の結合
      A = H & L

      ' 平方根の手計算(17桁)
      P = 0 : N = 0 : M = 0
      For I = 1 To 17
        N = N * 100
        M = M * 10
        If P < A.Length Then
          N += Integer.Parse(A.Substring(P, 2))
          P += 2
        End If
        For J = 9 To 0 Step -1
          If (M + J) * J <= N Then
            Exit For
          End If
        Next
        T &= J.ToString()
        If I = D Then
          T &= "."
        End If
        N -= ((M + J) * J)
        M += (J * 2)
      Next
      lblHand.Text = T
    End If
    txtNumber.Focus()
    txtNumber.SelectAll()
  End Sub

  ' ボタン(メソッド)がクリックされた時の処理
  Private Sub btnMethod_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles btnMethod.Click

    Dim S As String = txtNumber.Text
    Dim Q As Double
    If Double.TryParse(S, Q) Then
      Q = Math.Sqrt(Double.Parse(S))
      lblMethod.Text = Q.ToString()
    End If
    txtNumber.Focus()
    txtNumber.SelectAll()
  End Sub
End Class
併し、最近は、此の様な事を、中学校や高校で教えない様です。小学校でも、鶴亀算や流水算等を教えて居ない様ですし、考える力が低下して居ると嘆く前に、此の辺りの 事を考え直した方が良いのでは無いでせうか。