ページ 1 / 1
内容の取得&EditBoxへの出力
Posted: 2006年3月22日(水) 21:02
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
指摘をお願いします。
Re: 内容の取得&EditBoxへの出力
Posted: 2006年3月22日(水) 21:59
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
現在、動作テストできる環境に居ないので、エラーしましたらごめんなさい。
「実践コードモジュール」のほうに、もっと簡単な方法
(長さとか気にせずに一発で文字列取得できる)が載っていたと
思いますので、そちらも参照ください。
Posted: 2006年4月08日(土) 14:07
by GTR
コードを入力してやってみましたが取得はできたみたいですが、セットされません。レス遅れてすいません。
Posted: 2006年4月08日(土) 17:58
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をしているのはオカシイ、
と気付くと思います。
そうすれば、上記のようにコードを修正すれば良い、
と自力で解決方法に辿り着けると思いますが、どうでしょうか?^_^
Posted: 2006年4月09日(日) 15:57
by GTR
所得&セットできました。
しかし、+や‐などの文字列が消えてしまうのですがどうしてでしょう?
Posted: 2006年4月09日(日) 18:40
by 淡幻星
> +や‐などの文字列が消えてしまうのですがどうしてでしょう?
え?
そんなはずはないのですが・・・(実際、此方では+-も表示されます@Ver4.23.00)
どういう文字列をセットしたときに、どのように表示されるのでしょうか?
Posted: 2006年4月09日(日) 23:24
by GTR
コンボボックス内に文字列を追加するときには、
コード: 全て選択
cb_addString(hCombo,
で追加していますが、例えば、私が
cb_addString(hCombo,"+A")
としたとき、コンボボックスでそれを指定してボタンを押しても、
+が出力されません。
Posted: 2006年4月10日(月) 15:39
by 淡幻星
以下を順に調べてみてください。
1、コンボボックスには意図したとおりの文字が表示されているのか?
2、ボタンを押したときの、コンボボックスの文字列取得は成功しているのか?
ちなみにDebug命令は知ってますよね?
ステップアウト等を使うとエラー個所を探すのが楽ですよ~。
※エディットボックスにおいて、"+A"が"A"と表示されると解釈しました。
また、cb_addString()はGTRさんが自前で定義した関数と
思われますので私には動作が分かりませんが、状況からおそらく
SendMessage( hCombo, CB_ADDSTRING, 0, "追加文字列" )
を内部で呼んでいるのだろうと判断しました。
Posted: 2006年4月10日(月) 17:59
by GTR
原因を探しています。
しかし、文字列の取得はできているみたいです。
いろんな言葉をコンボボックスに入れて試しましたが、やはり+のみが表示されません。コンボボックスについてよくご存知の方、お願いします。
Posted: 2006年4月10日(月) 18:05
by GTR
状況報告します。
コンボボックス内の文字列の一番後ろの文字が消えることに気がつきました。
ということは、私の勘違いかもしれませんが、多分そうです
Posted: 2006年4月10日(月) 18:11
by GTR
何度もすいません、
文字列追加の際に後ろにわざとスペースを置きましたところ、ちゃんと動作しました
淡幻星さん、ありがとうございました
うっかりしてましたm(_ _)m
Posted: 2006年4月10日(月) 20:39
by 淡幻星
もう解決済みのようですが。
原因はこちらです。コードの下から2行目?の
コード: 全て選択
GetWindowText( hCombo, StrPtr(strBuf), nLength ) 'コンボボックスの文字列を取得する。
を
コード: 全て選択
GetWindowText( hCombo, StrPtr(strBuf), nLength+1 ) 'コンボボックスの文字列を取得する。
に変更してください。
NULL文字の分まで含めて(つまり+1)指定することを忘れていました。
「+」が
表示されないのではなくて、
最後の一文字の取得に常に失敗していた、わけです。
うっかりしていました。すいませんm(_ _)m
Posted: 2006年4月10日(月) 20:48
by GTR
やっぱり原因はそこでしたか。
気がつきませんでした。でも一応完成したとはいえ、コードを直しておきました。今回はどうもありがとうございました。淡幻星さんには、感謝しています。