Caseを使っての文字列変換

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
雷電

Caseを使っての文字列変換

#1 投稿記事 by 雷電 »

最近本ばかり読んで知識をため込んでいました、雷電です。
最近不思議に思っていたことがあったので、質問します。
コンボボックス内の選択技で、選ぶと、それに適応した数字に変換することはSelect Caseでできると思うのですが、、実際コードを書いてやってみても、できません。
コンパイルしても、できません。
気になったのでスレッドを立ててみました。

自分ではあってると思うのですが、違うじゃないか!と思う人、書き込みをお願いします。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

Re: Caseを使っての文字列変換

#2 投稿記事 by 淡幻星 »

Caseの条件式は、定数しか指定できないと記憶してるんですが・・・あれ?
Helpを読むと「任意の変数、または式を指定」ってありますね。
んなばかな・・・。コンパイルエラーしたはず・・・。

なお、問題の本質ではないですが、

コード: 全て選択

StrPtr(strBuf)="C+"
という構文は間違っています。
「Byte型ポインタ(DWord型)=String型(もしくはByte型配列)」となり、変数型が不一致です。
この場合は

コード: 全て選択

strBuf="C+"
が正しいです。

たとえば、

Caseの条件式に、変数や式を使えるのであれば、かなり便利なんですけどね~。
・・・もしかして、最新バージョンでは使えるようになったとか?(試してません^^;)
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

Re: Caseを使っての文字列変換

#3 投稿記事 by Mario2 »

これで無理なら、"Select Case strBuf" の部分を"Select Case StrPtr(strBuf)"に変えてみるとか。
検証していないので動くかどうかわかりませんが。
雷電

#4 投稿記事 by 雷電 »

早速の返信ありがとうございます。
どちらのコードもためさせてもらいましたが、どちらもうまくいきませんでした。
Caseの使い方って、結構難しいものなんですね・・・。
もっと勉強します。。。(ーー;)
ただ、コンボボックスで選択されている英語を、取得して、それを任意の数字に置き換えることを望みとしています。
自分でやってみます。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

Re: Caseを使っての文字列変換

#5 投稿記事 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でできなくなったのに文書は直されずにいたということでしょう。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

>イグトランスさん

#6 投稿記事 by 淡幻星 »

イグトランスさん さんが書きました:> おそらくAB 3でできなくなったのに文書は直されずにいたということでしょう。
あ、なるほど。
ありがとうございます。スッキリしました。
そういえばAB 2.59あたりでは

コード: 全て選択

Dim i As Long
i = 10
Dim s(i) As String
なんてのも通りましたっけ。ビバ・曖昧~(笑)。

あと、スレ違いですが、Char型の導入動機の記述、どうもです。
高信期

#7 投稿記事 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バイト以下であることが保障されていれば、
以下のように書けます。
Yoshi
記事: 27
登録日時: 2005年5月31日(火) 22:17
お住まい: 山口
連絡する:

Re: Caseを使っての文字列変換

#8 投稿記事 by Yoshi »

一度String型に入れて比較してはどうでしょうか
今日も元気にABLife
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#9 投稿記事 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
Yoshi
記事: 27
登録日時: 2005年5月31日(火) 22:17
お住まい: 山口
連絡する:

Re: Caseを使っての文字列変換

#10 投稿記事 by Yoshi »

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 )
今日も元気にABLife
雷電

#11 投稿記事 by 雷電 »

たくさんの返信ありがとうございます。
、、、こんなにたくさんの人が返信してくれるだなんて、思っても見ませんでした。

いろいろな意見を参考にしてみました、(というより、めんどくさいですが、自分でコードを書いてやっちゃいました)
わざわざCaseでしなくても、Ifででもできたんですね
今回はどうも、ありがとうございました
返信する