ページ 1 / 1
コンボボックス
Posted: 2006年11月30日(木) 20:09
by M.S.
コンボボックスでタイプを「ドロップダウンリスト」にして、
リストに、例えば「あああ」・「いいい」・「ううう」・「えええ」などと表示させ、
「あああ」を選んだら、変数 "a" に「あああ」を代入させるには、
どうすればよいのですか?
わかり難いかも知れませんが、どなたかお願いします。
※ 変数 "a" はファイルパスに使用します。
Posted: 2006年11月30日(木) 21:23
by 雷電
変更したときに取得するのなら、以下のコードで取得できます。
これであってると思う・・・ [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Sub MainWnd_ComboBox1_SelChange()
Dim hCombo As HWND
Dim a[MAX_PATH] As Byte
Dim Length As Long
hCombo=GetDlgItem(hMainWnd,ComboBox1)
Length=GetWindowTextLength(hCombo)+1
a=malloc(Length)
a=GetWindowText(hCombo,a,Length+1)
MessageBox(0,a,0,0)
End Sub
参考程度に・・・
Posted: 2006年12月01日(金) 00:49
by のぶあや
たぶんそのコードではコンパイルが通りません。
3行目では
コード: 全て選択
Dim a[MAX_PATH] As Byte
と配列で宣言しているので、その時点で
MAX_PATH+1バイトが確保されます。
なので7行目の
コード: 全て選択
a=malloc(Length)
は(配列にする場合)要りません。というかたぶんコンパイルエラーになると思います。
(試していないけど・・・
でも配列の先頭ポインタってことは型エラーにはならないかも?
どうやらコンボボックスの文字列長を取得してメモリを確保したいようなので、変数型を
BytePtrに直します。(配列も消します。)
また7行目の
コード: 全て選択
a=malloc(Length)
ではメモリを確保してはいますが
0で初期化されているわけではないので
callocに変更します。(callocでは自動で0に初期化される)
最後に8行目
コード: 全て選択
a=GetWindowText(hCombo,a,Length+1)
GetWindowTextの第3引数は
「lpString バッファのサイズ(終端の NULL 文字を含む)をバイト単位で指定します。」
とヘルプにあるように確保したメモリのサイズを指定するので、7行目で確保したサイズ(Length)を指定します。
まとめると以下のようになります。
コード: 全て選択
Sub MainWnd_ComboBox1_SelChange()
Dim hCombo As HWND
Dim a As BytePtr
Dim Length As Long
hCombo=GetDlgItem(hMainWnd,ComboBox1)
Length=GetWindowTextLength(hCombo)+1 '文字列長+1
a=calloc(Length) 'NULL文字を含めた分のメモリを確保
a=GetWindowText(hCombo,a,Length) '第3引数には確保したメモリサイズを指定
MessageBox(0,a,0,0)
End Sub
ところで余談ですが定数のMAX_PATHはなぜ260なのでしょうか?
Includeディレクトリ内の「api_system.sbp」に以下のように定義されています。
コード: 全て選択
Const MAX_PATH = 260
これだとキリが悪いように思えて仕方ありません。
どうせならキリのいい256にすればいいのにといつも思っているのですがどうなんでしょう?
Posted: 2006年12月01日(金) 07:28
by 7
GetWindowText()関数を使わない場合です。自分は主にこっちを使っています。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Dim hCombo As HWND, index As Long
Dim a As LPSTR
hCombo=GetDlgItem(hMainWnd,ComboBox1)
index=SendMessage(hCombo,CB_GETCURSEL,0,0)
a=calloc(SendMessage(hCombo,CB_GETLBTEXTLEN,index,0)+1)
SendMessage(hCombo,CB_GETLBTEXT,index,a)
MessageBox(hMainWnd,a,"ファイルパス",MB_OK)
free(a)
Posted: 2006年12月02日(土) 19:07
by M.S.
みなさん、ありがとうございます。
7 さんと、雷電さん (のぶあやさん修正Ver.) のコードでやってみましたが、
どちらもうまくいきません。
7 さんのコードはうまくアイテムの文字を取得できていないだけなのですが、
雷電さん (のぶあやさん修正Ver.) のコードは、
アイテム選択時に、コードの最後の行がデバッグ エラーが出ます。
どうすれば、これらは直るのですか?
お願いします。
Posted: 2006年12月02日(土) 20:54
by のぶあや
雷電さんのコードの明らかなバグを直しただけで、確認をしていませんでした。
しかもエディットボックスのつもりでいたりして・・・(死
今回はコンボボックスでしたね。
今回はコピペせずにきちんと書きました(あたりまえ
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Sub MainWnd_ComboBox1_SelChange()
/**'ここに「/」を入れると実行される部分が変わる
'新しく書いたコード
Dim hCB As HWND
Dim a As BytePtr, Pos As Long, Length As Long
hCB=GetDlgItem(hMainWnd, ComboBox1) 'ハンドルを取得
Pos=SendMessage(hCB, CB_GETCURSEL, 0, 0) '選択されているリストの位置を取得
Length=SendMessage(hCB, CB_GETLBTEXTLEN, Pos, 0) '位置を指定し、文字列長を取得
a=calloc(Length+1) 'NULL文字を含めた分のメモリを確保
SendMessage(hCB, CB_GETLBTEXT, Pos, a) '位置を指定し、文字列を取得
SendMessage(hMainWnd, WM_SETTEXT, 0, a) 'ウィンドウに表示
free(a) 'メモリ解放 前回忘れていました(汗
/*/
'7さんの書かれたコード(これはコピペ
Dim hCombo As HWND, index As Long
Dim a As LPSTR
hCombo=GetDlgItem(hMainWnd,ComboBox1)
index=SendMessage(hCombo,CB_GETCURSEL,0,0)
a=calloc(SendMessage(hCombo,CB_GETLBTEXTLEN,index,0)+1)
SendMessage(hCombo,CB_GETLBTEXT,index,a)
MessageBox(hMainWnd,a,"ファイルパス",MB_OK)
free(a)
/**/
End Sub
ほとんど同じですね(というかシンプルすぎて他に書きようがないだけなんだけど
こちらでは両方のコードでちゃんと取得できましたが・・・
一応そちらで書かれたコードと環境を教えていただけませんか?
Posted: 2006年12月02日(土) 21:14
by 雷電
のぶあや さんが書きました:> 雷電さんのコードの明らかなバグを直しただけで、確認をしていませんでした。
> しかもエディットボックスのつもりでいたりして・・・(死
> 今回はコンボボックスでしたね。
>
> 今回はコピペせずにきちんと書きました(あたりまえ
>
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Sub MainWnd_ComboBox1_SelChange()
>
> /**'ここに「/」を入れると実行される部分が変わる
> '新しく書いたコード
>
> Dim hCB As HWND
> Dim a As BytePtr, Pos As Long, Length As Long
>
> hCB=GetDlgItem(hMainWnd, ComboBox1) 'ハンドルを取得
> Pos=SendMessage(hCB, CB_GETCURSEL, 0, 0) '選択されているリストの位置を取得
> Length=SendMessage(hCB, CB_GETLBTEXTLEN, Pos, 0) '位置を指定し、文字列長を取得
> a=calloc(Length+1) 'NULL文字を含めた分のメモリを確保
> SendMessage(hCB, CB_GETLBTEXT, Pos, a) '位置を指定し、文字列を取得
> SendMessage(hMainWnd, WM_SETTEXT, 0, a) 'ウィンドウに表示
> free(a) 'メモリ解放 前回忘れていました(汗
>
> /*/
> '7さんの書かれたコード(これはコピペ
> Dim hCombo As HWND, index As Long
> Dim a As LPSTR
>
> hCombo=GetDlgItem(hMainWnd,ComboBox1)
>
> index=SendMessage(hCombo,CB_GETCURSEL,0,0)
> a=calloc(SendMessage(hCombo,CB_GETLBTEXTLEN,index,0)+1)
> SendMessage(hCombo,CB_GETLBTEXT,index,a)
>
> MessageBox(hMainWnd,a,"ファイルパス",MB_OK)
>
> free(a)
>
> /**/
> End Sub
>
> ほとんど同じですね(というかシンプルすぎて他に書きようがないだけなんだけど
>
> こちらでは両方のコードでちゃんと取得できましたが・・・
> 一応そちらで書かれたコードと環境を教えていただけませんか?
投稿した後に気がつきました。
・・・間違いすぎですね。
SendMessageでは無くて、GetWindowTextのほうでもいけるんですが・・・
僕の環境では、そっちを使ってます。
Posted: 2006年12月02日(土) 21:47
by 7
> SendMessageでは無くて、GetWindowTextのほうでもいけるんですが・・・
> 僕の環境では、そっちを使ってます。
GetWindowText()関数の場合、バグではないんですけど意図した動きをしないときがあるんですよ。
どういった状況で意図しない動きをするのか、すぐ忘れちゃうんですけど。
Posted: 2006年12月02日(土) 21:51
by 雷電
>GetWindowText()関数の場合、バグではないんですけど意図した動きをしないときがあるんですよ。
そうなんですか!?知りませんでした。
コード訂正しようか・・・ばぐったらいやなので
Posted: 2006年12月02日(土) 22:39
by イグトランス
今更ですが,MAX_PATHが260なのは勿論ABが決めたことではありません。C/C++でもそうなっています。
Windowsの仕様でパス名は259文字までと定められており,それに文字列の終わりのヌル文字 (\0)を加えて260というわけです。
(Windows NT系では最大で約32,000文字までと制限が緩和されています)
でもなぜ259なのかまでははっきりと知りません。
VFATファイルシステムでは,ファイル名・ディレクトリ名が255文字未満までということも関係していそうです。
サポート技術情報
KB148754 ファイル名は、未満255文字に制限されるように考えられます。
KB405530 [W95]長いファイル名(ロングファイルネーム)の制限について
Posted: 2006年12月03日(日) 00:01
by M.S.
> こちらでは両方のコードでちゃんと取得できましたが・・・
今コードを見直したら、7 さんのコードのコピーが、
一行抜けていることに気がつきました。
携帯のフルブラウザで見ていた為、
コピーが手書きとなり、
見逃していました…
こちらのミスでした、すみません…
> 一応そちらで書かれたコードと環境を教えていただけませんか?
今 Windows 95 でやり直したら、
ちゃんと出来ました。
Windows 95 4.00.950 B
AB 4.24.00
&
Windows XP Professional SP2
AB 5.00.00(CP3)
です。
みなさん、教えていただき、
ありがとうございました。
Posted: 2006年12月03日(日) 20:03
by ゲスト
> 今更ですが,MAX_PATHが260なのは勿論ABが決めたことではありません。C/C++でもそうなっています。
> Windowsの仕様でパス名は259文字までと定められており,それに文字列の終わりのヌル文字 (\0)を加えて260というわけです。
> (Windows NT系では最大で約32,000文字までと制限が緩和されています)
そうだったんですか。
以前疑問に思って検索したんですけど結局分からなくて・・・検索の仕方が悪かったのかな。
しかもXPを使っているので260文字以上のパス名も普通に使えてたのでますます「?」になってしまって。
9x系は259文字までという制限があるからなんですね。
些細な疑問に答えていただきありがとうございました。