Excelのマクロ程度しか経験無いんですが、Officeソフトに依存しないアプリ
を作ってみたく、AB4.24で奮闘してます。
ヘルプ見まくって、あと少しなんですが、教えて下さい。
(投稿も初めてなので、見にくい・書き方が変・わかりにくいなどはごめんなさい)
【作っているもの】
概要
ファイル名の先頭に"@"が付いているファイル(@○○○.csv など)のみ、
@マーク無しのファイル名に変更する・・・というのを作成しています。
動作の詳細
1.CommandButton1
1-1.ボタンを押すと、フォルダ選択画面が出るのでフォルダを選択しOKを押す。
1-2.フォルダが選択された場合は、EDITBOX1にパスが入力される。
キャンセルが押された場合は、メッセージ表示。
1-3.そして、そのフォルダ内にあるファイル名を検索しEDITBOX2に表示する。
(10個ファイルがあれば、10個縦に改行して表示)
2.CommandButton2
2-1.ボタンを押すと、パスの場所(上記で選択したフォルダ)の中で、
「@○○○.csv」など、名前の先頭に"@"マークの付いたファイルを検索
2-2.見つかった場合は、@○○○.csv ⇒ ○○○.csv などの様に、
@マークを削除したファイル名に変換する。
2-3.結果をメッセージで表示
という動きになります。
※フォルダ選択画面は、Win32プログラム講座のDLLを作る・・・を
そのままパクリで使いました。
(DLLファイル自体は、作成中のプロジェクトエディタのフォルダと同階層に
置いてあります)
動き自体は完成し、デバッグ・デバッグコンパイル・リリースコンパイルまでは
問題なく終了し、動作も希望どおりきちんと動きます。(エディタ上では・・・)
ですが、その後のexeファイル実行で行き詰まっていますので、ご助力下さい。
【エラー状況】
1.リリースコンパイルした○○○.exeを実行すると、メインウィンドが開き、
CommandButton1を押すと、フォルダ選択画面が開きます。
フォルダを選択してOKを押すと、本来EDITBOX1にパスを、EDITBOX2に
ファイル一覧が入力されるんですが、下文のエラーが出ます。
⇒「アプリケーションエラー
"0x77fcc2c0"の命令が、"0x8366835c"のメモリを参照しました。
メモリが"written"になる事はありませんでした」
と異常メッセージが出て、exeファイルが強制終了します。
いまはとりあえず、素人作りで、プログラムの作り方がおかしい所が多々
あるかと思いますので、チェック・ご指摘頂けないでしょうか?
全部のMainWnd.sbpを載せました。
書き方が悪い・順番が悪い・何かの設定が出来ていないなど・・・
よろしくお願いします。
また、フォルダ選択用のDLL(GetFolderDlg)を作った(パクリですが・・・)あと、
ファイルをどこに置くとか、どうやって呼び出すとかも合わせて教えて下さい。
※プロジェクトエディタの階層にある作ったexeを起動すると、起動するんですが、
そのexeをデスクトップなど、他の場所に移動したら、
「ダイナミックライブラリーが指定されたパス・・・・・・・・・・・・・・・(何か沢山)
にありません」というメッセージが出ます。
これも作り方?とかの問題かと思い、合わせて教えて頂けると助かります。
ヘルプを探しましたが、どこに置くとかが探しきれずで・・・。
ちなみに小生、会社のPCしか持っていない為、ご返信が遅れる可能性大です。
申し訳ありませんが、助けて下さい。
(あっ、パソコンは、Windows2000 sp-4 で、ABは 4.24です)
長々と書いて申し訳ありませんが、よろしくお願い致します。
コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
del_atmk_DestroyObjects()
PostQuitMessage(0)
End Sub
'処理フォルダの選択
Sub MainWnd_CommandButton1_Click()
Declare Function GetFolderDlg Lib "FileDlg.dll" (
hWnd As Long,
lpFolder As BytePtr) As Long
Dim i As Long
Dim buf As String
Dim FileFilter As String
Dim hEdit As HWND
buf = ZeroString( MAX_PATH )
FileFilter = "すべてのファイル(*.*)" + Chr$(0) + "*" + Chr$(0)
' エディットボックスのハンドルを取得
hEdit = GetDlgItem( hMainWnd, EditBox1 )
'「フォルダの参照」ダイアログを表示
i = GetFolderDlg( 0, StrPtr( buf ) )
If i Then
' SetWindowText( GetDlgItem( hMainWnd, EditBox1 ), StrPtr( buf ) )
SetDlgItemText( hMainWnd, EditBox1, buf )
Else
MessageBox( hMainWnd, "フォルダは選択されませんでした。","キャンセル",MB_OK )
Exit Sub
End If
Dim path As String
Dim File As WIN32_FIND_DATA
Dim SearchHandle As HANDLE
Dim SearchPath As String
Dim SearchFile As String
Dim Stetas As Long
Dim HitName As String
Dim edb As String
Dim CRLF As String
GetWindowText( GetDlgItem( hMainWnd, EditBox1 ), path, 255 )
SearchPath = StrPtr( path )
SearchFile = SearchPath + "\" + "*"
SearchHandle = FindFirstFile( SearchFile, File )
Do
If File.dwFileAttributes <> FILE_ATTRIBUTE_DIRECTORY Then
HitName = File.cFileName
CRLF = Ex"\r\n"
edb = edb + HitName + CRLF
SetDlgItemText( hMainWnd, EditBox2, edb )
End If
Stetas = FindNextFile( SearchHandle, File )
If Stetas = FALSE Then
FindClose( SearchHandle )
Exit Do
End If
Loop
End Sub
Function lstrrchr( pBuffer1 As BytePtr, bSearch2 As Byte ) As BytePtr
lstrrchr = _lstrrchr( pBuffer1, _
pBuffer1 + lstrlen(pBuffer1), _
bSearch2 )
End Function
Sub MainWnd_CommandButton2_Click()
Dim path As String
Dim File As WIN32_FIND_DATA
Dim SearchHandle As HANDLE
Dim SearchPath As String
Dim SearchFile As String
Dim Stetas As Long
Dim HitName As String
Dim OldName As String
Dim OldPath As String
Dim NewName As String
Dim NewPath As String
Dim msgname As String
Dim HenkanOK As Long
Dim HenkanNG As Long
GetWindowText( GetDlgItem( hMainWnd, EditBox1 ), path, 255 )
SearchPath = StrPtr( path )
SearchFile = SearchPath + "\" + "*"
SearchHandle = FindFirstFile( SearchFile, File )
HenkanOK = 0
HenkanNG = 0
Do
If File.dwFileAttributes <> FILE_ATTRIBUTE_DIRECTORY Then
HitName = File.cFileName
If Left$(HitName, 1) = "@" Then
'変更前ファイル名の取得
OldName = HitName
OldPath = SearchPath + "\" + OldName
'変更後ファイル名(@無し)の取得
NewName = Mid$(HitName,2)
NewPath = SearchPath + "\" + NewName
'ファイル名の変更
If MoveFile( OldPath, NewPath ) = TRUE Then
HenkanOK = HenkanOK + 1
Else
HenkanNG = HenkanNG + 1
End If
End If
End If
Stetas = FindNextFile( SearchHandle, File )
If Stetas = FALSE Then
FindClose( SearchHandle )
Exit Do
End If
Loop
If HenkanOK > 0 and HenkanNG = 0 Then
msgname = "「@ マーク」付きファイル " + Str$( HenkanOK ) + "個 を変換しました。"
MessageBox ( 0, msgname, "完了", MB_OK )
ElseIf HenkanOK = 0 and HenkanNG > 0 Then
msgname = "該当ファイル全て( " + Str$( HenkanNG ) + "個 )同名がありましたので変換できませんでした。"
MessageBox ( 0, msgname, "完了", MB_OK )
ElseIf HenkanOK > 0 and HenkanNG > 0 Then
msgname = Str$( HenkanOK ) + Ex" 個のファイルは変換しましたが、\r\n" + Str$( HenkanNG ) + " 個は同名がありましたので変換できませんでした。"
MessageBox ( 0, msgname, "完了", MB_OK )
ElseIf HenkanOK = 0 and HenkanNG = 0 Then
MessageBox ( 0, "@マーク付きのファイルはありませんでした ・・・(-_-;)", "完了", MB_OK )
End If
End Sub