お知恵を御貸し下さい

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

仕様の解釈

#16 投稿記事 by Tomorrow »

> ではこうするとKAZUの望む動作になりますと言いたいところですが,いまいちわかりません。
> もっと詳しくどういった動作になってほしいか書いてもらえればアドバイスのやりようもあるのですが……。
KAZUさんがおっしゃったことを勝手に解釈しますと、

(1)普段はメモ帳で*.mm2と入力し、フィルタリングした上で.mm2ファイルを開いているが、これを入力することなくフィルタリング出来ないか?(ファイル選択ダイアログで.mm2ファイルだけ見えるようにしたい。)

(2)開いた.mm2ファイル(中身はテキスト)の必要な部分だけを選択して取り出し、これを拡張子だけ変えたファイル名で保存したい。(例えば選択して右クリック -> [拡張子を変えて保存]メニューとか、[コピー]メニューでクリップボードに格納されたものを勝手にファイル化するとか。)

(3)バッチ処理(.mm2の拡張子を持つファイルを自動で開き、法則性を使って必要部分を切り出す)は、ファイルによって内容がまちまちであるため、そこまでは望まない。もしくは、次の課題とする。
とりあえず、ファイルを選び、どの部分を切り出すかは自分で決めればよい。

..てな感じになりますが、合ってますか?
KAZU

Re: 仕様の解釈

#17 投稿記事 by KAZU »

イグトランスさん、Uhspさん、Tomorrowさん
私の様な未熟者にお付き合い下さり、本当に感謝いたします。
ちょっと私の説明下手な所が皆様へ多大な迷惑をかけてると思うと言葉がありません。。。
(本当に申し訳ないです)

Tomorrowさんが書いて下さった内容が私の望んでいた動作その物に非常に近いです。
(1)普段はメモ帳で*.mm2と入力し、フィルタリングした上で.mm2ファイルを開いているが、これを入力することなくフィルタリング出来ないか?(ファイル選択ダイアログで.mm2ファイルだけ見えるようにしたい。)
※開くファイルは1つのみです。

(2)開いた.mm2ファイル(中身はテキスト)の必要な部分だけを選択して取り出し、これを拡張子だけ変えたファイル名で保存したい。(クリップボードに格納されたものを勝手にファイル化するのを希望してます。)

>(3)バッチ処理(.mm2の拡張子を持つファイルを自動で開き、法則性を使って必要部分を切り出す)は、ファイルによって内容がまちまちであるため、そこまでは望まない。もしくは、次の課題とする。
とりあえず、ファイルを選び、どの部分を切り出すかは自分で決めればよい。
(3)についてはもう仰る内容そのものです。
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

Re: 仕様の解釈

#18 投稿記事 by Sinryow »

KAZU さんが書きました:> (1)普段はメモ帳で*.mm2と入力し、フィルタリングした上で.mm2ファイルを開いているが、これを入力することなくフィルタリング出来ないか?(ファイル選択ダイアログで.mm2ファイルだけ見えるようにしたい。)
> ※開くファイルは1つのみです。
これはメモ帳の機能を変更するということですか?そうであれば無理です。

考えられる方法としては,
(A)ABで「.mm2ファイルを選択し,そのファイルをメモ帳で開くようにする」ソフトを作る。(ファイルの編集はメモ帳で行う)
(B)ABでテキストエディタそのものを作る。

(A)の方法は簡単です。ファイル選択ダイアログを呼び出して,そのファイルをShellExecuteでメモ帳から実行すればよいですので。
(B)は難しそうに見えますが,Win32プログラミング講座の11に簡単なテキストエディタのサンプルがあるので(ABの「sample」フォルダにもサンプルがある),それを改造していけば作成できます。(そうすればそのまま(2)の機能を実装することも可能ですし)

どちらの場合も,GetOpenFileName関数を呼ぶ際にOPENFILENAME構造体のlpstrFilterメンバを

コード: 全て選択

ofn.lpstrFilter=Ex"MM2 ファイル(*.mm2)\0*.mm2\0すべてのファイル(*.*)\0*\0\0"
のようにしてやればよいです。
KAZU さんが書きました:> (2)開いた.mm2ファイル(中身はテキスト)の必要な部分だけを選択して取り出し、これを拡張子だけ変えたファイル名で保存したい。(クリップボードに格納されたものを勝手にファイル化するのを希望してます。)
クリップボードからデータを取得するのは,以下を参照して下さい。
http://hira.hopto.org/win32api/program07.htm

単にエディタ中の文字の選択範囲を調べたいのであれば,EM_GETSELメッセージを用いればよいです(これとGetWindowTextLength,GetWindowTextを組み合わせて選択範囲の内容を得る)。詳細はヘルプをご覧下さい。
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
KAZU

Re: 仕様の解釈

#19 投稿記事 by KAZU »

Sinryowさん、アドバイス有難う御座います。

(1)は無理なんですね・・・EXECでメモ帳起動させてパラメータの個所へ細工すれば出来るのかな?と安易に考えてました。
そこでフィルタリングは諦めそのまま通常通りにファイル(*.mm2)を開く事にしたのですが、この開いたファイル名を保存しておいて後で又利用したい場合はどの様にしておいたら良いのでしょうか?

(2)については過去LogやWEBで調べてなんとかコード化する事が出来ました。
(ここへ載せるのも恥ずかしいのですがコードを載せた方が良いだろうと思いまして)

すいませんが宜しくお願い致します。

コード: 全て選択


'メモ帳を起動
ShellExecute(0,"open","C:\WINDOWS\notepad.exe",NULL,NULL,SW_SHOWDEFAULT)
'ここで実際に開くファイルを後で使用したいのです。
'execとShellExecuteの違いが余り良く理解出来てません

'変数の宣言
Dim s As BytePtr
Dim i As Long
Dim moji[512] As Byte

'クリップボードを開く
OpenClipboard(NULL)

'クリップボードを空にする 今の段階はクリアしない様にしてます
'EmptyClipboard()

'クリップボードの文字を取得
s = GetClipboardData(CF_TEXT)

'クリップボードの文字を表示
MessageBox( 0,s,"クリップボード",MB_OK)

'文字列をメモリにコピー
lstrcpy(moji,s)

'クリップボードを閉じる
CloseClipboard()

'クリップボードの内容をファイルに書き出し
Open "D:\test\test.mmm" For Output As #1
    for i=0 to lstrlen(moji)-1
Print #1,Chr$(moji);
next
Close #1

'保存が出来ているかどうかの確認
exec "C:\WINDOWS\notepad.exe","D:\test\test.mmm"

'メモ帳で開いたファイルを別のアプリケーションで開く(ここでは仮にWordで開くとする)
'exec "C:\Program Files\Microsoft Office\Office\WINWORD.EXE","メモ帳で開いたファイル"

End
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

Re: 仕様の解釈

#20 投稿記事 by Tomorrow »

> (1)は無理なんですね・・・EXECでメモ帳起動させてパラメータの個所へ細工すれば出来るのかな?と安易に考えてました。
> そこでフィルタリングは諦めそのまま通常通りにファイル(*.mm2)を開く事にしたのですが、この開いたファイル名を保存しておいて後で又利用したい場合はどの様にしておいたら良いのでしょうか?
無理ではないです。Sinryowさんの投稿をよく見てください。
> (A)ABで「.mm2ファイルを選択し,そのファイルをメモ帳で開くようにする」ソフトを作る。(ファイルの編集はメモ帳で行う)
> (A)の方法は簡単です。ファイル選択ダイアログを呼び出して,そのファイルをShellExecuteでメモ帳から実行すればよいですので。
> どちらの場合も,GetOpenFileName関数を呼ぶ際にOPENFILENAME構造体のlpstrFilterメンバを

コード: 全て選択

ofn.lpstrFilter=Ex"MM2 ファイル(*.mm2)\0*.mm2\0すべてのファイル(*.*)\0*\0\0"
のようにしてやればよいです。
とあります。
要するにファイルの選択(フィルタリング含む)は自前のプログラムで行って、そのファイル名を取得、その後メモ帳などに渡してファイルを開いてもらう、ということになります。
ファイル名を自分で取得するので、後で利用するのも簡単です。

とりあえずこれ↓をソースに貼り付けておき、 ↓このようにすればフィルタリングができます。

コード: 全て選択

Dim FileName[MAX_PATH] As Byte
Dim lpFil As BytePtr
lpFil=Ex"ネットリスト ファイル(*.mm2)\0*.mm2\0すべてのファイル(*.*)\0*\0\0"

'「ファイルを開く」ダイアログ ボックスを表示
If GetFileDlg(0, FileName, lpFil, TRUE) Then
	MessageBox(0,FileName,"選択されたファイルのパス",MB_OK)
End If

'プロセス終了
ExitProcess(0)
なお、この関数GetFileDlg()で取得するファイル名はフルパスです。
ファイルのタイトル名(test.mm2とか)が必要なら、
(1)ofn.lpstrFileTitleを取得できるようにする
(2)Win32API:GetFileTitle()関数を使う
(3)AB標準関数:_splitpathを使う
のどれかを試してください。

> 'メモ帳を起動
> ShellExecute(0,"open","C:\WINDOWS\notepad.exe",NULL,NULL,SW_SHOWDEFAULT)
> 'ここで実際に開くファイルを後で使用したいのです。
> 'execとShellExecuteの違いが余り良く理解出来てません
ヘルプセンターを見れば大体のことが書いてありますが、

lpOperationに "open" を指定し、lpFileにファイルのパス名を指定すれば、エクスプローラ上でファイルをダブルクリック、または右クリック→[開く]を選択したときと同じ動作をします。(拡張子に関連付けられたアプリで開く)

コード: 全て選択

ShellExecute(0,"open",FileName,NULL,NULL,SW_SHOW)
メモ帳など、特定のアプリで開くなら、lpFileに実行ファイルを指定し、lpParametersにファイルパスを指定します。

コード: 全て選択

ShellExecute(0,"open","notepad",FileName,NULL,SW_SHOW)
ちょうどコマンドプロンプトで

コード: 全て選択

C:\>notepad "ファイルのパス"
などと入力したときとほぼ同じと考えてよいです。
KAZU

皆様有難う御座いました

#21 投稿記事 by KAZU »

Tomorrowさんお礼が遅くなりすみません
皆様から頂いたアドバイスのお陰で何とか本来の目的の物が出来ました。

イグトランスさん、Uhspさん、Sinryowさん、Tomorrowさん
本当にお世話になりました。
大変良い勉強をさせて頂きました。

イグトランスさんの書かれた"ExecAndWait"のコードを過去logで拝見させて頂いて利用させて頂きました。
素晴らしいコードを有難う御座いました。

最後に参考までに教えて頂けたらあり難い事があるのですが、
DOSプロンプトで実行されるプログラムへはどうやったら開きたいファイルを渡せるのでしょうか?
(DOSで実行するプログラムで開きたいファイルが渡せない)
windowsアプリと同じ様には開く事が出来ないものでしょうか?

コード: 全て選択


Dim FileName[MAX_PATH] As Byte
Dim lpFil As BytePtr
lpFil=Ex"ネットリスト ファイル(*.mm2)\0*.mm2\0すべてのファイル(*.*)\0*\0\0"

'「ファイルを開く」ダイアログ ボックスを表示
If GetFileDlg(0, FileName, lpFil, TRUE) Then
    MessageBox(0,FileName,"選択されたファイルのパス",MB_OK)
End If

ShellExecute(0,"open","DOSの実行ファイル",FileName,NULL,SW_SHOW)
上記のコードでそのまま開けるかと思ったのですが駄目だったので。
KAZU

自己解決しました。

#22 投稿記事 by KAZU »

すいません、馬鹿な質問をして。
DOSでは空白を使用したフォルダーは駄目だったのを忘れてました。
返信する