ちょっとした計算をするためだけの、お手軽な計算器ソフトです。(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 をダブルクリックし、起動してください。
lightcalc
ダウンロードの際に、次のような警告が出ます。^で、継続、ダウンロードした上で、
アンチウイルスソフト(右クリックメニューで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
コメント