軽量、低機能な計算ソフト=小電卓ん(こでんたくん)

ソフト開発 VB エクセル

ちょっとした計算をするためだけの、お手軽な計算器ソフトです。(Windows用)

+(加算) -(減算) * (乗算) / (除算) % (剰余) だけ

しかできません。

括弧 ( ) は使えます。

% については、注意が必要です。被演算子が左右とも整数である必要があります。そうでない場合は、答え欄に「式に誤り!」と表示されます。
しかも、(2+8)%3 や、 18/9+8%3 は大丈夫ですが、(18/9+8)%3 は、「式に誤り!」となります。
どうしても、 (18/9+8)%3 を計算したい場合は、まず、(18/9+8) を計算して、答え欄をクリックしますと、答えがコピーされますので、それを計算式欄に貼り付けて、 10%3 と入力する、という方法もあります。使う機会は、まず、ないでしょうが。

常に最前面ウインドウ、でもタスクバーにしまうことも可

起動画面は、次のようです。これが、常に最前面に表示されます。邪魔になったら、Control + ↓ で、タスクバーにしまってください。

Enterして、計算されます。その画面は、次のようです。

右クリックメニュー、ショートカット

式が保存されたリストボックスで、右クリックすると、メニューが現れます。

Control + W で終了します。

Control + ↓ で、最小化されて、タスクバーにしまわれます。

終了する時のウインドウの位置を winpos.txt に保存し、次に起動した時に、その位置になります。

保存された式を、ダブルクリックすると、上に式と答えがセットされます。

System.Data.DataTable を使って計算

System.Data.DataTable を使っての計算ですので、上述のように、簡単な計算しかできません。

難しい計算は、エクセルや、ウィンドウズ付属の電卓などを、ご利用ください。ちょっとした計算をしたい時に、そうしたものが、大げさで、扱いにくく、すぐ隠れてしまうので、手元に、本物の電卓を置こうかと、考えました。が、それも邪魔なので、考え直して、この「軽量、低機能、小電卓ん」を作りました。

「小電卓ん」 のダウンロード

lightcalcフォルダーには、

のようにファイルが入っています。解凍して適当な場所に置いて、小電卓ん=lightcalc.exe をダブルクリックし、起動してください。

ダウンロードの際に、次のような警告が出ます。^で、継続、ダウンロードした上で、

アンチウイルスソフト(右クリックメニューでMicorsoft Definderなど)でスキャンしてから、お使い下さい。Windows PC 専用のソフトです。ただ、残念なことに、起動するまでの時間が、かなりかかります。スタートアップにショートカットをいれておいて、常駐させておくと便利です。

試してみて、どうだったか、ここをこうしたら良いのではないか、とか、ご意見、ご感想をいただければ幸いです。コメント欄、または「お問い合わせ」からお願いします。

「小電卓ん」 のコード

VB.NET のコードは、次のようなものです。安心していただけたら、ご利用ください。

Imports System.ComponentModel

Public Class Form1

    Private Const HWND_TOPMOST = -1
    Private Const HWND_NOTOPMOST = -2
    Private Const SWP_NOSIZE = &H1
    Private Const SWP_NOMOVE = &H2
    Private Const ERRORMSG = "ERROR"
    Private Const WINDOWPOS_FILE_NAME = "winpos.txt"
    Dim lb_index = -1

    Private Declare Function SetWindowPos Lib "user32" _
    (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        SetWinPos()
        FormPosition()
    End Sub
    Private Sub Form1_Activated(sender As Object, e As EventArgs) Handles Me.Activated
        ActiveControl = TextBox1
        TextBox1.SelectAll()
        ListBox1.SelectedIndex = -1
    End Sub
    Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
        WriteWinPos()
    End Sub
    Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown
        Dim calcval As String

        If e.KeyValue = Keys.Enter Then
            calcval = (Calc(TextBox1.Text))
            If calcval = ERRORMSG Then
                Label1.Text = "式に誤り!"
                Exit Sub
            End If
            Label1.Text = calcval
            ListBox1.Items.Insert(0, TextBox1.Text + "=" + Label1.Text)
            TextBox1.SelectAll()
            Exit Sub
        End If
        If e.KeyCode = Keys.Down And e.Control Then
            Me.WindowState = FormWindowState.Minimized
            Exit Sub
        End If
        If e.KeyCode = Keys.W And e.Control Then
            Me.Close()
            Exit Sub
        End If
    End Sub
    Private Sub ListBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles ListBox1.MouseDown
        If e.Button = MouseButtons.Right Then
            If ListBox1.IndexFromPoint(e.Location) <> ListBox.NoMatches Then
                lb_index = ListBox1.IndexFromPoint(e.Location) '式をコピーToolStripMenuItem_Click
            End If
        End If
    End Sub
    Private Sub ListBox1_DoubleClick(sender As Object, e As EventArgs) Handles ListBox1.DoubleClick
        Dim t = "", l = ""

        SplitFormula(ListBox1.SelectedItem, t, l)
        TextBox1.Text = t
        Label1.Text = l
        ActiveControl = TextBox1
        TextBox1.Select(TextBox1.Text.Length, 0)
        ListBox1.SelectedIndex = -1
    End Sub
    Private Sub ListBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles ListBox1.KeyDown
        If e.KeyCode = Keys.Down And e.Control Then
            Me.WindowState = FormWindowState.Minimized
        End If
    End Sub
    Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
        Clipboard.SetText(Label1.Text)
        TextBox1.SelectAll()
    End Sub
    Private Sub 式をコピーToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 式をコピーToolStripMenuItem.Click
        If lb_index < 0 Then Exit Sub
        Clipboard.SetText(ListBox1.Items(lb_index))
        lb_index = -1
    End Sub
    Private Sub 式を削除ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 式を削除ToolStripMenuItem.Click
        If lb_index < 0 Then Exit Sub
        ListBox1.Items.RemoveAt(lb_index)
        lb_index = -1
    End Sub
    Private Sub FormPosition()
        SetWindowPos(Me.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE)
    End Sub
    Private Sub SetWinPos()
        If (Not (System.IO.File.Exists(WINDOWPOS_FILE_NAME))) Then 'ファイルがなければパス
            Exit Sub
        End If

        Dim sr As New System.IO.StreamReader(WINDOWPOS_FILE_NAME)
        Dim l, t As Integer
        t = sr.ReadLine()
        l = sr.ReadLine()
        sr.Close()
        Me.Location = New Point(t, l)
    End Sub
    Private Sub WriteWinPos()
        If (Me.Left + Me.Top) < -100 Then 'windowsで閉じられたら書かない
            Exit Sub
        End If

        Dim sw As New System.IO.StreamWriter(WINDOWPOS_FILE_NAME, False) 'Falseは上書き、ファイルがなければ作ってくれる
        sw.WriteLine(Me.Left)
        sw.WriteLine(Me.Top)
        sw.Close()
    End Sub
    Private Function Calc(exp As String) As String
        '式を計算する
        Dim dt As New System.Data.DataTable()
        On Error GoTo wrong
        Return CStr(dt.Compute(exp, ""))
wrong:
        Return ERRORMSG
    End Function
    Private Function SplitFormula(fml, ByRef leftf, ByRef rightf)
        Const equals = "="
        Dim n

        For n = 1 To Len(fml)
            If Mid(fml, n, 1) = equals Then
                leftf = Mid(fml, 1, n - 1)
                rightf = Mid(fml, n + 1, Len(fml) - n)
                GoTo found
            End If
        Next
found:
        Return n
    End Function
End Class

コメント