お知恵を御貸し下さい

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: お知恵を御貸し下さい

自己解決しました。

by KAZU » 2005年12月02日(金) 22:05

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

皆様有難う御座いました

by KAZU » 2005年12月02日(金) 21:06

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)
上記のコードでそのまま開けるかと思ったのですが駄目だったので。

Re: 仕様の解釈

by Tomorrow » 2005年12月01日(木) 00:46

> (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 "ファイルのパス"
などと入力したときとほぼ同じと考えてよいです。

Re: 仕様の解釈

by KAZU » 2005年11月28日(月) 14:04

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

Re: 仕様の解釈

by Sinryow » 2005年11月27日(日) 22:36

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を組み合わせて選択範囲の内容を得る)。詳細はヘルプをご覧下さい。

Re: 仕様の解釈

by KAZU » 2005年11月27日(日) 10:49

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

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

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

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

仕様の解釈

by Tomorrow » 2005年11月27日(日) 01:07

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

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

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

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

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

by イグトランス » 2005年11月27日(日) 00:09

> その結果指定したフォルダにある全てのtxtファイルが開かれてしまったのですが・・・
はい,そのように作ってあります。
あれはその直前のUhspさんのHSPのコードを(前に書いたとおり山勘ですが)ABに移してみただけのものです。

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

SHGetSpecialFolderPathのエラーですが,私の最初のレスにも書いたこれをコードに含めてください。

コード: 全て選択

Declare Function SHGetSpecialFolderPath Lib "Shell32" Alias "SHGetSpecialFolderPathA" (
    hwndOwner As HWND,
    pszPath As *Char,
    nFolder As Long,
    fCreate As Long
) As Long

by Uhsp » 2005年11月26日(土) 22:55

 イグトランスさんのコードを実行した結果が期待するもので無い場合
私は解釈をあやまっています。

 趣旨は"*mm2"のファイルをnotepadで開いて手動で必要部分を別ファイル
に保存するのに"*.mm2"を簡単に選別・取得したいでしょうか?。

一応ActiveBasicの操作方法。
1.projecteditor.exe を起動する。
2.「ファイル」「新規作成」「プロジェクト」を選択。
3.「プロジェクト名」「ディレクトリ」を入力「次へ」。
4.「次へ」「完了」。
5.初期画面の「コントロール」5っ目の「リストボックス」をクリック。
6.ウインドウ画面の適当な位置でクリック&ドラッグ(サイズ調整)。
7.「コントロール」2段1っ目の「ボタン」をクリック。
8.ウインドウ画面の適当な位置でクリック&ドラッグ(サイズ調整)。
9.ウインドウ画面に配置した「ボタン」をダブルクリック。
10.切り替わったコード編集画面のSub MainWnd_CommandButton1_Click()の
 コードを入れ替える。
11.Declare Function SHGetSpecialFolderPath...とConst CSIDL_PERSONALを
 最下行の余白に貼り付ける。
12.メニューバー「!」で実行しボタンをクリック。

 なおイグトランスさんのコードも11.を行えば動作すると思います。
(マイドキュメントの位置を補間しているだけなので既知のディレクトリなら不要)

 さらにマスクが"*.*"なのでディレクトリにファイルがあれば何でも
先頭のファイルをnotepadで開いてしまいます、必要なら"*.mm2"に変更して
下さい。

by KAZU » 2005年11月26日(土) 19:49

UhspさんもわざわざAB用にコードを有難う御座います。
(HSPでやると本当に短くて済むんですね)

> RADでリストボックスとボタンコントロールを貼り付け
> ボタンコントロールに下記のコードとグローバル領域にDeclear・Constを
> 貼り付けてください。
お叱りは承知の上で書くのですが出来ましたら実行可能なコードでお願い出来ないでしょうか?
RADなどが良く理解出来てないもので・・・

by KAZU » 2005年11月26日(土) 19:18

イグトランスさん、コードを有難う御座います。
早速試してみたのですが”SHGetSpecialFolderPath”でエラーになってしまったので、
SetCurrentDirectoryでその他のフォルダを指定後
"\*.txt"→"*.txt"に変更し動かしてみました。
その結果指定したフォルダにある全てのtxtファイルが開かれてしまったのですが・・・

>

コード: 全て選択

#strict
> 
> Dim Target[MAX_PATH] As Char 
> SHGetSpecialFolderPath(0, Target, CSIDL_PERSONAL, FALSE)
> SetCurrentDirectory(Target)
> lstrcat(Target, "\*.txt")
> 
> Dim fd As WIN32_FIND_DATA
> Dim hFind As HANDLE
> hFind = FindFirstFile(Target, fd)
> Do
> 	Exec "notepad", fd.cFileName
> Loop While FindNextFile(hFind, fd)
> FindClose(hFind)

by Uhsp » 2005年11月26日(土) 18:51

ActiveBasicで似せるとこんな感じでしょうか?。
RADでリストボックスとボタンコントロールを貼り付け
ボタンコントロールに下記のコードとグローバル領域にDeclear・Constを
貼り付けてください。

コード: 全て選択


Declare Function SHGetSpecialFolderPath Lib "shell32.dll" _
           Alias "SHGetSpecialFolderPathA" ( _
         hwndOwner as Long,lpszPath as String,nFolder as Long,
         fCreate as Long) as Long
Const CSIDL_PERSONAL = &H5

Sub MainWnd_CommandButton1_Click()
Dim Dn as String 
Dim Nn as Long
Dim Fn as String
    Dn = ZeroString(MAX_PATH)
         SHGetSpecialFolderPath(0,Dn,CSIDL_PERSONAL, FALSE)
         SetCurrentDirectory(Dn)
         SendMessage(GetDlgItem(hMainWnd,ListBox1),LB_DIR,&H0,"*.*")
    Nn = SendMessage(GetDlgItem(hMainWnd,ListBox1),LB_GETCOUNT,0,0)
    Fn = ZeroString(MAX_PATH)
    If (Nn) Then
         SendMessage(GetDlgItem(hMainWnd,ListBox1),LB_GETTEXT,0,StrPtr(Fn)) '0-Nn=FileName
         Exec "notepad",Fn
    End If
End Sub

by イグトランス » 2005年11月26日(土) 17:28

どんなプログラミング言語を使っても同じことをやろうとすると似たようなコードになります。
HSPはやったことがないので山勘ですがABでは次のようなコードになると思います。

コード: 全て選択

#strict

Dim Target[MAX_PATH] As Char 
SHGetSpecialFolderPath(0, Target, CSIDL_PERSONAL, FALSE)
SetCurrentDirectory(Target)
lstrcat(Target, "\*.txt")

Dim fd As WIN32_FIND_DATA
Dim hFind As HANDLE
hFind = FindFirstFile(Target, fd)
Do
	Exec "notepad", fd.cFileName
Loop While FindNextFile(hFind, fd)
FindClose(hFind)
あいにく私のマイドキュメントには拡張子mm2なるファイルはないので,
代わりにtxtファイルをメモ帳で起動するように変更してあります。

by KAZU » 2005年11月26日(土) 17:07

Uhspさん、有難うございます。

> .notepadでもファイル選択ダイアログのファイル名の所に
>  "*.mm2"を記述すればフィルタリングされます。
>  (本当はnotepadで開く時不便なだけなのかもしれないと思いつつ)
これは開く際に*.mm2を入力すると言う解釈で良いのでしょうか?
だとすると普段やってるのと全く同じなので・・・
間違った解釈をしてるでしょうか?!

> .ActiveBasic等の開発言語やHSP等のツールである程度処理を自動化するなら。
>  1.FindFirstFile/dirlist等から目的のファイルリストを作成。
>  2.選択されたファイル名をnotepad "*.mm2"などと実行し手動で必要な部分を
>   別ファイルに保存する。
>

コード: 全て選択


>   /*HSP3*/
>   notesel Bu
>   dirlist Bu,"*.mm2"
>   noteget ss,0
>   ss = "notepad "+ss
>   exec ss
> 
載せて頂いたコードはHSP用でしょうか?
AB用であれば実行可能なコードを出来ればお願いしたいのですが。

> .この目的ならHSP/VBS等のツールの方が簡単に目的を達成出きると思いますが
>  ツールに出来る事は当然開発言語でも十分に実現できます。
すいません、HSP/VBSについては全く知らないのでABでの実現方法を出来たらお願いしたいのですが・・・

by Uhsp » 2005年11月26日(土) 15:38

.notepadでもファイル選択ダイアログのファイル名の所に
 "*.mm2"を記述すればフィルタリングされます。
 (本当はnotepadで開く時不便なだけなのかもしれないと思いつつ)

.ActiveBasic等の開発言語やHSP等のツールである程度処理を自動化するなら。
 1.FindFirstFile/dirlist等から目的のファイルリストを作成。
 2.選択されたファイル名をnotepad "*.mm2"などと実行し手動で必要な部分を
  別ファイルに保存する。

コード: 全て選択


  /*HSP3*/
  notesel Bu
  dirlist Bu,"*.mm2"
  noteget ss,0
  ss = "notepad "+ss
  exec ss
 又は
 2.選択されたファイルを順次開きキーワードにより必要な部分を抽出して
  別ファイルに保存する。
 (この時抽出条件や抽出結果を確認する機能が必要になるかも知れない。)
 (便利さを追求しだすと異常に機能が増える...)

.この目的ならHSP/VBS等のツールの方が簡単に目的を達成出きると思いますが
 ツールに出来る事は当然開発言語でも十分に実現できます。

ページトップ