内容の取得&EditBoxへの出力

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

内容の取得&EditBoxへの出力

#1 投稿記事 by GTR »

題どうりです。

コンボボックス内に書いてある内容を別のウィンドウのEditBox1に出力しようとしています。
コードとしては、なんとなくなのですが書いてみました。

コード: 全て選択

Sub GTR_CommandButton1_Click()
	Dim length As Long
	Dim hCombo As Long

	length=GetWindowTextLength(hCombo)
	SendMessage(GetDlgItem(hGTR,ComboBox1), WM_COPY, 0, 0)

	SendMessage(GetDlgItem(hMainWnd,EditBox1), WM_PASTE, 0, 0)
End Sub
指摘をお願いします。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

Re: 内容の取得&EditBoxへの出力

#2 投稿記事 by 淡幻星 »

ヘルプセンターや過去ログ、さらに以前のログ「BackSearchAB」も調べてみてください。
コンボボックスの使い方、文字列の取得・セットの方法が載っているはずです。

いちおうコードを書いてみますと、こんな感じになります。

コード: 全て選択

Sub GTR_CommandButton1_Click()
	Dim nLength As Long
	Dim hCombo As HWND
	Dim strBuf As String

	hCombo = GetDlgItem( hMainWnd, ComboBox1 ) 'コンボボックスの窓ハンドルを得る。
	nLength = GetWindowTextLength( hCombo ) 'これから取得する文字列の長さを得る。
	strBuf = ZeroString( nLength + 1 ) '取得する文字列を格納するバッファ(=領域)を準備する。
	GetWindowText( hCombo, StrPtr(strBuf), nLength ) 'コンボボックスの文字列を取得する。
	SetWindowText( hCombo, StrPtr(strBuf) ) '取得した文字列をエディットボックスにセットする。
End Sub
現在、動作テストできる環境に居ないので、エラーしましたらごめんなさい。
「実践コードモジュール」のほうに、もっと簡単な方法
(長さとか気にせずに一発で文字列取得できる)が載っていたと
思いますので、そちらも参照ください。
GTR

#3 投稿記事 by GTR »

コードを入力してやってみましたが取得はできたみたいですが、セットされません。レス遅れてすいません。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

#4 投稿記事 by 淡幻星 »

すいません。セット先の窓ハンドルが間違ってました。m(_ _)m

最後の

コード: 全て選択

SetWindowText( hCombo, StrPtr(strBuf) ) '取得した文字列をエディットボックスにセットする。 

コード: 全て選択

SetWindowText( GetDlgItem( hMainWnd, EditBox1 ), StrPtr(strBuf) ) '取得した文字列をエディットボックスにセットする。
に変更してください。


しかしGTRさん、惜しいですね。
失敗の個所(取得は出来たが、セットできていない)の特定までできたのでしたら、
その解決も自分でやっちゃいましょうよ♪
(普通は、失敗個所の特定で苦労します。特定してしまえば大半は楽に解決できます。)
今回のコードであれば、セットに失敗している理由は、
SetWindowText( hCombo, StrPtr(strBuf) )のセット先の窓ハンドルの指定が
コンボボックスになっていたためです。
おそらくは、SetWindowText()という命令をGTRさんは初めて見たのだと
思いますが、その場合はヘルプでキーワード検索してみましょう。
すると
ウィンドウのタイトル バーのテキスト、またはコントロール内のテキストを設定します。
Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" _
(hWnd As HWND, _
lpString As BytePtr) As Long

hWnd
ウィンドウ ハンドルを指定します。
lpString
設定する文字列が格納されている、バッファへのポインタを指定します。
と出ると思います。
これを読めば、EditBox1に出力したいのに、
第一引数(hWnd As HWND)にhComboをしているのはオカシイ、
と気付くと思います。
そうすれば、上記のようにコードを修正すれば良い、
と自力で解決方法に辿り着けると思いますが、どうでしょうか?^_^
GTR

#5 投稿記事 by GTR »

所得&セットできました。
しかし、+や‐などの文字列が消えてしまうのですがどうしてでしょう?
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

#6 投稿記事 by 淡幻星 »

> +や‐などの文字列が消えてしまうのですがどうしてでしょう?
え?
そんなはずはないのですが・・・(実際、此方では+-も表示されます@Ver4.23.00)
どういう文字列をセットしたときに、どのように表示されるのでしょうか?
GTR

#7 投稿記事 by GTR »

コンボボックス内に文字列を追加するときには、

コード: 全て選択

cb_addString(hCombo,
で追加していますが、例えば、私が
cb_addString(hCombo,"+A")
としたとき、コンボボックスでそれを指定してボタンを押しても、
+が出力されません。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

#8 投稿記事 by 淡幻星 »

以下を順に調べてみてください。
1、コンボボックスには意図したとおりの文字が表示されているのか?
2、ボタンを押したときの、コンボボックスの文字列取得は成功しているのか?

ちなみにDebug命令は知ってますよね?
ステップアウト等を使うとエラー個所を探すのが楽ですよ~。



※エディットボックスにおいて、"+A"が"A"と表示されると解釈しました。
 また、cb_addString()はGTRさんが自前で定義した関数と
 思われますので私には動作が分かりませんが、状況からおそらく
 SendMessage( hCombo, CB_ADDSTRING, 0, "追加文字列" )
 を内部で呼んでいるのだろうと判断しました。
GTR

#9 投稿記事 by GTR »

原因を探しています。
しかし、文字列の取得はできているみたいです。
いろんな言葉をコンボボックスに入れて試しましたが、やはり+のみが表示されません。コンボボックスについてよくご存知の方、お願いします。
GTR

#10 投稿記事 by GTR »

状況報告します。
コンボボックス内の文字列の一番後ろの文字が消えることに気がつきました。
ということは、私の勘違いかもしれませんが、多分そうです
GTR

#11 投稿記事 by GTR »

何度もすいません、
文字列追加の際に後ろにわざとスペースを置きましたところ、ちゃんと動作しました
淡幻星さん、ありがとうございました
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

うっかりしてましたm(_ _)m

#12 投稿記事 by 淡幻星 »

もう解決済みのようですが。

原因はこちらです。コードの下から2行目?の

コード: 全て選択

GetWindowText( hCombo, StrPtr(strBuf), nLength ) 'コンボボックスの文字列を取得する。

コード: 全て選択

GetWindowText( hCombo, StrPtr(strBuf), nLength+1 ) 'コンボボックスの文字列を取得する。
に変更してください。
NULL文字の分まで含めて(つまり+1)指定することを忘れていました。
「+」が表示されないのではなくて、
最後の一文字の取得に常に失敗していた、わけです。
うっかりしていました。すいませんm(_ _)m
GTR

#13 投稿記事 by GTR »

やっぱり原因はそこでしたか。
気がつきませんでした。でも一応完成したとはいえ、コードを直しておきました。今回はどうもありがとうございました。淡幻星さんには、感謝しています。
返信する