ページ 1 / 1
取得&変更
Posted: 2006年4月10日(月) 20:52
by GTR
エディットボックス内の文字列を取得してそこから始めるようにしたいのです。
詳しく説明しますと、例えばエディットボックス内に下のような
が書いてあったとします。そこで、あるボタンを押すと次に出てくるのは6というようにしたいのですが。
このようなプログラムにあう関数はありますでしょうか?
教えてください。
Re: 取得&変更
Posted: 2006年4月10日(月) 23:08
by 淡幻星
人それぞれやり方がありますし、
エディットボックスにも入力を受け付けるのかどうかによっても変わります。
エディットボックスへの入力を受け付けないのであれば(READ ONLY属性にチェック)、
あらかじめ
Dim nCount As Longなどのカウント変数をグローバルで作っておいて、
ボタンを押すたびに1ずつカウントアップし、このnCountを元にエディットボックスへの
出力文字列を作れば良いわけです。
コード: 全て選択
/*
数字から文字列の作り方の例:
nCount=2ならば、文字列strBufは
-----
| 2 |
| 3 |
| 4 |
-----
となる。
*/
Dim strBuf As String
strBuf = Str$(nCount) + Ex"\n" '後ろのは改行コードの付加。
strBuf = strBuf + Str$(nCount+1) + Ex"\n"
strBuf = strBuf + Str$(nCount+2) + Ex"\n"
ユーザーのエディットボックスへの入力を許すとなると、ちょっと処理は面倒になります。
エディットボックスの中身を取得。
↓
取得した文字列の最終行の数字を取得。
↓
その数字をカウントアップしたものを文字列に追加する。
↓
一番上の行を除いた文字列ををエディットボックスにセット。
といった流れでしょうか。
この辺を
自分で考えて組んで
完成させるのがプログラミングの醍醐味だと
思いますから、がんばってください♪
Posted: 2006年4月10日(月) 23:43
by GTR
そのようですね。
頑張ってやってみます。
分からない点があれば、また質問したいと思います
Posted: 2006年4月15日(土) 20:46
by GTR
分からない点があったので、質問させていただきます。
ボタンを押すたびに数値が増えていくのはわかりました。
でも、取得をするのに手間どっています。
一応数値を増やすコードを書きますと、
コード: 全て選択
Dim nCount As Long
cnt=cnt+1
'300を超えたら1に戻す
If 300<cnt Then
cnt=1
End If
こんな感じです。
でも、取得方法が分かりません(-_-;)
御説明お願いします。
Posted: 2006年4月16日(日) 00:03
by 淡幻星
> でも、取得方法が分かりません(-_-;)
どこの部分でしょうか?
取得したエディットボックスの内容から数字を取得するところでしょうか?
もしそこだとしたら、確かに悩むところかもしれません^^;
文字列の形式は、最初にGTRさんが書かれたように、
数字のみ数行で構成されていて、最終行の数字を取得する、
で良いのでしょうか?
Posted: 2006年4月16日(日) 00:09
by GTR
数字のみではないです・・・。
数字の前にも後ろにも文字列が入ります。
例えば
G2TR
のように。
Posted: 2006年4月16日(日) 12:47
by 7
> 数字の前にも後ろにも文字列が入ります。
> 例えば
> G2TR
数字の前に文字列がある場合でも数値を返す関数を作ってみました。(Val関数を改造)
もっといいやり方があるかもしれません...。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Function ValEx(ByVal lpString As BytePtr) As Double
Dim dmyString As BytePtr
Dim length As Long, cnt As Long
length=lstrlen(lpString)
dmyString=calloc(length+1)
While cnt<>length
If IsDBCSLeadByte(lpString[cnt])=TRUE Then
cnt++
Else
If ( 47<lpString[cnt] ) And ( 58>lpString[cnt] ) Then
memcpy(dmyString,VarPtr(lpString[cnt]),length-cnt)
ValEx=Val(dmyString)
Exit While
End If
End If
cnt++
Wend
free(dmyString)
End Function
Dim i As Double
i=ValEx("G2TR")
Posted: 2006年4月16日(日) 22:41
by GTR
文字列の一番最後の文字のかたまりの中の変数を取り出してその次、その次・・・・という風にしたいのです。
cnt++が文法が間違っていますというエラーが出ます。
すいません、要望ばかりで。
自分でも努力しているつもりなのですが、できません。
Posted: 2006年4月16日(日) 23:56
by 淡幻星
GTRさん さんが書きました:> 文字列の一番最後の文字のかたまりの中の変数を取り出してその次、その次・・・・という風にしたいのです。
その最後の文字のかたまりはどのようになっているのでしょうか?
前後を数字で無い文字で挟んでいるのでしょうか?
そして、「最後の」とは「最終行の」と言う意味でしょうか?
もし、そうだとすれば、
7さんのコードを利用してこんな方法があると思います。 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
/*
ValEx( strBuf )とすると、文字列strBufの最初の数字が返るが、
そこにちょっと追加して最後の数字を得る。
*/
Functoin ValExR(ByVal lpString As BytePtr) As Double
Dim pMark As BytePtr
pMark = lstrrchr( lpStringf, 10 )'一番最後の改行(LF,\n)の位置を探す
If( pMark<>NULL )Then
ValExR = ValEx( pMark ) '最終行に対してValExを実行。
Else
ValExR = ValEx( lpString ) '一行なので、そのままValExを実行。
EndIf
EndFunction
'lstrrchr()の定義
'※最後にある文字bSearch2の位置を返す。
Declare Function _lstrrchr Lib "shlwapi" Alias "StrRChrIA" _
( pBufStart As BytePtr, _
pBufEnd As BytePtr, _
bSearch2 As Byte ) As BytePtr
Function lstrrchr( pBuffer1 As BytePtr, bSearch2 As Byte ) As BytePtr
lstrrchr = _lstrrchr( pBuffer1, _
pBuffer1 + lstrlen(pBuffer1), _
bSearch2 )
EndFunction
Dim i As Double
i=ValEx( Ex"一行目\n\r二行目にG2TR" )
GTRさん さんが書きました:> cnt++が文法が間違っていますというエラーが出ます。
横スレですが。
cnt++
を
cnt = cnt + 1
に代えてみてください。
(しかし、cnt++も使えるようになったはず・・・。なぜにエラー?)
なお、「最終行の」ではなくて純粋に「最後の数字」の場合には、
7さんのコードValEx()を直に変更する方が早いと思います^^;
「文字の終端から調べていって、数字が出たら終わるまで走査を続ける」と
変更すればよいかと。
Posted: 2006年4月17日(月) 18:44
by GTR
もう少し詳しく書いたほうが良かったようです。
すいません。
私がしたいのは、G2TRなどの文字列(2は変数)で
初めは変数が1でいいのですが、次に押すと2になる。
そういうコードを前回にも投稿しました。
それを一旦保存し、プログラムを閉じる。
そしてもう一度開く、そのときにそのボタンをまた押すと、
今度はG3TRとなるようにしたいのです。
よくこの変数の値が50まで行くことがあります。
しかし、それをまたその数からというようにしたいのです。
投稿してもらっても一つも役に立っていないようで、本当に申し訳ありません。
Posted: 2006年4月17日(月) 20:54
by NoWest
> もう少し詳しく書いたほうが良かったようです。
> すいません。
> 私がしたいのは、G2TRなどの文字列(2は変数)で
> 初めは変数が1でいいのですが、次に押すと2になる。
> そういうコードを前回にも投稿しました。
> それを一旦保存し、プログラムを閉じる。
> そしてもう一度開く、そのときにそのボタンをまた押すと、
> 今度はG3TRとなるようにしたいのです。
> よくこの変数の値が50まで行くことがあります。
> しかし、それをまたその数からというようにしたいのです。
> 投稿してもらっても一つも役に立っていないようで、本当に申し訳ありません。
何に使うかよく分かりませんがこんなのはどうでしょうか?
コード: 全て選択
Dim buf[255] As Char
'GetWindowText(GetDlgItem(hMainWnd,EditBox1),buf,256)
lstrcpy(buf,"G9TR")
Dim str As String
If buf[2]=>Asc("0") and buf[2]<=Asc("9") Then
Select Case buf[2]-Asc("0")
Case 0,1,2,3,4,5,6,7,8
buf[2]++
Case 9
buf[2]=Asc("0")
buf[1]++
End Select
Else
Select Case buf[1]-Asc("0")
Case 0,1,2,3,4,5,6,7,8
buf[1]++
Case 9
buf[1]=Asc("0")
str=MakeStr(VarPtr(buf[1]))
lstrcpy(VarPtr(buf[2]),StrPtr(str))
buf[1]=Asc("1")
End Select
End If
Print MakeStr(buf)
'SetWindowText(GetDlgItem(hMainWnd,EditBox1),buf)
このプログラムを改造していけばある程度のものは作れるかと思いますが、
そもそも、文字列データと数値データとを別々に保存しておけば簡単だと思います。
人間は文字列データから数字を取り出すことは簡単ですが、コンピュータはそれを最も苦手としています。一般に特定の位置にある一定の長さの数字を取り出すことは簡単ですが、可変長の数値を文字列から切り取ったり、差し替えたりすることはとても面倒なアルゴリズムを必要とする訳です。
ですから、例えば"G1TR"であれば
"G%dTR"
という文字列と
1
という数値で保存しておき、
wsprintf関数なんぞを使って
wsprintf(buf,"G%dTR",1)
のように表示だけすれば簡単ではないでしょうか?
Posted: 2006年4月17日(月) 21:16
by 7
> それを一旦保存し、プログラムを閉じる。
> そしてもう一度開く、そのときにそのボタンをまた押すと、
> 今度はG3TRとなるようにしたいのです。
> よくこの変数の値が50まで行くことがあります。
> しかし、それをまたその数からというようにしたいのです。
これは、保存は出来るけど読み込みが出来ませんってことでしょうか。
数値を保存できるなら読み込んだ時に、その値までFor文で"G"+Str$(i)+"TR"を追加していけばいいんじゃないでしょうか。
説明が下手ですみません...。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
'読み込んだつもりで初期値を10に設定しています。
Dim i=10 As Long
Sub MainWnd_CommandButton1_Click()
Dim hEdit As HWND
Dim cnt As Long
hEdit=GetDlgItem(hMainWnd,EditBox1)
SetWindowText(hEdit,0)
For cnt=1 To i
SendMessage(hEdit,EM_REPLACESEL,FALSE,"G"+Str$(cnt)+"TR"+Ex"\r\n")
Next
End Sub
アプリケーション終了時にLong型グローバル変数iの内容を保存して、起動時に変数iに格納するって感じです。
Posted: 2006年4月17日(月) 22:54
by 淡幻星
もうNoWestさんと7さんが良質の回答をなされてしまいましたので(出遅れた^^;)、
ちょっと重箱の隅を補完してみます(突っつくとも言う/マテ)。
GTRさん さんが書きました:> それを一旦保存し、プログラムを閉じる。
> そしてもう一度開く、そのときにそのボタンをまた押すと、
> 今度はG3TRとなるようにしたいのです。
念のため確認なのですが、
保存部分と、ボタンを押すと数字が増える部分とは、
別物として考えてますよね?
別々に作ったほうが、混乱しなくて理解しやすいです。
GTRさん さんが書きました:> 投稿してもらっても一つも役に立っていないようで、本当に申し訳ありません。
どうやら、文字列の形式は
「G2TR」「G3TR」・・・「G50TR」という具合に、「G*TR」という形式に決まっている
ように感じられたのですが、欲している機能はそれであっていますでしょうか?
あっているとすれば、NoWestさん、7さんが回答された方法で実現できると思うので、
私からの提示は割愛させていただきます(^^;)
(ちなみに「入力を受け付けないのであれば・・・」の欄で、
私も同様の流れを書いたつもりでしたが、分かりづらかったですか。。。失礼。)
P.S. これから数日ネット環境に触れない可能性があるので、しばらくレスできないかもしれません。