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

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

C# と VB.NET の入門サイト

Re[9]: 電卓演算の仕方


(過去ログ 58 を表示中)

[トピック内 24 記事 (1 - 20 表示)]  << 0 | 1 >>

■33225 / inTopicNo.1)  電卓演算の仕方
  
□投稿者/ nao (1回)-(2009/02/23(Mon) 20:18:29)

分類:[ASP.NET (VB)] 

ASP.NET VB2005を使用しています。


電卓を作成してるのですが、VBであれば配列ができるので問題なかったのですが
ASP.NETで作成するとコントロール配列ができないため
演算のやり方がうまくできません。

ご教示ください。



Dim r1 As Double '数値記憶
Dim r2 As Double
Dim SFlag As Boolean '数字キー
Dim EFlag As Boolean '演算キー
Dim Enzan As Integer '演算記憶
Const NONE = -1
Const Plus = 0
Const Min = 1
Const Mul = 2
Const Div = 3
Const EQ = 4

Protected Sub BtnEnzan_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnEnzan3.Click, BtnEnzan4.Click, BtnEnzan1.Click, BtnEnzan2.Click, BtnEnzan0.Click

Dim Index As Integer

If SFlag = True Then
If EFlag = False Then
r1 = Val(txt.Text)
EFlag = True
Else
r2 = Val(txt.Text)

End If
If Index <> EQ Then '=以外
Keisan()
Enzan = Index
r2 = 0
Else
Keisan()
EFlag = False
End If
txt.Text = Trim(Str(r1)) '結果
ElseIf Index = EQ Then
If r2 = 0 Then
r2 = r1

End If
Keisan()
txt.Text = Trim(Str(r1))
EFlag = False
Else
r1 = Val(txt.Text)
r2 = 0
Enzan = Index
EFlag = True
End If

SFlag = False
End Sub

Private Sub Keisan()
If Enzan = Plus Then
r1 = r1 + r2
ElseIf Enzan = Min Then
r1 = r1 - r2
ElseIf Enzan = Mul Then
r1 = r1 * r2
ElseIf Enzan = Div Then
r1 = r1 / r2

End If
End Sub



Enzanに演算を数値にて格納しようと思っているのですが、格納することができません。
引用返信 編集キー/
■33228 / inTopicNo.2)  Re[1]: 電卓演算の仕方
□投稿者/ Jitta on the way (276回)-(2009/02/23(Mon) 21:38:39)
電卓 site:wankuma.com

で検索
引用返信 編集キー/
■33229 / inTopicNo.3)  Re[2]: 電卓演算の仕方
□投稿者/ nao (2回)-(2009/02/23(Mon) 23:00:08)
No33228 (Jitta on the way さん) に返信
> 電卓 site:wankuma.com
>
何回も見てるんですが・・・わからなかったんです。。。
引用返信 編集キー/
■33240 / inTopicNo.4)  Re[1]: 電卓演算の仕方
□投稿者/ επιστημη (1769回)-(2009/02/24(Tue) 09:37:53)
επιστημη さんの Web サイト
> Protected Sub BtnEnzan_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnEnzan3.Click, BtnEnzan4.Click, BtnEnzan1.Click, BtnEnzan2.Click, BtnEnzan0.Click

引数 sender がイベントを発した張本人です。
senderをButtonなりControlにキャストすればText,Tag等の
プロパティが取得できます。

引用返信 編集キー/
■33241 / inTopicNo.5)  Re[2]: 電卓演算の仕方
□投稿者/ naoko (4回)-(2009/02/24(Tue) 10:00:05)
No33240 (επιστημη さん) に返信

>
> 引数 sender がイベントを発した張本人です。
> senderをButtonなりControlにキャストすればText,Tag等の
> プロパティが取得できます。
>
超初心者なもので大変恐縮なのですが・・・
プロパティを取得してどのようにすればよろしいのでしょうか?

EnzanにBtnEnzanの演算の値(+:0、-:1等)を格納させ、どの演算子を押したかを
認識させたいのです。
質問の仕方から、間違っておりましたら申し訳ございません。
引用返信 編集キー/
■33242 / inTopicNo.6)  Re[3]: 電卓演算の仕方
□投稿者/ よねKEN (274回)-(2009/02/24(Tue) 10:09:08)
>>引数 sender がイベントを発した張本人です。
>>senderをButtonなりControlにキャストすればText,Tag等の
>>プロパティが取得できます。
>>
> 超初心者なもので大変恐縮なのですが・・・
> プロパティを取得してどのようにすればよろしいのでしょうか?

例えば、BtnEnzan0〜BtnEnzan4のTagプロパティに予め0〜4をセットしてあるとします。
クリックされたButtonオブジェクトを取得できれば、BtnEnzan_Clickメソッドの最初で、

Index = DirectCast(クリックされたButton.Tag, Integer)

とか処理できますよね。

引用返信 編集キー/
■33243 / inTopicNo.7)  Re[4]: 電卓演算の仕方
□投稿者/ επιστημη (1770回)-(2009/02/24(Tue) 10:27:46)
επιστημη さんの Web サイト
2009/02/24(Tue) 10:29:13 編集(投稿者)

> 例えば、BtnEnzan0〜BtnEnzan4のTagプロパティに予め0〜4をセットしてあるとします。
> ...
> とか処理できますよね。

あるいはたとえば"加算"のキートップに"+"と刻印されているのなら

If クリックされたボタン.Text = "+" Then
  ' 加算ボタンが押されたときの処理
End If

とかね。

# 見てくれの変更がコードに影響を及ぼすのであんまオススメしないけど

引用返信 編集キー/
■33247 / inTopicNo.8)  Re[5]: 電卓演算の仕方
□投稿者/ naoko (5回)-(2009/02/24(Tue) 14:44:02)
No33243 (επιστημη さん) に返信
> 2009/02/24(Tue) 10:29:13 編集(投稿者)
>
>
> あるいはたとえば"加算"のキートップに"+"と刻印されているのなら
>
> If クリックされたボタン.Text = "+" Then
>   ' 加算ボタンが押されたときの処理
> End If
>
> とかね。
>
> # 見てくれの変更がコードに影響を及ぼすのであんまオススメしないけど
>
ありがとうございます。
しかし、その処理は
    Private Sub Keisan()
If Enzan = plus Then
r1 = r1 + r2
ElseIf Enzan = min Then
r1 = r1 - r2
ElseIf Enzan = mul Then
r1 = r1 * r2
ElseIf Enzan = div Then
r1 = r1 / r2
て記しちゃってるんだけど・・・。
これとはまた別個ってことでしょうか?
引用返信 編集キー/
■33248 / inTopicNo.9)  Re[6]: 電卓演算の仕方
□投稿者/ επιστημη (1771回)-(2009/02/24(Tue) 15:05:18)
επιστημη さんの Web サイト
2009/02/24(Tue) 15:05:39 編集(投稿者)
だーかーらー....

各ボタンのTagに plus, min, mul, div を埋め込んでおけば
No33242 方式でやれるし、

If クリックされたボタン.Text = "+" Then
 Enzan = plus
Else If クリックされたボタン.Text = "-" Then
  Enzan = min
Else If クリックされたボタン.Text = "*" Then
  Enzan = mul
Else If クリックされたボタン.Text = "/" Then
  Enzan = div
End If
Keisan()

てやったっていいじゃない。

引用返信 編集キー/
■33249 / inTopicNo.10)  Re[4]: 電卓演算の仕方
□投稿者/ naoko (6回)-(2009/02/24(Tue) 15:14:44)
No33242 (よねKEN さん) に返信
>> 例えば、BtnEnzan0〜BtnEnzan4のTagプロパティに予め0〜4をセットしてあるとします。
> クリックされたButtonオブジェクトを取得できれば、BtnEnzan_Clickメソッドの最初で、
>
> Index = DirectCast(クリックされたButton.Tag, Integer)
>
> とか処理できますよね。
>
Tagに0〜4をセットし
> Index = DirectCast(BtnEnzan.Tag, Integer)

とすると、BtnEnzan.Tagに破線が出てButtonのメンバではありませんとエラーメッセージがでてしまいます(><)

引用返信 編集キー/
■33252 / inTopicNo.11)  Re[5]: 電卓演算の仕方
□投稿者/ επιστημη (1772回)-(2009/02/24(Tue) 15:27:30)
επιστημη さんの Web サイト
>>Index = DirectCast(BtnEnzan.Tag, Integer)
> とすると、BtnEnzan.Tagに破線が出てButtonのメンバではありませんとエラーメッセージがでてしまいます(><)

BtnEnzan は sender を Button にキャストしたものですか?
コードみせてください。

引用返信 編集キー/
■33253 / inTopicNo.12)  Re[7]: 電卓演算の仕方
□投稿者/ naoko (7回)-(2009/02/24(Tue) 15:28:05)
No33248 (επιστημη さん) に返信
> 2009/02/24(Tue) 15:05:39 編集(投稿者)
>
> だーかーらー....
>
> 各ボタンのTagに plus, min, mul, div を埋め込んでおけば
> No33242 方式でやれるし、
>
> If クリックされたボタン.Text = "+" Then
>  Enzan = plus
> Else If クリックされたボタン.Text = "-" Then
> Enzan = min
> Else If クリックされたボタン.Text = "*" Then
> Enzan = mul
> Else If クリックされたボタン.Text = "/" Then
> Enzan = div
> End If
> Keisan()
>
演算キーを押すとテキストBoxに”0”が表示され、やっぱり計算が出来ませんでした。
書き方が悪いんだとは思うんですが・・・
επιστημη さんのように記述しているのですが、何がいけないのかわからない状態です。

引用返信 編集キー/
■33254 / inTopicNo.13)  Re[6]: 電卓演算の仕方
□投稿者/ naoko (8回)-(2009/02/24(Tue) 15:31:16)
No33252 (επιστημη さん) に返信
> >>Index = DirectCast(BtnEnzan.Tag, Integer)
>>とすると、BtnEnzan.Tagに破線が出てButtonのメンバではありませんとエラーメッセージがでてしまいます(><)
>
> BtnEnzan は sender を Button にキャストしたものですか?
> コードみせてください。
>
キャストの意味がわかってなくすいませんが・・・

Protected Sub BtnEnzan_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnEnzan3.Click, BtnEnzan4.Click, BtnEnzan1.Click, BtnEnzan2.Click, BtnEnzan0.Click
Dim Index As Integer
Index = DirectCast(BtnEnzan.Tag, Integer)
引用返信 編集キー/
■33255 / inTopicNo.14)  Re[7]: 電卓演算の仕方
□投稿者/ επιστημη (1773回)-(2009/02/24(Tue) 15:36:30)
επιστημη さんの Web サイト
> Protected Sub BtnEnzan_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnEnzan3.Click, BtnEnzan4.Click, BtnEnzan1.Click, BtnEnzan2.Click, BtnEnzan0.Click
>         Dim Index As Integer
>         Index = DirectCast(BtnEnzan.Tag, Integer)

senderがイベントを発した張本人だから、なんとかしてsenderをButtonに見せかけなきゃいかんの。
そのためにキャスト(DirectCast)するんす。

Protected Sub BtnEnzan_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnEnzan3.Click, BtnEnzan4.Click, BtnEnzan1.Click, BtnEnzan2.Click, BtnEnzan0.Click
     Dim BtnEnzan As Button = DirectCast(sender, Button) ' ← これでsenderがButtonになったから
     Dim Index As Integer = DirectCast(BtnEnzan.Tag, Integer) ' Tagが拾える。TagはObjectなので再度Integerにキャスト。

引用返信 編集キー/
■33259 / inTopicNo.15)  Re[8]: 電卓演算の仕方
□投稿者/ .SHO (694回)-(2009/02/24(Tue) 15:52:44)
んーもう、なんだかよくわからんけど、ソースがばっちいから
動いてるVBの方をリファクタリングしてからにした方がいいんじゃないですか?

そもそも、VBの時点で、この処理に配列必要ないんじゃない?
引用返信 編集キー/
■33260 / inTopicNo.16)  Re[8]: 電卓演算の仕方
□投稿者/ naoko (9回)-(2009/02/24(Tue) 15:55:16)
No33255 (επιστημη さん) に返信
> senderがイベントを発した張本人だから、なんとかしてsenderをButtonに見せかけなきゃいかんの。
> そのためにキャスト(DirectCast)するんす。
>
> Protected Sub BtnEnzan_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnEnzan3.Click, BtnEnzan4.Click, BtnEnzan1.Click, BtnEnzan2.Click, BtnEnzan0.Click
> Dim BtnEnzan As Button = DirectCast(sender, Button) ' ← これでsenderがButtonになったから
> Dim Index As Integer = DirectCast(BtnEnzan.Tag, Integer) ' Tagが拾える。TagはObjectなので再度Integerにキャスト。

丁寧に有難うございます。
が、やはりDirectCast(BtnEnzan.Tag, Integer)の部分で破線がでて
「'Tag'は'System.Web.UIWebContlors.Button'のメンバではありません。」と出てしまいます。
引用返信 編集キー/
■33261 / inTopicNo.17)  Re[8]: 電卓演算の仕方
□投稿者/ いしだ (191回)-(2009/02/24(Tue) 15:55:27)
ASP.NETの動作原理を理解していますか?

ポストバックの度に、ページインスタンスが生成されます。
なのでボタンを押す前と、押した後に表示されたページはインスタンスが異なります。

Dim r1 As Double '数値記憶
Dim r2 As Double
Dim SFlag As Boolean '数字キー
Dim EFlag As Boolean '演算キー
Dim Enzan As Integer '演算記憶

今の実装では、これらの変数に値を記憶しておく事は出来ませんよ。

みなさん、ひょっとしてASP.NETだという事をお忘れかも。。。
引用返信 編集キー/
■33262 / inTopicNo.18)  Re[9]: 電卓演算の仕方
□投稿者/ επιστημη (1775回)-(2009/02/24(Tue) 15:59:12)
επιστημη さんの Web サイト
> んーもう、なんだかよくわからんけど、ソースがばっちいから
> 動いてるVBの方をリファクタリングしてからにした方がいいんじゃないですか?

「その変数名をなんとかしろ!」とは思う ^^;
「関数の外にある変数を極力減らせ」もあわせて。

とはいえ押されたボタンを識別できんことには先に進まん気もするで、
とりあえず4つのボタンそれぞれにハンドラ起こしてはどうでしょねぇ。
そーすりゃ識別もヘッタクレもないので。

引用返信 編集キー/
■33263 / inTopicNo.19)  Re[9]: 電卓演算の仕方
□投稿者/ επιστημη (1776回)-(2009/02/24(Tue) 16:00:34)
επιστημη さんの Web サイト
> みなさん、ひょっとしてASP.NETだという事をお忘れかも。。。

アッーーーーーー!!

引用返信 編集キー/
■33264 / inTopicNo.20)  Re[9]: 電卓演算の仕方
 
□投稿者/ naoko (10回)-(2009/02/24(Tue) 16:02:18)
No33259 (.SHO さん) に返信
> んーもう、なんだかよくわからんけど、ソースがばっちいから
> 動いてるVBの方をリファクタリングしてからにした方がいいんじゃないですか?
>
> そもそも、VBの時点で、この処理に配列必要ないんじゃない?

汚くてすいません。
簡潔に書くことすらも出来る状況じゃなく・・・。
配列すると簡単だということだったものですから、配列を使いたかったんですが
ASPはできないようで・・・。
演算部分だけだと思うんですが、他にも間違ってる部分があるのでしょうか?
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -