マクロの実行を数秒間停止できないでしょNo.03704
舩橋幸雄 さん 03/04/11 19:03
 
舩橋です。
どこかに、マクロの実行を数秒間停止させる関数などないでしょうか?

マクロを使って、他のテキスト文書を開いて編集するのですが、
テキスト文書を開いた時点で数秒またせて編集前の状態を見せ、
編集後、数秒間またせて編集後の状態を見せ、その後でファイルを
閉じたいのですが。

C言語でSleepするプログラムを作成し、runsync2で呼び出したら
DOS窓が開いてしまてました。(DLLは作り方がわからない。)
・・・Cygwinで作成したら、cygwin1.dllまで一緒に持ってこないと動き
ませんでした。・・・

やろうとしていることが一般的でないとは思いますが、
いい方法があったら、教えてください。

[ ]
RE:03704 マクロの実行を数秒間停止できなNo.03705
Mattz さん 03/04/11 19:26
 
messageなり、quesitonなりでダイアログを出しといて、
OKで続行とかにすれば、ワンアクション必要にはなりますが、
再開のタイミングを自分で決められてよいのでは?
とか思ったりしますが、自動的に再開して欲しいのでしょうか?

# 私には無闇に多重ループで計算させるくらいしか思いつかない。

[ ]
RE:03704 マクロの実行を数秒間停止できなNo.03706
ひろ さん 03/04/11 19:32
 
 舩橋幸雄さん今日は、ひろです。
> どこかに、マクロの実行を数秒間停止させる関数などないでしょうか?
 そういった関数は有りませんが、while 文と tickcount を組み合わせれば
ご希望のことが出来ます。例えば 10 秒間停止させるなら、
#tickcount = tickcount + 10000;
while( 1 ){
  if(#tickcount < tickcount)break;
}
とします。
 本当はもっと単純にして、
> #tickcount = tickcount + 10000;
> while( #tickcount > tickcount );
でも動くはずですが、意図した動作にならないのは、おそらく
http://www.maruo.co.jp/turukame/3/x01408_.html#1411
の件と同じです。

> C言語でSleepするプログラムを作成し、runsync2で呼び出したら
> DOS窓が開いてしまてました。(DLLは作り方がわからない。)
 こちらとの繋がりが解りませんが、
http://www.maruo.co.jp/hidesoft/4/x03650_.html#3650
が参考になるかもしれません。
> ・・・Cygwinで作成したら、cygwin1.dllまで一緒に持ってこないと動き
> ませんでした。・・・
更に、-mwindows -mno-cygwin オプション (ひょっとするとどちらか片方で良
いかも) を使ってコンパイルすれば、cygwin1.dll を一緒に持ってこなくとも
上手く動作するかもしれません。

[ ]
RE:03704 マクロの実行を数秒間停止できなNo.03707
でるもんた さん 03/04/11 20:21
 
でるもんたです。

> C言語でSleepするプログラムを作成し、runsync2で呼び出したら
> DOS窓が開いてしまてました。(DLLは作り方がわからない。)

main() で始まるコンソールアプリにしていませんか?
WinMain() で始まる GUI アプリにすると窓は開きません。

こんな感じでいかがでしょう。
手元の環境にまだコンパイラを入れていないのでデバッグしてませんが…

------usleep.c
#include<windows.h>
#include<stdlib.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst,
LPSTR lpszCmdline, int nCmdshow)
{
// UNIX の usleep は μs 単位なので、それと同じ仕様にする(^^;)
Sleep(atoi(lpszCmdline)*1000);
return 0;
}

あるいは WSH で書くとか。

[ ]
RE:03704 マクロの実行を数秒間停止できなNo.03718
舩橋幸雄 さん 03/04/15 17:57
 
舩橋です。

アドバイスをいただきながら回答が遅くなってすみません。


でるもんた殿のアドバイスとひろ殿のアドバイスをもとにとりあえず解決しました。

でるもんた殿のお察しどおり、main() で始まるアプリにしていいましたというか、
WinMain()の記述を知りませんでした。初心者丸出しですが 。


以下のソースを作成し、gcc -mwindows -mno-cygwin ソースモジュール名でコンパイル
したら動きました。

#include<windows.h>
#include<stdlib.h>
#include<stdio.h>
#include<winbase.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst,
LPSTR lpszCmdline, int nCmdshow)
{
int i_times;
char c_times[]="1";
i_times=atoi(c_times)*1000;        <---1000倍したら1秒程度のWait
Sleep(i_times);                        になりました。
return 0;
}

ここで聞くような話ではないんですけど、

・ コンパイルした後のモジュール名がa.exeになるのを変更するのはどうす
   るんだっけ? (リネームして対処中)
・ このソースをVC++ 6.0でビルドすると、リンクで
   「_mainが見つからない」というようなエラーがでてしまう。
・ コマンドラインから値を指定できるようにするにはどうすればいいのか?

といった課題が残っていますが、とりあえず当初の目的は達成できました。

ありがとうございました。

[ ]
RE:03718 マクロの実行を数秒間停止できなNo.03719
ひろ さん 03/04/15 18:29
 
 舩橋さん今日は、ひろです。
> ・ コンパイルした後のモジュール名がa.exeになるのを変更するのはどうす
>    るんだっけ? (リネームして対処中)
 cygwin なら man, info コマンドを使えばこの辺りのことは解るのでは?
ひょっとすると HTML でも help が用意されているかも。また UNIX 起源のコ
マンドは、
hoge --help
とすれば簡易ヘルプが見られます。因みに出力ファイル名は -o オプションで
指定します。

 P.S 「殿」は止めて。性別の解らないハンドルに、性別を特定する Mr,
Miss を使ったり、漢字ならその字自体に性別を表すニアンスが含まれている
文字をつけるのは無意味なのね。「様」も堅苦しくなるから嫌だけど。

[ ]
RE:03718 マクロの実行を数秒間停止できなNo.03720
でるもんた さん 03/04/15 18:37
 
でるもんたです。解決したようでなによりです。

> ・ コンパイルした後のモジュール名がa.exeになるのを変更するのはどうす
>    るんだっけ? (リネームして対処中)

gcc のオプションで、たとえば -o sleep.exe としてください。

> ・ このソースをVC++ 6.0でビルドすると、リンクで
>    「_mainが見つからない」というようなエラーがでてしまう。

すいません、これはわかんないです。
コマンドラインなら単に cl sleep.c のように実行すればいいはずですが、
統合環境の場合はプロジェクトの設定のどこかの部分を「コンソールアプリ」
から「Win32 アプリ」か「GUI アプリ」にいじればいいはずです。

> ・ コマンドラインから値を指定できるようにするにはどうすればいいのか?

コマンドライン引数は WinMain の引数 lpszCmdLine に渡されますので、
atoi(lpszCmdLine) または sscanf(lpszCmdLine,"%u",&n) あたりでいいかと。

lpszCmdLine の型名の LPSTR は Long Pointer to STRing の略ですが、Long
という単語の部分は歴史の名残なので無視してください。要するに char * の
ことだとお考えください。

ただ、引数を単語ごとに区切ってはくれないので、たとえば
a.exe 1 2  3
としたら、lpszCmdLine には "1 2  3" がそのまま入ります。これを切り分ける
仕事は自分でしなければいけません。
ちなみに、VC++ なら
extern int _argc;
exterm char **_argv;
とすればその手間が省けますが、gcc にはそういう変数はありません。

[ ]
RE:03704 マクロの実行を数秒間停止できなNo.03722
k.kiyo さん 03/04/16 01:23
 
>どこかに、マクロの実行を数秒間停止させる関数などないでしょうか?
WSH(Windows Script Host )を使うと簡単です。

WScript.Sleep(5000);//5秒スリープ

上の一行を拡張子.jsでファイルに保存して、秀丸マクロから起動すればうまくいく
はずです。
runsync2 "WScript.exe Sleep.js";
のように実行させればOKです。

[ ]
RE:03722 マクロの実行を数秒間停止できなNo.03825
舩橋幸雄 さん 03/07/17 19:24
 
舩橋です。

Waitさせる件については、プログラムを作成しました。
本筋とは離れ、本来ここで質問するようなことではないのですが、
私の周りでは、WSH自体知っている人がいませんので申し訳ないですが
教えてください。


>>どこかに、マクロの実行を数秒間停止させる関数などないでしょうか?
>WSH(Windows Script Host )を使うと簡単です。
>
>WScript.Sleep(5000);//5秒スリープ

 「WSHクイックリファレンス」と言う本を購入しましたが、Sleepについての
記述はありませんでした。

  Sleepについては、なにに記載されていますでしょうか?

  「WScript」に関する書籍をさがしましたが判りませんでした。
 
よろしくお願いします。
>
>上の一行を拡張子.jsでファイルに保存して、秀丸マクロから起動すればうまくいく
>はずです。
>runsync2 "WScript.exe Sleep.js";
>のように実行させればOKです。

[ ]
RE:03825 マクロの実行を数秒間停止できなNo.03826
アルビレオ さん 03/07/17 19:49
 
アルビレオです。

> 「WSHクイックリファレンス」と言う本を購入しましたが、Sleepについての
>記述はありませんでした。

「WScript.Sleep」で検索したらわりと簡単に見つかりましたよ。
http://www.microsoft.com/japan/msdn/library/ja/script56/html/wsmthsleep.asp

[ ]
RE:03826 マクロの実行を数秒間停止できなNo.03827
舩橋幸雄 さん 03/07/17 20:16
 
アルビレオさん。ありがとうございました。

microsoftのホームページは以前検索しましたが、その時は見つけられなかったので
すが、先程検索したらおっしゃる通り簡単にでてきました。
(最近変わったんだろうか?)

>アルビレオです。
>
>> 「WSHクイックリファレンス」と言う本を購入しましたが、Sleepについての
>>記述はありませんでした。
>
>「WScript.Sleep」で検索したらわりと簡単に見つかりましたよ。
>http://www.microsoft.com/japan/msdn/library/ja/script56/html/wsmthsleep.asp

[ ]
RE:03825 マクロの実行を数秒間停止できなNo.03828
k.kiyo さん 03/07/17 23:56
 
>  「WSHクイックリファレンス」と言う本を購入しましたが、Sleepについての
> 記述はありませんでした。
確かSleepメソッドは最新のVer5.6になって実装されたと思います。
こちらから本体とヘルプファイルがダウンロードできます。
http://www.microsoft.com/downloads/release.asp?ReleaseID=33248


[ ]