FreeBASIC マニュアルのトップに戻る

FreeBASIC ファイルを検索してアプリで開く

目次→フォーラム→FreeBASIC→補足fbedit - Revision 84: /Code/Samples/Samples/FindFile←オリジナル・サイト

SendDlgItemMessage, ShellExecute 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

ファイルを検索  このページは、FbEdit の下記サンプル・プロジェクトのコメントを日本語化したものです。
FbEdit\Projects\Samples\FindFile

 プログラムの内容は、
フォルダと拡張子を指定して、ファイルを検索します。そして、画面に一覧されたファイルから、特定のファイル名を「ダブル・クリック」すると、その拡張子に関連付けられたアプリでファイルを開く、
というものです。

「FindFileJP」という名前のフォルダに、以下の4つのファイルを保存して下さい。
FindFileJP.Bas
FindFileJP.Bi
FindFileJP.fbp
FindFileJP.Rc
このプロジェクト全てをダウンロードできます。→ FindFileJP.zip

FindFileJP.fbp (プロジェクト・ファイル)
[Project]
Version=3
Api=fb (FreeBASIC),win (Windows)
Description=Find file
Grouping=1
AddMainFiles=1
AddModuleFiles=1
ResExport=
CompileIfNewer=0
IncVersion=0
[Make]
Recompile=0
Module=Module Build,fbc -c
Current=1
1=Windows GUI,fbc -s gui
2=Windows GUI (Debug),fbc -s gui -g
Output=
Run=
Delete=*.obj
[File]
1=FindFileJP.Bas
2=FindFileJP.Bi
3=FindFileJP.Rc
[BreakPoint]
1=
2=
[FileInfo]
1=0,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2=0,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
3=0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
[NoDebug]
[TabOrder]
TabOrder=1,2,3

FindFileJP.Bas メイン・プログラム
/'
	このアプリは、スレッドを使ってハードドライブの *.txt ファイルをスキャンします。 
	見つかったファイルはリストボックスに追加されます。 
	ファイルをダブルクリックすると開きます。
'/

#Include Once "windows.bi"
#Include Once "win/shellapi.bi"

#Include "FindFileJP.bi"  'パスを変更

Sub FindFiles(ByVal sFile As String)
	Dim wfd As WIN32_FIND_DATA
	Dim hwfd As HANDLE
	Dim sPath As String

	' Get path from sFile
	i=InStrRev(sFile,"\")
	If i Then
		sPath=Left(sFile,i)
	EndIf
	' FindFileJP.bi で指定したパスにある、指定拡張子(*.txt)のファイルを見つける
	hwfd=FindFirstFile(sFile,@wfd)
	If hwfd<>INVALID_HANDLE_VALUE Then
		While TRUE
			If (wfd.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY)=0 Then
				' ファイルが見つかりました。*.txt ファイルですか?
				If LCase(Right(wfd.cFileName,4))=szFilter Then
					' それをリストボックスに追加します
					szTmp=sPath & wfd.cFileName
					i=SendDlgItemMessage(hWnd,IDC_LSTFILES,LB_ADDSTRING,0,Cast(LPARAM,@szTmp))
					' 件数を更新します
					SetDlgItemInt(hWnd,IDC_STCFILES,i,FALSE)
				EndIf
			Else
				' 新しいパスを見つけます
				If wfd.cFileName<>"." And wfd.cFileName<>".." Then
					' このパスをスキャンするため自分自身を呼び出します(再帰呼び出し)
					szTmp=sPath & wfd.cFileName & "\*.*"
					FindFiles(szTmp)
				EndIf
			EndIf
			If FindNextFile(hwfd,@wfd)=FALSE Then
				' このパスにはファイルがありません
				Exit While
			EndIf
		Wend
		' 検索ハンドルを閉じます
		FindClose(hwfd)
	EndIf

End Sub

Function ThreadProc(ByVal hWin As HWND) As Integer
	Dim hCtl As HWND
	Dim buff As ZString*MAX_PATH

	' リストボックスを消去する
	hCtl=GetDlgItem(hWin,IDC_LSTFILES)
	SendMessage(hCtl,LB_RESETCONTENT,0,0)
	' 検索するパスを取得する
	GetDlgItemText(hWin,IDC_EDTPATH,@buff,SizeOf(buff))
	If Right(buff,1)="\" Then
		buff=buff & "*.*"
	Else
		buff=buff & "\*.*"
	EndIf
	' 検索するファイルを取得する
	GetDlgItemText(hWin,IDC_EDTFILE,@szFilter,SizeOf(szFilter))
	szFilter=Mid(LCase(szFilter),2)
	' ファイルを見つける
	FindFiles(buff)
	' [開始] ボタンを表示する
	hCtl=GetDlgItem(hWin,IDC_BTNSTOP)
	ShowWindow(hCtl,SW_HIDE)
	hCtl=GetDlgItem(hWin,IDC_BTNSTART)
	ShowWindow(hCtl,SW_SHOW)
	' スレッドハンドルを閉じる
	CloseHandle(hThread)
	hThread=0
	' スレッドを終了する
	Return 0

End Function

Function DlgProc(ByVal hWin As HWND,ByVal uMsg As UINT,ByVal wParam As WPARAM,ByVal lParam As LPARAM) As Integer
	Dim As Integer id,Event,nInx
	Dim hCtl As HWND
	Dim rect As RECT
	Dim buff As ZString*MAX_PATH

	Select Case uMsg
		Case WM_INITDIALOG
			hWnd=hWin
			SendDlgItemMessage(hWin,IDC_EDTPATH,EM_LIMITTEXT,64,0)
			SetDlgItemText(hWin,IDC_EDTPATH,@szDefPath)
			SendDlgItemMessage(hWin,IDC_EDTFILE,EM_LIMITTEXT,16,0)
			SetDlgItemText(hWin,IDC_EDTFILE,@szDefFile)
			'
		Case WM_CLOSE
			EndDialog(hWin, 0)
			'
		Case WM_COMMAND
			id=LoWord(wParam)
			Event=HiWord(wParam)
			Select Case Event
				Case BN_CLICKED
					Select Case id
						Case IDOK
							' End the app
							If hThread Then
								' スレッドがまだ実行中の場合は、終了します
								TerminateThread(hThread,0)
								CloseHandle(hThread)
							EndIf
							EndDialog(hWin, 0)
							'
						Case IDC_BTNSTART
							' スレッドを作成する
							hThread=CreateThread(NULL,NULL,Cast(Any Ptr,@ThreadProc),hWin,NORMAL_PRIORITY_CLASS,@id)
							' [停止] ボタンを表示します
							hCtl=GetDlgItem(hWin,IDC_BTNSTART)
							ShowWindow(hCtl,SW_HIDE)
							hCtl=GetDlgItem(hWin,IDC_BTNSTOP)
							ShowWindow(hCtl,SW_SHOW)
							'
						Case IDC_BTNSTOP
							' スレッドを終了し、[開始] ボタンを表示します
							TerminateThread(hThread,0)
							CloseHandle(hThread)
							hThread=0
							hCtl=GetDlgItem(hWin,IDC_BTNSTOP)
							ShowWindow(hCtl,SW_HIDE)
							hCtl=GetDlgItem(hWin,IDC_BTNSTART)
							ShowWindow(hCtl,SW_SHOW)
							'
					End Select
					'
				Case LBN_DBLCLK
					' リストボックスでファイル名をダブルクリックすると、ファイルを取得してアプリで表示する
					nInx=SendDlgItemMessage(hWin,IDC_LSTFILES,LB_GETCURSEL,0,0)
					SendDlgItemMessage(hWin,IDC_LSTFILES,LB_GETTEXT,nInx,Cast(LPARAM,@buff))
					' 拡張子にひも付けられたアプリでファイルを開く
					ShellExecute(hWin,@szOpen,@buff,NULL,NULL,SW_SHOWNORMAL)
					'ShellExecute(hWin,StrPtr("Open"),@buff,NULL,NULL,SW_SHOWNORMAL)
					'https://msdn.microsoft.com/ja-jp/library/cc422072.aspx
					'
			End Select
		Case WM_SIZE
			' Size and move the controls
			GetClientRect(hWin,@rect)
			hCtl=GetDlgItem(hWin,IDC_EDTPATH)
			MoveWindow(hCtl,0,0,rect.right-100,22,TRUE)
			hCtl=GetDlgItem(hWin,IDC_EDTFILE)
			MoveWindow(hCtl,rect.right-100,0,100,22,TRUE)

			hCtl=GetDlgItem(hWin,IDC_LSTFILES)
			MoveWindow(hCtl,0,25,rect.right,rect.bottom-40-25,TRUE)
			hCtl=GetDlgItem(hWin,IDOK)
			MoveWindow(hCtl,rect.right-100,rect.bottom-35,97,31,TRUE)
			hCtl=GetDlgItem(hWin,IDC_BTNSTART)
			MoveWindow(hCtl,rect.right-200,rect.bottom-35,97,31,TRUE)
			hCtl=GetDlgItem(hWin,IDC_BTNSTOP)
			MoveWindow(hCtl,rect.right-200,rect.bottom-35,97,31,TRUE)
			hCtl=GetDlgItem(hWin,IDC_STCFILES)
			MoveWindow(hCtl,0,rect.bottom-30,75,16,TRUE)
			'
		Case Else
			Return FALSE
			'
	End Select
	Return TRUE

End Function

'''
''' プログラム開始
'''
	''
	'' ダイアログを生成
	''
	hInstance=GetModuleHandle(NULL)
	DialogBoxParam(hInstance,Cast(ZString Ptr,IDD_DLG1),NULL,@DlgProc,NULL)
	''
	'' プログラムは終了
	''
	ExitProcess(0)
	End
'''
''' プログラム終了
'''

FindFileJP.Bi ヘッダーファイル
#Define IDD_DLG1		1000
#Define IDC_BTNSTART	1003
#Define IDC_BTNSTOP	1001
#Define IDC_LSTFILES	1002
#Define IDC_STCFILES	1004
#Define IDC_EDTPATH	1005
#Define IDC_EDTFILE	1006

Dim Shared hInstance As HMODULE
Dim Shared hWnd As HWND
Dim Shared hThread As HANDLE
Dim Shared szTmp As ZString*MAX_PATH
Dim Shared szFilter As ZString*16
Dim Shared i As Integer
Const szDefPath="D:\temp"  'デフォルト・パス
Const szDefFile="*.txt"    'デフォルト拡張子
Const szOpen="Open"

FindFileJP.Rc リソースファイル
#define IDD_DLG1 1000
#define IDC_BTNSTOP 1001
#define IDC_LSTFILES 1002
#define IDC_BTNSTART 1003
#define IDC_STCFILES 1004
#define IDC_EDTPATH 1005
#define IDC_EDTFILE 1006

IDD_DLG1 DIALOGEX 6,5,195,107
CAPTION "ファイルを検索"
FONT 8,"MS Sans Serif",400,0,0
STYLE 0x16CF0800
BEGIN
  CONTROL "",IDC_EDTPATH,"Edit",0x50010000,0,0,147,12,0x00000200
  CONTROL "",IDC_LSTFILES,"ListBox",0x50210141,0,15,195,69,0x00000200
  CONTROL "0",IDC_STCFILES,"Static",0x50000002,0,90,39,12
  CONTROL "開始",IDC_BTNSTART,"Button",0x50010000,43,87,64,19
  CONTROL "停止",IDC_BTNSTOP,"Button",NOT 0x10000000|0x40010000,54,87,64,19
  CONTROL "終了",IDOK,"Button",0x50010000,126,87,64,19
  CONTROL "",IDC_EDTFILE,"Edit",0x50010000,153,0,42,12,0x00000200
END
 
補足 に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2016-11-11 20:00
日本語翻訳:WATANABE Makoto、原文著作者:KetilO

ホームページのトップに戻る

表示-非営利-継承