ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月28日(木) 19:03

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2006年6月13日(火) 15:26 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
GetWindowTextStrやGetDlgItemStrの要領で文字列を結果として返すラッパを投稿していきます。
コード:
TypeDef GetStr_GetLenProc = *Function(pv As VoidPtr) As DWord
TypeDef GetStr_GetStrProc = *Function(pv As VoidPtr, buf As *Byte, len As DWord) As DWord

Function GetString(pv As VoidPtr, pfnGetLen As GetStr_GetLenProc, pfnGetStr As GetStr_GetStrProc) As String
	Dim len As DWord
	len = pfnGetLen(pv)
	If len = 0 Then Exit Function
	GetString = ZeroString(len)
	len = pfnGetStr(pv, StrPtr(GetString), len)
#ifdef _AB_VER5
	GetString.Length = len
#else
	SetDWord(StrPtr(GetString) - SizeOf (DWord), len)
#endif
End Function
本来ならクラスを使ってやりたいところですが,抽象メンバ関数が無いので,通常の関数と関数ポインタを使っていますが,
それさえ目をつぶればテンプレートメソッドパターンになっているはずです。

とにかくこれ単独で使うのではなく,実際のラッパは次以降です。

2006/09/29 AB5に対応させました。


最後に編集したユーザー イグトランス [ 2006年9月29日(金) 09:45 ], 累計 1 回

通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月13日(火) 15:32 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
というわけで,まずはDragQueryFileのString版,
DragQueryFileStrです。
ようするにGetStr_GetLenProcは文字列の長さを返す関数で,
GetStr_GetStrProcは実際に文字列を得てさらに新たな長さを返すような関数であればよいのです。
そうすればGetStringがZeroStringを呼んだり文字列の長さを調整したりなどといった雑用をこなしてくれます。


通報する
ページトップ
 記事の件名: IDListとSHBrowseForFolder
投稿記事Posted: 2006年6月13日(火) 17:06 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
次はIDListからパス文字列へ変換するSHGetPathFromIDListのラッパ、IDListToPathStrと
それを使ってフォルダ選択ダイアログの結果をStringで返すBrowseForFolder_Strです。
なんの面白みも無いですが,使用例です。
コード:
Dim folderPath As String
folderPath = BrowseForFolder_Str(hMainWnd, "フォルダの選択", BIF_RETURNONLYFSDIRS)
MessageBox(hMainWnd, StrPtr(folderPath), "選択したフォルダのパス", MB_OK)
BrowseForFolder_Strは最初の引数がウィンドウハンドル,次にダイアログのタイトル,最後にフラグ指定の引数としました。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年9月29日(金) 09:55 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
GetWindowTextStrの焼き直しです。GetWindowTextLengthはちょうど引数が一致するので直接渡しています。
GetWindowTextは微妙に引数が異なるので,そうは行きませんでした。
コード:
Function GetWindowTextStr(hwnd As HWND) As String
	GetWindowTextStr = GetString(hwnd, 
		GetProcAddress(GetModuleHandle("user32"), "GetWindowTextLengthA"),
		AddressOf(GetWindowTextBufLen))
End Function

Function GetDlgItemTextStr(hDlg As HWND, idDlgItem As Long) As String
    GetDlgItemTextStr = GetWindowTextStr(GetDlgItem(hDlg, idDlgItem)) 
End Function

Function GetWindowTextBufLen(hwnd As HWND, p As *Byte, len As Long) As Long
    GetWindowTextBufLen = GetWindowText(hwnd, p, len + 1)
End Function
平成18年11月04日修正しました。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Google [Bot] & ゲスト[6人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean