コンボボックス
変更したときに取得するのなら、以下のコードで取得できます。
これであってると思う・・・ [ここをクリックすると内容が表示されます]
参考程度に・・・コード: 全て選択
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
===============================
MyHomePage;; raiden.no.land.to/
===============================
MyHomePage;; raiden.no.land.to/
===============================
たぶんそのコードではコンパイルが通りません。
3行目ではと配列で宣言しているので、その時点でMAX_PATH+1バイトが確保されます。
なので7行目のは(配列にする場合)要りません。というかたぶんコンパイルエラーになると思います。
(試していないけど・・・でも配列の先頭ポインタってことは型エラーにはならないかも?
どうやらコンボボックスの文字列長を取得してメモリを確保したいようなので、変数型をBytePtrに直します。(配列も消します。)
また7行目のではメモリを確保してはいますが0で初期化されているわけではないのでcallocに変更します。(callocでは自動で0に初期化される)
最後に8行目GetWindowTextの第3引数は
「lpString バッファのサイズ(終端の NULL 文字を含む)をバイト単位で指定します。」
とヘルプにあるように確保したメモリのサイズを指定するので、7行目で確保したサイズ(Length)を指定します。
まとめると以下のようになります。
ところで余談ですが定数のMAX_PATHはなぜ260なのでしょうか?
Includeディレクトリ内の「api_system.sbp」に以下のように定義されています。これだとキリが悪いように思えて仕方ありません。
どうせならキリのいい256にすればいいのにといつも思っているのですがどうなんでしょう?
3行目では
コード: 全て選択
Dim a[MAX_PATH] As Byte
なので7行目の
コード: 全て選択
a=malloc(Length)
(試していないけど・・・でも配列の先頭ポインタってことは型エラーにはならないかも?
どうやらコンボボックスの文字列長を取得してメモリを確保したいようなので、変数型をBytePtrに直します。(配列も消します。)
また7行目の
コード: 全て選択
a=malloc(Length)
最後に8行目
コード: 全て選択
a=GetWindowText(hCombo,a,Length+1)
「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にすればいいのにといつも思っているのですがどうなんでしょう?
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)
雷電さんのコードの明らかなバグを直しただけで、確認をしていませんでした。
しかもエディットボックスのつもりでいたりして・・・(死
今回はコンボボックスでしたね。
今回はコピペせずにきちんと書きました(あたりまえ
こちらでは両方のコードでちゃんと取得できましたが・・・
一応そちらで書かれたコードと環境を教えていただけませんか?
しかもエディットボックスのつもりでいたりして・・・(死
今回はコンボボックスでしたね。
今回はコピペせずにきちんと書きました(あたりまえ
[ここをクリックすると内容が表示されます]
ほとんど同じですね(というかシンプルすぎて他に書きようがないだけなんだけどコード: 全て選択
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
こちらでは両方のコードでちゃんと取得できましたが・・・
一応そちらで書かれたコードと環境を教えていただけませんか?
投稿した後に気がつきました。のぶあや さんが書きました:> 雷電さんのコードの明らかなバグを直しただけで、確認をしていませんでした。
> しかもエディットボックスのつもりでいたりして・・・(死
> 今回はコンボボックスでしたね。
>
> 今回はコピペせずにきちんと書きました(あたりまえ
>[ここをクリックすると内容が表示されます]> ほとんど同じですね(というかシンプルすぎて他に書きようがないだけなんだけどコード: 全て選択
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のほうでもいけるんですが・・・
僕の環境では、そっちを使ってます。
===============================
MyHomePage;; raiden.no.land.to/
===============================
MyHomePage;; raiden.no.land.to/
===============================
今更ですが,MAX_PATHが260なのは勿論ABが決めたことではありません。C/C++でもそうなっています。
Windowsの仕様でパス名は259文字までと定められており,それに文字列の終わりのヌル文字 (\0)を加えて260というわけです。
(Windows NT系では最大で約32,000文字までと制限が緩和されています)
でもなぜ259なのかまでははっきりと知りません。
VFATファイルシステムでは,ファイル名・ディレクトリ名が255文字未満までということも関係していそうです。
サポート技術情報
KB148754 ファイル名は、未満255文字に制限されるように考えられます。
KB405530 [W95]長いファイル名(ロングファイルネーム)の制限について
Windowsの仕様でパス名は259文字までと定められており,それに文字列の終わりのヌル文字 (\0)を加えて260というわけです。
(Windows NT系では最大で約32,000文字までと制限が緩和されています)
でもなぜ259なのかまでははっきりと知りません。
VFATファイルシステムでは,ファイル名・ディレクトリ名が255文字未満までということも関係していそうです。
サポート技術情報
KB148754 ファイル名は、未満255文字に制限されるように考えられます。
KB405530 [W95]長いファイル名(ロングファイルネーム)の制限について
> こちらでは両方のコードでちゃんと取得できましたが・・・
今コードを見直したら、7 さんのコードのコピーが、
一行抜けていることに気がつきました。
携帯のフルブラウザで見ていた為、
コピーが手書きとなり、
見逃していました…
こちらのミスでした、すみません…
> 一応そちらで書かれたコードと環境を教えていただけませんか?
今 Windows 95 でやり直したら、
ちゃんと出来ました。
Windows 95 4.00.950 B
AB 4.24.00
&
Windows XP Professional SP2
AB 5.00.00(CP3)
です。
みなさん、教えていただき、
ありがとうございました。
今コードを見直したら、7 さんのコードのコピーが、
一行抜けていることに気がつきました。
携帯のフルブラウザで見ていた為、
コピーが手書きとなり、
見逃していました…
こちらのミスでした、すみません…
> 一応そちらで書かれたコードと環境を教えていただけませんか?
今 Windows 95 でやり直したら、
ちゃんと出来ました。
Windows 95 4.00.950 B
AB 4.24.00
&
Windows XP Professional SP2
AB 5.00.00(CP3)
です。
みなさん、教えていただき、
ありがとうございました。
> 今更ですが,MAX_PATHが260なのは勿論ABが決めたことではありません。C/C++でもそうなっています。
> Windowsの仕様でパス名は259文字までと定められており,それに文字列の終わりのヌル文字 (\0)を加えて260というわけです。
> (Windows NT系では最大で約32,000文字までと制限が緩和されています)
そうだったんですか。
以前疑問に思って検索したんですけど結局分からなくて・・・検索の仕方が悪かったのかな。
しかもXPを使っているので260文字以上のパス名も普通に使えてたのでますます「?」になってしまって。
9x系は259文字までという制限があるからなんですね。
些細な疑問に答えていただきありがとうございました。
> Windowsの仕様でパス名は259文字までと定められており,それに文字列の終わりのヌル文字 (\0)を加えて260というわけです。
> (Windows NT系では最大で約32,000文字までと制限が緩和されています)
そうだったんですか。
以前疑問に思って検索したんですけど結局分からなくて・・・検索の仕方が悪かったのかな。
しかもXPを使っているので260文字以上のパス名も普通に使えてたのでますます「?」になってしまって。
9x系は259文字までという制限があるからなんですね。
些細な疑問に答えていただきありがとうございました。