ページ 1 / 1
Caseを使っての文字列変換
Posted: 2006年5月14日(日) 20:55
by 雷電
最近本ばかり読んで知識をため込んでいました、雷電です。
最近不思議に思っていたことがあったので、質問します。
コンボボックス内の選択技で、選ぶと、それに適応した数字に変換することはSelect Caseでできると思うのですが、、実際コードを書いてやってみても、できません。
間違っていると思われるコード [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
GetDlgItemText(hMission,GetDlgItem(hMission,ComboBox1),StrPtr(strBuf), nLength+1 )
Select Case strBuf
Case StrPtr(strBuf)="E"
Rank="0"
Case StrPtr(strBuf)="D"
Rank="1"
Case StrPtr(strBuf)="C"
Rank="2"
Case StrPtr(strBuf)="C+"
Rank="3"
Case StrPtr(strBuf)="B"
Rank="4"
Case StrPtr(strBuf)="B+"
Rank="5"
Case StrPtr(strBuf)="A"
Rank="6"
Case StrPtr(strBuf)="A+"
Rank="7"
Case StrPtr(strBuf)="S"
Rank="8"
Case Else
Rank="9"
End Select
コンパイルしても、できません。
気になったのでスレッドを立ててみました。
自分ではあってると思うのですが、違うじゃないか!と思う人、書き込みをお願いします。
Re: Caseを使っての文字列変換
Posted: 2006年5月14日(日) 21:11
by 淡幻星
Caseの条件式は、
定数しか指定できないと記憶してるんですが・・・あれ?
Helpを読むと「任意の変数、または式を指定」ってありますね。
んなばかな・・・。コンパイルエラーしたはず・・・。
なお、問題の本質ではないですが、
コード: 全て選択
StrPtr(strBuf)="C+"
という構文は間違っています。
「Byte型ポインタ(DWord型)=String型(もしくはByte型配列)」となり、変数型が不一致です。
この場合は
が正しいです。
たとえば、
今回の場合はこれで動くと思います。 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
Select Case Asc(strBuf)
Case 69 '[E]のアスキーコード
Rank="0"
Case 68 '[D]のアスキーコード
Rank="1"
Case 67 '[C]のアスキーコード
If( strBuf="C+" )Then
Rank="3"
Else
Rank="2"
EndIf
Case 66 'のアスキーコード
If( strBuf="B+" )Then
Rank="5"
Else
Rank="4"
EndIf
Case 65 '[A]のアスキーコード
If( strBuf="A+" )Then
Rank="7"
Else
Rank="6"
EndIf
Case 83 '[S]のアスキーコード
Rank="8"
Case Else
Rank="9"
End Select
Caseの条件式に、変数や式を使えるのであれば、かなり便利なんですけどね~。
・・・もしかして、最新バージョンでは使えるようになったとか?(試してません^^;)
Re: Caseを使っての文字列変換
Posted: 2006年5月14日(日) 21:14
by Mario2
多分これでいけるかなぁと・・・・・・・・ [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
GetDlgItemText(hMission,GetDlgItem(hMission,ComboBox1),StrPtr(strBuf), nLength+1 )
Select Case strBuf
Case "E"
Rank="0"
Case "D"
Rank="1"
Case "C"
Rank="2"
Case "C+"
Rank="3"
Case "B"
Rank="4"
Case "B+"
Rank="5"
Case "A"
Rank="6"
Case "A+"
Rank="7"
Case "S"
Rank="8"
Case Else
Rank="9"
End Select
これで無理なら、"Select Case strBuf" の部分を"Select Case StrPtr(strBuf)"に変えてみるとか。
検証していないので動くかどうかわかりませんが。
Posted: 2006年5月14日(日) 22:19
by 雷電
早速の返信ありがとうございます。
どちらのコードもためさせてもらいましたが、どちらもうまくいきませんでした。
Caseの使い方って、結構難しいものなんですね・・・。
もっと勉強します。。。(ーー;)
ただ、コンボボックスで選択されている英語を、取得して、それを任意の数字に置き換えることを望みとしています。
自分でやってみます。
Re: Caseを使っての文字列変換
Posted: 2006年5月14日(日) 22:37
by イグトランス
> Caseの条件式は、
定数しか指定できないと記憶してるんですが・・・あれ?
> Helpを読むと「任意の変数、または式を指定」ってありますね。
> んなばかな・・・。コンパイルエラーしたはず・・・。
AB 2.62では以下のコードが実行可能でした。もちろんs is Aが出力されます。
コード: 全て選択
Dim s As String
s = "A"
Select Case s
Case "A"
Print "s is A"
Case Else
Print "s is not A"
End Select
おそらくAB 3でできなくなったのに文書は直されずにいたということでしょう。
>イグトランスさん
Posted: 2006年5月14日(日) 22:48
by 淡幻星
イグトランスさん さんが書きました:> おそらくAB 3でできなくなったのに文書は直されずにいたということでしょう。
あ、なるほど。
ありがとうございます。スッキリしました。
そういえばAB 2.59あたりでは
コード: 全て選択
Dim i As Long
i = 10
Dim s(i) As String
なんてのも通りましたっけ。ビバ・曖昧~(笑)。
あと、スレ違いですが、Char型の導入動機の記述、どうもです。
Posted: 2006年5月15日(月) 01:41
by 高信期
Ver4でもSelect Case 文でこんな感じで条件に変数を使えますよ。
コード: 全て選択
Dim A = 1 As Long, B = 2 As Long, C = 3 As Long, D As Long
D = 2
Select Case D
Case A
Print "D = A"
Case B
Print "D = B"
Case C
Print "D = C"
Case Else
Print "unknown"
End Select
さて、雷電さんのコードは、取得する文字列が2バイト以下であることが保障されていれば、
以下のように書けます。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
GetDlgItemText(hMission,GetDlgItem(hMission,ComboBox1),StrPtr(strBuf), nLength+1 )
Select Case GetWord(StrPtr(strBuf))
Case &H0045 ' "E" & NULL
Rank="0"
Case &H0044 ' "D" & NULL
Rank="1"
Case &H0043 ' "C" & NULL
Rank="2"
Case &H2B43 ' "C+"
Rank="3"
Case &H0042 ' "B" & NULL
Rank="4"
Case &H2B42 ' "B+"
Rank="5"
Case &H0041 ' "A" + NULL
Rank="6"
Case &H2B41 ' "A+"
Rank="7"
Case &H0053 ' "S" + NULL
Rank="8"
Case Else
Rank="9"
End Select
Re: Caseを使っての文字列変換
Posted: 2006年5月15日(月) 10:22
by Yoshi
一度String型に入れて比較してはどうでしょうか
Posted: 2006年5月15日(月) 10:56
by 7
自分は文字列をSelect文で比較する時はlstrcmp()関数を使ってます。
コード: 全て選択
Dim str[256] As Byte
Dim str2[256] As Byte
lstrcpy(str,"aiueo")
lstrcpy(str2,"aiueo")
Select Case 0
Case lstrcmp(str,str2)
MessageBox(hMainWnd,"2","",MB_OK)
End Select
でも、Yoshiさんの意見でコーディングスタイル変えようと思いました。
コード: 全て選択
Dim str[256] As Byte
Dim str2[256] As Byte
lstrcpy(str,"aiueo")
lstrcpy(str2,"aiueo")
Select Case MakeStr(str)
Case MakeStr(str2)
MessageBox(hMainWnd,"2","",MB_OK)
End Select
素朴な意見 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コンボボックスのタイプって「ドロップダウンリスト」で項目は以下のように定まってますよね?
で、変換したい数値って 0 ~ 9 って決まってますよね?
こういう場合はユーザーが選択している項目の位置をそのまま文字に変換した方が簡単だと思います。
コード: 全て選択
Dim Rank As String
Dim nIndex As Long
nIndex=SendMessage(GetDlgItem(hMainWnd,ComboBox1),CB_GETCURSEL,NULL,NULL)
If (nIndex<0) Or (nIndex>8) Then nIndex=9
Rank=Str$(nIndex)
Re: Caseを使っての文字列変換
Posted: 2006年5月15日(月) 13:24
by Yoshi
>間違っていると思われるコード [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
GetDlgItemText(hMission,GetDlgItem(hMission,ComboBox1),StrPtr(strBuf), nLength+1 )
Select Case strBuf
Case StrPtr(strBuf)="E"
Rank="0"
Case StrPtr(strBuf)="D"
Rank="1"
Case StrPtr(strBuf)="C"
Rank="2"
Case StrPtr(strBuf)="C+"
Rank="3"
Case StrPtr(strBuf)="B"
Rank="4"
Case StrPtr(strBuf)="B+"
Rank="5"
Case StrPtr(strBuf)="A"
Rank="6"
Case StrPtr(strBuf)="A+"
Rank="7"
Case StrPtr(strBuf)="S"
Rank="8"
Case Else
Rank="9"
End Select
Dim strBuf[nLength] As Byte
としているばあい
このコード中の
Select Case strBuf
を
Select Case MakeStr(strBuf)
にして
Case StrPtr(strBuf)="E"
は
Case "E"
で
GetDlgItemText(hMission,GetDlgItem(hMission,ComboBox1),StrPtr(strBuf), nLength+1 )
は
GetDlgItemText(hMission,ComboBox1,strBuf, nLength+1 )
にしてみてはどうでしょうか?
それとも
strBufはString型なのでしょうか?
Dim strBuf As String
ならば、
strBuf = String$(nLength," ")
としておき
Case StrPtr(strBuf)="E"
は
Case "E"
にして
GetDlgItemText(hMission,GetDlgItem(hMission,ComboBox1),StrPtr(strBuf), nLength+1 )
は
GetDlgItemText(hMission,ComboBox1,strBuf, nLength+1 )
にしてみましょう。
(これでも可)
GetWindowText(GetDlgItem(hMission,ComboBox1),StrPtr(strBuf), nLength+1 )
Posted: 2006年5月15日(月) 15:00
by 雷電
たくさんの返信ありがとうございます。
、、、こんなにたくさんの人が返信してくれるだなんて、思っても見ませんでした。
いろいろな意見を参考にしてみました、(というより、めんどくさいですが、自分でコードを書いてやっちゃいました)
自作コード [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
GetDlgItemTextStr(hMission,ComboBox1,strBuf)
If strBuf="E" Then
Rank="0"
ElseIf strBuf="D" Then
Rank="1"
ElseIf strBuf="C" Then
Rank="2"
ElseIf strBuf="C+" Then
Rank="3"
ElseIf strBuf="B" Then
Rank="4"
ElseIf strBuf="B+" Then
Rank="5"
ElseIf strBuf="A" Then
Rank="6"
ElseIf strBuf="A+" Then
Rank="7"
ElseIf strBuf="S" Then
Rank="8"
Else
Rank="9"
End If
わざわざCaseでしなくても、Ifででもできたんですね
今回はどうも、ありがとうございました