はじめまして。教えて下さい。

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
つっちー

はじめまして。教えて下さい。

#1 投稿記事 by つっちー »

はじめまして。
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

つっちー

一部解決しました。

#2 投稿記事 by つっちー »

長々と書いたあと、いろいろ弄っていました・・・。

何やら、「SetDlgItemText」で、フォルダの情報をEDITBOX2に送る所
でエラーが出る(コメントアウトするとエラーにならない・・・)みたいで、
いろいろ弄ってとりあえずエラーが出ない様になりました。

ただ、そのexeファイルをコピーなどして、場所を変えて実行すると、
「DLLが指定された場所に見つかりません・・・」というメッセージが出ます。

作成したDLLファイルの設定
・DLLファイルの置きばはどこか
・呼び出しのプログラムはどこに記述するのか など・・・
教えて下さい。

エラーメッセージでは、たくさんのアドレスがズラ~っと出るんですが、
DLLをどこに探しにいくっていう設定とか命令とかあるんでしょうか?

大したものでは無いんですが、完成したら職場数人にこのexeを上げたいので、
DLLを配布するにしても、「DLLファイルはここに置いて下さい」とかは把握
したいので、よろしくお願いします。
つっちー

解決しました m(_ _)m

#3 投稿記事 by つっちー »

独り善がりで、すみません・・・

DLLは、c:\Windows\system とかにいれればよかったんですね・・・

エラーメッセージに出てたので、試したら動きました。

お騒がせしました。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#4 投稿記事 by konisi »

いえ、確かDLLは実行ファイルと同じディレクトリでもいいはずなのですが。

それと眺めてて思ったんですが、

コード: 全て選択

    SearchPath = StrPtr( path )
    SearchFile = SearchPath + "\" + "*"
    SearchHandle = FindFirstFile( SearchFile, File )
これ、こっちの間違いでは?

コード: 全て選択

    SearchPath = path
    SearchFile = SearchPath + "\" + "*"
    SearchHandle = FindFirstFile( StrPtr(SearchFile), File )
#String型は単純な文字操作なら楽に書けるのですが、Win32APIとか使う時はBytePtr型の方がやりやすいと感じてしまいます。
#それにしても、Subの中でDeclareって使えたんですね。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
つっちー

ご指摘ありがとうございます。

#5 投稿記事 by つっちー »

konisi どの
ご指摘感謝致します。

DLLの場所の件ですが、最初はexeファイルだけ配る気だったんですが、
無理だとわかりました。
場所については、同フォルダ内でもOKなのは、確認させて頂きましたが、
配ったあと、各自がexeファイルだけを好きな場所に移しても良い様に、
c:\windows\systemなどの弄らない場所に最初に保存してもらえば
DLLを移動し忘れる事無いかな~と思い、場所の一つとして書かせて頂きました。

又、
SearchPath = StrPtr( path )
SearchFile = SearchPath + "\" + "*"
SearchHandle = FindFirstFile( SearchFile, File )

SearchPath = path
SearchFile = SearchPath + "\" + "*"
SearchHandle = FindFirstFile( StrPtr(SearchFile), File )
の間違いとの指摘ですが、試してみました。
多分作り方がおかしいのかと・・・思いますが、CommandButton1内の命令では
ご指摘の様にすると、EDITBOX2の一覧内にデータが表示されない・・・という
状況になりました・・・。ので、元のままとさせて頂きました。
※現在は、CommandButton2を実行したら、結果をEDITBOX3に一覧表記
する様に変えてありますが、こちらではご指摘の方法でもOKでした・・・。

その又、
If MoveFile( OldPath, NewPath ) = TRUE Then

If MoveFile( OldPath, NewPath ) Then
だとの指摘、ExcelマクロのIF文表記で、何々が何々なら・・・の表記
になれてしまって、つい"=TRUE"を書いてしまいました。
IF文でも、=TRUEとか書いてない所は、ヘルプや掲示板のコピーで、
=TRUEを書いている所は、自分で書いていると思われます・・・(笑)

あとの、StrPtrの追記などは修正させて頂き、より良いものが出来た事
感謝致します。

追伸
>それにしても、Subの中でDeclareって使えたんですね。
ってのは、僕にはわかりません・・・(笑)
どこに入れていいかわからずで、いろんな所に入れてみて、デバッグでエラー
にならない場所に入れてみた結果なので・・・
作り方はまるっきりの素人&ヘルプなどからのコピペ=エラーにならなければ
まずはOKって感じなので、動きますが、正規表記じゃないかも・・・です。

解決レス(一応)だったのに、ご丁寧にありがとうございました。
(まだ会社で、これから帰宅です・・・)
ゲスト

#6 投稿記事 by ゲスト »

DLLの場所の件ですが、最初はexeファイルだけ配る気だったんですが、
無理だとわかりました。
場所については、同フォルダ内でもOKなのは、確認させて頂きましたが、
配ったあと、各自がexeファイルだけを好きな場所に移しても良い様に、
c:\windows\systemなどの弄らない場所に最初に保存してもらえば
DLLを移動し忘れる事無いかな~と思い、場所の一つとして書かせて頂きました。
このプログラム程度であれば無理にDLLを使うまでもないのでは?
※フォルダ選択画面は、Win32プログラム講座のDLLを作る・・・を
そのままパクリで使いました。
とのことなので講座からGetFolderDlgの本体(FunctionからEnd Functionまで)をコピってきて

コード: 全て選択

' TODO: この位置にグローバルな変数、(ry
以下に貼り付けてしまえばDLLはいらなくなります。

もちろんDeclareの方は消すのを忘れないでください。

あと、
又、
SearchPath = StrPtr( path )
SearchFile = SearchPath + "\" + "*"
SearchHandle = FindFirstFile( SearchFile, File )

SearchPath = path
SearchFile = SearchPath + "\" + "*"
SearchHandle = FindFirstFile( StrPtr(SearchFile), File )
の間違いとの指摘ですが、試してみました。
多分作り方がおかしいのかと・・・思いますが、CommandButton1内の命令では
ご指摘の様にすると、EDITBOX2の一覧内にデータが表示されない・・・という
状況になりました・・・。ので、元のままとさせて頂きました。
※現在は、CommandButton2を実行したら、結果をEDITBOX3に一覧表記
する様に変えてありますが、こちらではご指摘の方法でもOKでした・・・。
についてですが、

コード: 全て選択

Dim path As String
は領域が確保されてない気がするのですが。

コード: 全て選択

Dim path[254] As Byte
とかの方がよくないですか?
つっちー

またまた、ご指摘ありがとうございます。

#7 投稿記事 by つっちー »

返信遅れ申し訳ないです。
(会社でしかPCを持っていないもので・・・)

ゲストどの
夜中のレス、わざわざありがとうございます。
DLLの件、なんとその様にすれば良いんですか!(>_<)
ご丁寧に分かり易く書いて頂いて感謝です。
どこに何を明記するか、良く分からないまま作っていたので・・・(-_-;)
※これで当初の予定通り、1ファイルの配布で済みそうです。

pathの件、修正させて頂きます・・・。
今会社でPC使えてますが、職場で使用しているPCではないので、作った
ファイルがありません。
月曜日、職場に戻ったら、DLLの件も含め、修正してみます。

ありがとう御座いました。
返信する