取得&変更

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

取得&変更

#1 投稿記事 by GTR »

エディットボックス内の文字列を取得してそこから始めるようにしたいのです。
詳しく説明しますと、例えばエディットボックス内に下のような

コード: 全て選択

2
3
4
5
が書いてあったとします。そこで、あるボタンを押すと次に出てくるのは6というようにしたいのですが。
このようなプログラムにあう関数はありますでしょうか?
教えてください。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

Re: 取得&変更

#2 投稿記事 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"
ユーザーのエディットボックスへの入力を許すとなると、ちょっと処理は面倒になります。

       エディットボックスの中身を取得。
              ↓
      取得した文字列の最終行の数字を取得。
              ↓
   その数字をカウントアップしたものを文字列に追加する。
              ↓
  一番上の行を除いた文字列ををエディットボックスにセット。

といった流れでしょうか。
この辺を自分で考えて組んで完成させるのがプログラミングの醍醐味だと
思いますから、がんばってください♪
GTR

#3 投稿記事 by GTR »

そのようですね。
頑張ってやってみます。
分からない点があれば、また質問したいと思います
GTR

#4 投稿記事 by GTR »

分からない点があったので、質問させていただきます。
ボタンを押すたびに数値が増えていくのはわかりました。
でも、取得をするのに手間どっています。
一応数値を増やすコードを書きますと、

コード: 全て選択

    Dim nCount As Long
  cnt=cnt+1
    '300を超えたら1に戻す
    If 300<cnt Then
        cnt=1
    End If
こんな感じです。
でも、取得方法が分かりません(-_-;)
御説明お願いします。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

#5 投稿記事 by 淡幻星 »

> でも、取得方法が分かりません(-_-;)
どこの部分でしょうか?
取得したエディットボックスの内容から数字を取得するところでしょうか?
もしそこだとしたら、確かに悩むところかもしれません^^;
文字列の形式は、最初にGTRさんが書かれたように、
数字のみ数行で構成されていて、最終行の数字を取得する、
で良いのでしょうか?
GTR

#6 投稿記事 by GTR »

数字のみではないです・・・。
数字の前にも後ろにも文字列が入ります。
例えば
G2TR
のように。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#7 投稿記事 by 7 »

> 数字の前にも後ろにも文字列が入ります。
> 例えば
> G2TR
数字の前に文字列がある場合でも数値を返す関数を作ってみました。(Val関数を改造)
もっといいやり方があるかもしれません...。
GTR

#8 投稿記事 by GTR »

文字列の一番最後の文字のかたまりの中の変数を取り出してその次、その次・・・・という風にしたいのです。
cnt++が文法が間違っていますというエラーが出ます。
すいません、要望ばかりで。
自分でも努力しているつもりなのですが、できません。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

#9 投稿記事 by 淡幻星 »

GTRさん さんが書きました:> 文字列の一番最後の文字のかたまりの中の変数を取り出してその次、その次・・・・という風にしたいのです。
その最後の文字のかたまりはどのようになっているのでしょうか?
前後を数字で無い文字で挟んでいるのでしょうか?
そして、「最後の」とは「最終行の」と言う意味でしょうか?
もし、そうだとすれば、
GTRさん さんが書きました:> cnt++が文法が間違っていますというエラーが出ます。
横スレですが。
cnt++

cnt = cnt + 1
に代えてみてください。
(しかし、cnt++も使えるようになったはず・・・。なぜにエラー?)


なお、「最終行の」ではなくて純粋に「最後の数字」の場合には、
7さんのコードValEx()を直に変更する方が早いと思います^^;
「文字の終端から調べていって、数字が出たら終わるまで走査を続ける」と
変更すればよいかと。
GTR

#10 投稿記事 by GTR »

もう少し詳しく書いたほうが良かったようです。
すいません。
私がしたいのは、G2TRなどの文字列(2は変数)で
初めは変数が1でいいのですが、次に押すと2になる。
そういうコードを前回にも投稿しました。
それを一旦保存し、プログラムを閉じる。
そしてもう一度開く、そのときにそのボタンをまた押すと、
今度はG3TRとなるようにしたいのです。
よくこの変数の値が50まで行くことがあります。
しかし、それをまたその数からというようにしたいのです。
投稿してもらっても一つも役に立っていないようで、本当に申し訳ありません。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

#11 投稿記事 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)
のように表示だけすれば簡単ではないでしょうか?
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#12 投稿記事 by 7 »

> それを一旦保存し、プログラムを閉じる。
> そしてもう一度開く、そのときにそのボタンをまた押すと、
> 今度はG3TRとなるようにしたいのです。
> よくこの変数の値が50まで行くことがあります。
> しかし、それをまたその数からというようにしたいのです。
これは、保存は出来るけど読み込みが出来ませんってことでしょうか。

数値を保存できるなら読み込んだ時に、その値までFor文で"G"+Str$(i)+"TR"を追加していけばいいんじゃないでしょうか。
説明が下手ですみません...。 アプリケーション終了時にLong型グローバル変数iの内容を保存して、起動時に変数iに格納するって感じです。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

#13 投稿記事 by 淡幻星 »

もうNoWestさんと7さんが良質の回答をなされてしまいましたので(出遅れた^^;)、
ちょっと重箱の隅を補完してみます(突っつくとも言う/マテ)。

GTRさん さんが書きました:> それを一旦保存し、プログラムを閉じる。
> そしてもう一度開く、そのときにそのボタンをまた押すと、
> 今度はG3TRとなるようにしたいのです。
念のため確認なのですが、
保存部分と、ボタンを押すと数字が増える部分とは、
別物として考えてますよね?
別々に作ったほうが、混乱しなくて理解しやすいです。
GTRさん さんが書きました:> 投稿してもらっても一つも役に立っていないようで、本当に申し訳ありません。
どうやら、文字列の形式は
「G2TR」「G3TR」・・・「G50TR」という具合に、「G*TR」という形式に決まっている
ように感じられたのですが、欲している機能はそれであっていますでしょうか?
あっているとすれば、NoWestさん、7さんが回答された方法で実現できると思うので、
私からの提示は割愛させていただきます(^^;)
(ちなみに「入力を受け付けないのであれば・・・」の欄で、
 私も同様の流れを書いたつもりでしたが、分かりづらかったですか。。。失礼。)


P.S. これから数日ネット環境に触れない可能性があるので、しばらくレスできないかもしれません。
返信する