ページ 1 / 2
お知恵を御貸し下さい
Posted: 2005年11月25日(金) 12:41
by KAZU
過去LOG等を見ても良く理解出来なかったのでこちらへ投稿させて頂きました。
説明下手なので例を出して説明させて頂きます。
箇条書きになりますが申し訳御座いません。
①WORDを起動
②マイドキュメント内の特定の拡張子(例えばテスト.ABC)の物だけを表示させてファイルを開く
③開いたファイルから文字列をクリップボードにコピー
④WORD内で使ったクリップボードの内容(中身はテキスト)をマイドキュメントにテスト.CBA(開いたファイル名と同じ名前で拡張子だけ違う物にしたいのです)と言ったファイル名で自動的に保存
上記の様な動作を行わせたい場合はどの様にしたら良いのでしょうか?
Posted: 2005年11月25日(金) 17:24
by イグトランス
ようするに(マイドキュメントにある)特定の拡張子を持つファイルだけを(別の拡張子にして)コピーしたいということですよね。
Wordが関係する必要はないですよね?単にファイルコピーさえすれば済む話と理解しました。
まずマイ ドキュメントへのパスはSHGetSpecialFolderPath関数で取得できます。
コード: 全て選択
Dim Target[MAX_PATH] As Char
SHGetSpecialFolderPath(0, Target, CSIDL_PERSONAL, FALSE)
特定のファイルだけを選び出すにはにはFindFirstFile関数~FindNextFile関数を用います。
(使い方は過去ログを探せばあると思います)
Targetにマイ ドキュメントへのパスがありますのでlstrcpy(Target, "\*.abc")のようにすると,
TargetはFindFirstFileの最初の引数に適合します。
FindFirstFile/FindNextFileからは個々のファイルの情報がWIN32_FIND_DATA構造体で渡されます。
その中のメンバcFileNameにファイルへのパスが含まれていますから,
これをいったん別の変数へコピーしてしまいます。そしてそれをいじって目的のファイル名にします。
PathRenameExtension関数がそのとおりのことをしてくれます。
コード: 全て選択
Dim DestinationPath[ELM(MAX_PATH)] As Char
lstrcpy(DestinationPath, fd.cFileName) ' fdはWIN32_FIND_DATA型の変数とします
PathRenameExtension(Path, ".CBA")
こうすればあとはCopyFile関数でコピーできます。
あとはDestinationPath周りとCopyFileをFindFirstFile~FindNextFileのループ内に書けば良いです。
ところでSHGetSpecialFolderPathとPathRenameExtensionはABで宣言がなされていないので自分でソースに以下の宣言をコピーしてください。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Declare Function SHGetSpecialFolderPath Lib "Shell32" Alias "SHGetSpecialFolderPathA" (
hwndOwner As HWND,
pszPath As *Char,
nFolder As Long,
fCreate As Long
) As Long
Const CSIDL_PERSONAL = 5
Declare Function PathRenameExtension Lib "shlwapi.dll" Alias "PathRenameExtensionA" (
pszPath As *Char,
pszExt As *Char
) As Long
Posted: 2005年11月25日(金) 17:47
by KAZU
イグトランスさん、早速の回答有難う御座います。
未だイグトランスさんの書いて頂いた内容の方は試して無いなのですが、取り急ぎお礼と少々訂正があるので書き込みさせて頂きます。
>Wordが関係する必要はないですよね?
>単にファイルコピーさえすれば済む話と理解しました。
申し訳御座いません、私の説明不足です。
単純に同じファイルの複製が目的では無いです。
Wordでファイルを開いた後必要な部分のみ抜粋して、それを保存したいと思ってます。
頂いた回答について又とんちんかんな質問をさせて頂くかもしれませんが宜しくお願い致します。
Posted: 2005年11月25日(金) 18:14
by イグトランス
おっとこれはつい先走ってしまってすみませんでした。
> Wordでファイルを開いた後必要な部分のみ抜粋して
「必要な部分」の条件と対象となるファイルがテキストファイルかどうかが重要です。
特にWordのDOCファイルなどであれば,ワードのマクロ(VBA)でやるほうが楽です。
皆さんはABの掲示板でこんなことを言っていいのかと思われるかもしれませんが,
そこは適材適所で使い分けていくのが賢いと思っています。
Posted: 2005年11月25日(金) 19:54
by KAZU
少しは自分で手を加えてやる方が勉強になると思い、
違う例を挙げたのが逆に不味かったみたいですみません。
やりたいと思ってる事をそのまま記述すれば電子CADで使用する
『ネットリスト』と呼ばれる物があるのですが、
拡張子がWINDOWSでは使用しない"*.mm2"と言ったファイルなのです。
中身はごく普通のテキストファイルです。
何時もはメモ帳でファイルを開いて必要な部分だけコピーして新規作成で貼り付けを行い保存してたのですが単純作業なので、何とかこれを簡単に出来ないものかと思いプログラムに挑戦してみた次第です。
イグトランスさんの仰る様にマクロでやる方が確かに楽なのかもしれませんが、これを元にその他の物も作れる様になれたらと考えてるので出来ましたらABでお願いいたします。
Posted: 2005年11月25日(金) 22:38
by イグトランス
ただのテキストなら問題ありません。ABで満足にできます。
DOCファイルならABで扱えるようにする準備だけで大変なことになるので,
もしそうならWord DOCのことはWordに任せるが吉ということで,
そこを考えなくてすむWordのマクロを挙げたのです。
それはともかくとしてプログラムで特定の部分を取り出すとしたら,
何行目~何行目や何文字目~何文字目といったように指定できれば楽です。
そうでなくとも取り出す箇所というのは何らかの規則に基づいていると思われますから,
そこをプログラムという形に起こしてみればいいのです。
Posted: 2005年11月26日(土) 13:48
by KAZU
> それはともかくとしてプログラムで特定の部分を取り出すとしたら,
> 何行目~何行目や何文字目~何文字目といったように指定できれば楽です。
> そうでなくとも取り出す箇所というのは何らかの規則に基づいていると思われますから,
> そこをプログラムという形に起こしてみればいいのです。
ある程度の法則性はありますが客先によってまちまちなのと開いてすぐにわかるのでそこまでは未だ望んでいないと言うか無理かな・・と。
メモ帳等で起動後直ぐに特定の拡張子だけを表示させる事と言うのはコードにするのは難解なのでしょうか?
Posted: 2005年11月26日(土) 15:38
by Uhsp
.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等のツールの方が簡単に目的を達成出きると思いますが
ツールに出来る事は当然開発言語でも十分に実現できます。
Posted: 2005年11月26日(土) 17:07
by KAZU
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での実現方法を出来たらお願いしたいのですが・・・
Posted: 2005年11月26日(土) 17:28
by イグトランス
どんなプログラミング言語を使っても同じことをやろうとすると似たようなコードになります。
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ファイルをメモ帳で起動するように変更してあります。
Posted: 2005年11月26日(土) 18:51
by Uhsp
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
Posted: 2005年11月26日(土) 19:18
by KAZU
イグトランスさん、コードを有難う御座います。
早速試してみたのですが”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)
Posted: 2005年11月26日(土) 19:49
by KAZU
UhspさんもわざわざAB用にコードを有難う御座います。
(HSPでやると本当に短くて済むんですね)
> RADでリストボックスとボタンコントロールを貼り付け
> ボタンコントロールに下記のコードとグローバル領域にDeclear・Constを
> 貼り付けてください。
お叱りは承知の上で書くのですが出来ましたら実行可能なコードでお願い出来ないでしょうか?
RADなどが良く理解出来てないもので・・・
Posted: 2005年11月26日(土) 22:55
by Uhsp
イグトランスさんのコードを実行した結果が期待するもので無い場合
私は解釈をあやまっています。
趣旨は"*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"に変更して
下さい。
Posted: 2005年11月27日(日) 00:09
by イグトランス
> その結果指定したフォルダにある全ての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