[ 掲示板に戻る ]

過去ログ閲覧モード

関数に配列を渡す際のよくわからない仕様 / RICES
for i = 0 to 5
 print 配列返し()[i]
next

print "end"

print join(配列返し())
print "end1"

print 配列受取(split(join(配列返し())))
print "end2"

dim x = 配列返し()
print 配列受取(x)
print "end3"

print 配列受取(配列返し())
print "end4"

//関数の返り値が配列の場合、それを直接関数に渡すことはできない?

///////////////////////////////
function 配列返し()
dim 配列[5]=1,2,3,4,5,6
result = split(join(配列))
fend
///////////////////////////////
function 配列受取(配列2[])
result = true
fend
///////////////////////////////

またしても妙な疑問ですみませんが、
上記コードを実行してみると、end4に到達できないかと思います。
どういう原理なんでしょうか…ね??

No.4207 2017/07/07(Fri) 13:16:19

Re: 関数に配列を渡す際のよくわからない仕様 / stuncloud
UWSCの配列変数はなんだかものすごく特殊な感じがするので、仕様上しょうがないのかもしれないですね
詳しいことはumiumiさんの回答を期待したいです

配列受取((配列返し()))
()で括ったらどうなるかなと思ったらSyntax Error

function 配列受取(配列2)
とすればひとまずOK、SafeArrayしか使わないのであれば引数を配列変数として定義しないのはアリです
(ただしSafeArray以外を渡しちゃうと困るので入力値のチェックは厳格に行うべき)

No.4210 2017/07/07(Fri) 16:50:46

Re: 関数に配列を渡す際のよくわからない仕様 / RICES
内部では配列は2種類あるような扱われかたをしているような印象を受けます

function 配列受取(配列2)
これで受け取れるとは思いませんでしたが、逆に普通に変数定義した配列を入れられなくなっちゃうんですね…
ぶっちゃけちょっとコードが長くなるだけなので別に実害はなさそうですけど、変数に格納してから引数に入れるか、結合文字列として受け取って内部で配列化するかになりますかね

No.4219 2017/07/10(Mon) 00:06:09

Re: 関数に配列を渡す際のよくわからない仕様 / satocha
検証してみました
下のコードを動かしてみると次のような結果になりました。

配列を返す組み込み関数を組み込み関数から呼び出す→○
配列を返す自作関数を組み込み関数から呼び出す→○
配列を返す組み込み関数を自作関数から呼び出す→○
配列を返す自作関数を自作関数から呼び出す→×

msgbox( length(split("a b c d")) )
msgbox( mylength(split("a b c d")) )
msgbox( length(mysplit("a b c d")) )
msgbox( mylength(mysplit("a b c d")) )
function mysplit(str,sep=" ")
 result =split(str,sep)
fend

function mylength(ary[])
 result =length(ary)
fend

ならば、配列を返す自作関数をそのまま自作関数に投入せず、組み込み関数であるsliceでいったん受けてやればどうか?
msgbox( mylength(slice(mysplit("a b c d"))) )
見事うまくいきました。記述は増えるものの余計な変数は排除できます。

No.4220 2017/07/10(Mon) 07:17:03

Re: 関数に配列を渡す際のよくわからない仕様 / しゅん
SafeArrayが後から出てきたもので、元々の配列(DIMや関数の引数で定義する配列)との同居対応に漏れがあるためかと思います。
SafeArrayができるまでは自作関数で配列を返すことは出来なかったので、配列を受け取る自作関数に、
・変数を渡す場合、元々の配列はOK、SafeArrayもOKにした
・SplitやSlice等は配列を返すので、OKにした
・SafeArrayを返す自作関数は、、、対応が漏れている
といったところかと思います。
他にSafeArrayを返す方法は、、、あるかしらん?

限りなく不具合に近いと思いますので、umiumiさんに報告すれば直してもらえる可能性は高そうです。

No.4221 2017/07/10(Mon) 09:38:16

Re: 関数に配列を渡す際のよくわからない仕様 / MM
かなり昔、SafeArray関連機能が実装したての頃、
SafeArray配列の出来損ない(長さ0とか)を触ると、
絶対にTryでトラップできず実行が必ず中断されるエラーが出たりして、
それ以来、羹に懲りてなますを吹いています。
Splitは自作関数でラップして標準配列に転写し長さを検査したりとかですね…

No.4223 2017/07/10(Mon) 10:16:17

Re: 関数に配列を渡す際のよくわからない仕様 / RICES
>>組み込み関数であるsliceでいったん受けてやればどうか?
この方法で今の問題点が粗方解決してしました ありがとうございます

一応、split(join(配列))という渡し方をしても同様にエラーを吐かなくはなりますが、重いし長いので…

No.4226 2017/07/10(Mon) 23:05:11
UWSCでプルダウンメニューを操作するには / 高橋
UWSCでプルダウンメニューを操作するには
どのようにすればよいでしょうか。

例えば、下記のホームページ1のHTMLの場合、
人が手で操作すると、
左側のプルダウンメニューでBを選択すると
右側の表示がBになりますが
これを下記のtest.uwsで行うと
プルダウンメニューの表示はBになりますが
右側の表示がBになりません。
どのようにすれば、(UWSCでなく)手で操作した時と
同じようにBと表示されるのでしょうか。

よろしくお願いします

動作環境 : Windows7,UWSC:フリー版5.3.0.2,IE11

---test.uws-------------------------------
IE = createoleobj("internetexplorer.Application")
IE.visible = True
IE.navigate("C:\test\top.html")
repeat
sleep(0.1)
until !IE.busy and IE.readyState = 4
obj=ie.document.getElementById("id1")
obj = ie.document.frames.Item("name1").document.getElementById("id1")
sleep(1)
obj.selectedIndex = 1
-------------------------------------------

ホームページ1のHTML
---C:\test\top.html-----------------------------
<html>
<head>
<title>TEST</title>
<script type="text/javascript" SRC="function.js"></script>
</head>
<frameset cols="200,*" border="10">
<frame src="f1.html" name="name1" onload="MakeList()">
<frame src="" name="name2">
</frameset>
</html>
---C:\test\f1.html-------------------------------------
<html>
<head>
<title>f1</title>
<script type="text/javascript" SRC="function.js"></script>
</head>
<body>
<form name="name3">
<select name="name4" id="id1" onChange="ChangeList()">
</select>
</form>
</body>
</html>
---C:\test\fa.html-------------------------------------
<html>
 <head>
<title>fa</title>
 </head>
<body>
<p>A</p>
</body>
</html>
---C:\test\fb.html-------------------------------------
<html>
<head>
<title>fb</title>
</head>
<body>
<p>B</p>
</body>
</html>
---C:\test\fc.html-------------------------------------
<html>
<head>
<title>fc</title>
</head>
<body>
<p>C</p>
</body>
</html>
---C:\test\function.js---------------------------------
function MakeList()
{
 var obj;
 obj=parent.name1.document.getElementById('id1');
 obj.options[0]= new Option("A","fa.html",true,true);
 obj.options[1]= new Option("B","fb.html");
 obj.options[2]= new Option("C","fc.html");
 parent.name2.location.href=obj.options[0].value;
 parent.name2.focus();
}

function ChangeList()
{
 var url = document.name3.name4.options[document.name3.name4.selectedIndex].value;
 if (url != "")
 {
  parent.name2.location.href=url;
  parent.name2.focus();
 }
}
-----------------------------------------------

No.4217 2017/07/09(Sun) 13:00:57

Re: UWSCでプルダウンメニューを操作するには / stuncloud
対象のsselectにonchangeが定義してあるのでそれを呼びます

obj.selectedIndex = 1
obj.onchange()

No.4222 2017/07/10(Mon) 10:09:18

Re: UWSCでプルダウンメニューを操作するには / 高橋
stuncloud さん

教えていただきました方法でできました。
ありがとうござました。

No.4225 2017/07/10(Mon) 19:59:17
Procedureにおける行結合の挙動に関して / みそ
UWSC便利に使わせて貰ってます

以下のようにProcedureの引数定義の途中で _ による行結合を行ったとき、
TEST1のように2行であれば問題無いのですが、特定条件下でTEST2のように3行に渡る場合エラーになります。
あまりしない記述かとは思いますが、たまたま見つけてしまったので報告をしておきます。
よろしくお願いします

・動作確認
OS:Windows7,UWSC:フリー版5.3.0.2

・条件
定義が、
TEST1→TEST2の順であればエラーにならない
TEST2→TEST1の順、もしくはTEST2のみだとエラーになる
どうも、3行に渡るProcedureが最初の定義であった場合のみエラーになるようです

・スクリプト
Procedure TEST1(a,b, _
c,d)
Fend

Procedure TEST2(a,b, _
c, _
d)
Fend

・エラーメッセージ
__MAIN__:関数が入れ子しているか、閉じていません
PROCEDURE TEST2(A,B, FEND

No.4218 2017/07/09(Sun) 23:56:22

Re: Procedureにおける行結合の挙動に関して / MM
そういう条件だったのですか…
定義には行結合が使えないものとばかり思ってました

No.4224 2017/07/10(Mon) 12:44:39
IEで前の情報が出てくる / 武藤
IEで証券会社のサイトにログインしようというありふれた話なのですが、
ログインの可否を判断しようとサイトのタグを検索したのですが、表示中の情報ではなくひとつ前のものが出てきてしまいます。
<title>で "ログインエラー | 楽天証券" と出るはずのところ、"ログイン | 楽天証券" となっています。
何が抜けているのでしょうか。

IE = GetActiveOLEOBJ("InternetExplorer.Application")
IE.visible = true
IE.navigate("https://www.rakuten-sec.co.jp/ITS/V_ACT_Login.html")

REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
// ID パスワード設定
IEsetData(IE,"A2AA1111","loginid")
IEsetData(IE,"a5cdefgh90123456","passwd")
// ログインボタンを押す
IEsetData(IE,true,"submit%template")

REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
// <title>を見つける。ログインエラーなら「"ログインエラー | 楽天証券"」となる
pTag = IE.document.getElementsByTagName("title")
GETOLEITEM(pTag)

ifb ALL_OLE_ITEM[0].innerText="ログインエラー | 楽天証券"
msgbox("ログインエラー | 楽天証券")
else
msgbox("Login !")
endif

No.4208 2017/07/07(Fri) 16:09:59

Re: IEで前の情報が出てくる / stuncloud
titleタグの内容ではなくその時のドキュメントのタイトルを確認してみては

print IE.document.title

ifb IE.document.title = "ログインエラー | 楽天証券" then
//略
endif

No.4209 2017/07/07(Fri) 16:43:27

Re: IEで前の情報が出てくる / 武藤
ご回答ありがとうございます。

...
GETOLEITEM(pTag)
print ALL_OLE_ITEM[0].innerText
print IE.document.title
ifb ALL_OLE_ITEM[0].innerText="ログインエラー | 楽天証券"


二つ print文を入れてみましたが、どちらも
「ログイン | 楽天証券」
となりまして、機能しないことがわかりました。
しかし、エラーページのソースでは確かにtitleタグ内に「ログインエラー | 楽天証券」となっています。document.titleが優先してしまうのですか。だとしたらこの方法での判別は無理ということでしょうか。

No.4214 2017/07/08(Sat) 14:28:30

Re: IEで前の情報が出てくる / 山ちゃん
自分も今年になりIE11で画面遷移後、DOM操作が出来なくなる、DOM要素が更新されないことが稀にある等の症状で
解決方法を探っているので少しでもお力になればと思い書き込ませていただきます。
以下の書き込みは実際に試して確認していない、確実な情報ではないことをご了承ください。

まず、考えている対処できそうな方法として、画面遷移後IEオブジェクトの再取得です。

// ログインボタンを押す
IEsetData(IE,true,"submit%template")
//その後、IEオブジェクトを再取得する
sleep(2)
IE = GETACTIVEOLEOBJ("InternetExplorer.Application", "楽天証券")


「ie11 遷移後」などで検索すると、似たような症状で書き込みをされている方を見るのですが
決定的な解決策は発見出来ず、今年になり悶々とした気持ちで解決策を探っています。
当てずっぽうの個人的な感触して
・IE11でセキュリティ対策の更新が行われた
・不具合のでる該当ページでセキュリティ対策の変更が加えられた
等のセキュリティ関係の更新が行われたのではないかと思っています。(当てずっぽうの個人的な素人の感想です)

検索したその他の有望そうな情報として

trademam様のブログ
objIE.readyStateがずっと1(マクロのはなし)
ttp://trademam.blog.fc2.com/blog-entry-812.html
コメントにて
>url2に遷移する前後でobjIE.visibleをいじったら何故か上手くいきました(^^;

>objIE.Visible = False
>objIE.Navigate (href)
>objIE.Visible = True
との事ですので、

// ログインボタンを押す前後で.Visibleプロパティを変更する
IE.Visible = False
IEsetData(IE,true,"submit%template")
IE.Visible = True

※IEsetDataがIE.Visible = Falseの状態で実際に動作するか確認していません

voidProc様のブログ
PowerShell 2.0 から IE11 を操作しスクレイピングするサンプルコード(querySelector編)
ttp://qiita.com/voidProc/items/b3037ccb31676b27ceba
注釈にて
>Navigate() でページ遷移後、IE オブジェクトが無効になる → 原因はわかりませんが管理者権限で実行することで回避できました

IE、UWSCを管理者権限で実行する


UWSC FAQより関係のありそうな項目として

アプリの操作ができない、記録ができない(Vista/7/8.x/10)  #N29
ttp://www.uwsc.info/faq.html#N29
管理者権限を合わせて実行する

IEの操作が正しく働かない、IE上での動作を記録しようとしても記録ができない(Vista/7/8.x/10)  #N30
ttp://www.uwsc.info/faq.html#N30
IEの保護モードを解除

IE11にて画面更新後に操作(COM)ができない  #N45
ttp://www.uwsc.info/faq.html#N45
こちらも画面遷移後DOM操作ができない改善方法
自分は画面遷移後徹底的にSendMessageA(ie.Hwnd, WM_ACTIVATE, 0, 0)を入れてみたのですが改善せず


基本的なIE不具合の改善策(見落としがちだが、ごく稀に改善することがある)

NEC LAVIE公式サイト
Windows 8.1 / 7のInternet Explorer 11の動作が遅い場合の対処方法
ttps://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=016572
>1. インターネット一時ファイルや閲覧の履歴を削除する
>2. アドオンを無効にする
>3. GPUレンダリングの設定を確認する
>4. ウイルスに感染していないか確認する
>5. Internet Explorer 11の設定をリセットする

以上です。
>コメント欄へのURL(http://)の投稿限度数を超えています
との事ですのでURLをh抜きで投稿させていただきます。

No.4216 2017/07/08(Sat) 18:42:23
UWSCのClkItemの使い方と名称の取得方法 / YY
電卓のボタンをClkItemでクリックしたいのですが
やり方がよく分かりません。
電卓のボタンの名称が正しくないように思いましたので
電卓のボタンの名称を取得しようとしましたが
このやり方もよく分かりませんのでご質問します。

(問1)UWSCで電卓のボタンを操作する場合
ClkItem()を使って以下のようにしましたが
+や=のボタンがクリックされません。
12と表示された状態で終了してしまいます。
下記のコードのどこに問題があるのでしょうか。

---test1.uws-----------------------------
id=exec("C:\Windows\System32\calc.exe")
sleep(3)
ClkItem(id, "普通の電卓", CLK_MENU)
sleep(1)
ClkItem(id, "1", CLK_ACC)
ClkItem(id, "+", CLK_ACC)
ClkItem(id, "2", CLK_ACC)
ClkItem(id, "=", CLK_ACC)
-----------------------------------------

(問2)ClkItem()に記述するために電卓のボタンの
   正確な名称を取得したいのですが
   どのようにすればよいでしょうか。
  以下のようにしてみましたが
   ボタンの名称が取得できません。
   下記のコードのどこに問題があるのでしょうか。

---test2.uws-----------------------------
id=exec("C:\Windows\System32\calc.exe")
for a = 0 to getitem(id,itm_btn)-1
print a+1+":" + ALL_ITEM_LIST[a]
next
-----------------------------------------

OS:Windows7
UWSC:フリー版5.3.0.2

よろしくお願いします。

No.4199 2017/07/05(Wed) 19:03:51

Re: UWSCのClkItemの使い方と名称の取得方法 / satocha
uwsc同梱のサンプル.uwsによれば、Windows7の電卓はsendstrするだけで計算してしまうようですね。
ClkItem(id, "普通の電卓")
sleep(0.5)
sendstr(id,"1+2=")

win10のストアアプリの場合は演算キーを押しているようですが。

電卓に限って言えばこれで終わりですが、

一般にアプリケーションウインドウの部品にアクセスしたいとき、どうやってその部品にアクセスするか、ですが
私の場合は眠たい詩人さんの開発された「UWSCコードの断片生成器」を使って調べています。便利ですよ。

No.4200 2017/07/05(Wed) 20:51:53

Re: UWSCのClkItemの使い方と名称の取得方法 / routa
ストアアプリの電卓は起動ウィンドウと画面ウィンドウは違うようです。
サンプル.uwsでもIDを再取得しています。
exec("C:\Windows\System32\calc.exe")
id = GETID("電卓", "ApplicationFrameWindow")
for a = 0 to getitem(id,itm_btn)-1
print a+1+":" + ALL_ITEM_LIST[a]
next

No.4201 2017/07/05(Wed) 23:38:10

Re: UWSCのClkItemの使い方と名称の取得方法 / YY
routaさん

回答ありがとうごさいます。

Windows7は、ストアアプリの電卓ではなく普通の電卓と思いますが、
下記の教えていただいたコードを実行して確認しました。

exec("C:\Windows\System32\calc.exe")
id = GETID("電卓", "ApplicationFrameWindow")
for a = 0 to getitem(id,itm_btn)-1
print a+1+":" + ALL_ITEM_LIST[a]
next
の実行結果ですが、

getitem(id,itm_btn)は1で
print文は
17/07/06 14:27 1:スタート
だけが出力されていて、
ボタンの名称は1つも取得できていませんでした。

よろしくお願いします。

No.4203 2017/07/06(Thu) 21:15:00

Re: UWSCのClkItemの使い方と名称の取得方法 / satocha
sendstrではなく、どうしてもボタンを押したいということでしたら、

powershell("ps calc|kill")
calcid =exec("calc.exe")
clkitem(calcid,"表示\普通の電卓",CLK_MENU)
sleep(0.1)
clkitem(calcid,"1",CLK_ACC)
clkitem(calcid,"加算",CLK_ACC)
clkitem(calcid,"2",CLK_ACC)
clkitem(calcid,"等号",CLK_ACC)

msg="ボタンの名称は次の通りです"
for btn in getitem(calcid,ITM_ACCCLK,-1)
 msg =msg+"<#CR>"+btn
next
sendstr(exec("notepad"),msg)

No.4204 2017/07/07(Fri) 06:34:42

Re: UWSCのClkItemの使い方と名称の取得方法 / MM
satochaさんが最初に仰ったように、こちらが便利ですよ

「UWSCコードの断片生成器 Fragment Creator of Uwsc Code (UWSC fcuc.uws)」
http://nem.symphonic-net.com/uwsct/fcuc_readme.htm

これを走らせて取得できないボタン名称は、そもそも名称指定で押せないことになります。
省力化がテーマのツールでこういうメタコードを使わないのはどうかなと思います。
ググればすぐ見つかるはずですがやってみましたかね…?

No.4205 2017/07/07(Fri) 09:23:06

Re: UWSCのClkItemの使い方と名称の取得方法 / しろまさ
// >これを走らせて取得できないボタン名称は、そもそも名称指定で押せないことになります。
// 押せますよ(反則?) スピードに挑戦してみました^^

SetBtn()
MsgBox("1-100 まで加算します")
Dim i
For i = 1 To 100
  BtnS("+" + i)
Next
BtnS("=")

MsgBox("次は100*100")
BtnS("100*100=")

Procedure SetBtn()
  Public HashTbl h_nm
  Dim idc = exec("calc.exe"); ClkItem(idc, "表示\普通の電卓", CLK_MENU)
  Dim i, nm = Split("mc mr ms m+ m- bs ce c ± rt 7 8 9 / % 4 5 6 * /x 1 2 3 - = 0 . +")
  For i = 0 To Length(nm) - 1; h_nm[nm[i]] = GetCtlHND(idc, "Button", i + 1); Next
FEnd
Procedure BtnS(num); Dim i; For i = 1 To Length(num); Btn1(Copy(num, i, 1)); Next; FEnd
Procedure Btn1(nm); MouseOrg(h_nm[nm], 2); KBD(VK_SPACE); MouseOrg(0); FEnd

No.4206 2017/07/07(Fri) 09:58:37

Re: UWSCのClkItemの使い方と名称の取得方法 / 山ちゃん
(問1)
>下記のコードのどこに問題があるのでしょうか。
(問2)でも触れられていますが、正確なアイテム名が指定されていないためです。
satocha様の回答にも記載されていますね。

//以下は、記録機能(高レベル記録)を利用して作成したコードです。windows7用電卓操作
id = EXEC("calc") //id = GETID("電卓", "CalcFrame", -1) 電卓起動はEXEC使用へ手を加えました
SLEEP(1)
CLKITEM(id, "普通の電卓", CLK_MENU, False)
id = GETID("電卓", "CalcFrame", -1)
CLKITEM(id, "1", CLK_ACC)
CLKITEM(id, "加算", CLK_ACC)
CLKITEM(id, "2", CLK_ACC)
CLKITEM(id, "等号", CLK_ACC)


(問2)
>下記のコードのどこに問題があるのでしょうか。
GetItemの種別の指定です。

ITM_ACCCLK    // アクセシビリティ経由:クリック可能な物
を指定して実行

id = EXEC("calc")
for i = 0 to GetItem(id, ITM_ACCCLK)-1
  print ALL_ITEM_LIST[i]
next

//実行結果
メモリのクリア
バックスペース
7
4
1
0
メモリ呼び出し
入力のクリア
8
5
2
メモリ保存
クリア
9
6
3
小数点
メモリ加算
符号切り替え
除算
乗算
減算
加算
メモリ減算
平方根
パーセント
逆数
等号

>正確な名称を取得したいのですが
>どのようにすればよいでしょうか。
ここは自分も悩むことがあるので、上手く回答できないですが、
satocha様、MM様の回答されているツール(UWSCコードの断片生成器)を利用してみる
記録機能(高レベル記録)を利用してみる
取得する系の関数で全ての種別を試してみる
でしょうか。

>しろまさ様
いつも参考にさせて頂いています。ありがとうございます。

No.4213 2017/07/08(Sat) 00:10:06

Re: UWSCのClkItemの使い方と名称の取得方法 / YY
satocha さん
教えていただきましたコードでうまくいきました。
ありがとうございました。

satocha さん、MM さん
UWSCコードの断片生成器使って見ました。
+や=が加算や等号になっているのを確認できました。
これらを取得したコードも書かれているので
何で取得したのかが分かり便利ですね。
ありがとうございました。

しろまさ さん
今はまだよく理解できないけど
今後の参考にさせていただきます。
ありがとうございました。

山ちゃん さん
itm_btnではなくITM_ACCCLKでしたか。
このあたりがまだあまりよく理解できていません。
UWSCコードの断片生成器を利用してみるようにします。
とても分かりやすい説明ありがとうございました。

No.4215 2017/07/08(Sat) 15:14:34
記録ボタンがグレーアウトして押せなかった問題・解決! / skyblue
 お世話になっています

過去2回にわたって皆様から親切なアドバイスを頂きながら、未解決になっていましたが解決できたので報告します。

1.その後、無駄に終わった作業
 過去のUWSCをコントロールパネルから全部削除し、Windows10を上書きしましたが効果は無く落胆していました。

2.マイクロソフトの有料相談
 MSと年間契約していたのですがUWSCの名称を出すと断られるので、ダウンロードの問題で相談。
たまたま非常に運良く、UWSCを使った経験のある方で、簡単ではなかったが精力的に取り組んでいただきました。

3.解決策
(1)PC右下の山形ボタンを左クリック(隠れたインディケーターを表示)
(2)タスクトレイのUWSCアイコン上で右クリック
(3)INI/LOGを左クリック
(4)そこで出てくるログなどを全部削除
・・これで解決しました。

MSの担当者は過去のログがいたずらしていたようだと言いました。

UWSCについては初歩的な使い方しかわかりませんがVBAと組み合わせたヘビーな使い方をしているので、それが原因かもしれません。
 

No.4211 2017/07/07(Fri) 18:20:39
ウィンドウIDの生存期間は? / もも
お世話になります。
取得したウインドウIDの一覧から、複数のIDの窓を一括で閉じる処理を作りたいのです。

スクリプトの実行中は窓を閉じてもIDは欠番して他のIDも変わらないと有り難いのですが、
ウインドウIDはいつまで固定なのでしょうか?
ファイルの行削除のように、窓を閉じる処理は番号の逆順で作業しないと危険な感じでしょうか?

Everythingで大量に開いた窓を閉じる処理を作りたかったのですが、実際にCTRLWINで閉じる
際に「閉じて番号がずれて他の窓に誤爆したら怖いな」と考えたら、テスト自体がすでに
キケンだなぁと…

よろしくお願います。


TextBlock 説明

Firefoxの復帰画面のように、起動しすぎたEverythingの窓を一覧にして
不要な物を選択後、一括で窓を閉じる

EndTextBlock
MsgBox(説明)

DIM windowArray[1][2] // Everythingの窓IDの配列 IDno,窓タイトル
DIM windowCnt = 0 // 配列要素数

// クラス名で"EVERYTHING"を検索し、WinIDとタイトルを取得

maxCnt = GetAllWin() // 全WindowのIDを取得

Resize( windowArray,maxCnt) // 一旦最大値まで広げる

For no = 0 To maxCnt -1
winID = ALL_WIN_ID[no] // WinID取得
If STATUS( WinID, ST_CLASS ) = "EVERYTHING" Then
windowArray[windowCnt][0] = winID
windowArray[windowCnt][1] = STATUS( WinID, ST_TITLE ) // タイトルを返す
windowCnt = windowCnt + 1
EndIf
Next

a=""
For i = 0 To windowCnt - 1
a = a +"<#DBL>" + windowArray[i][0] + "番 " + windowArray[i][1] +"<#DBL>"
Next
a = Replace(a,"<#DBL><#DBL>","<#DBL>,<#DBL>")

a = "SlctBox(SLCT_CHK or SLCT_NUM, 0,<#DBL>削除する窓にチェック<#DBL>," + a + ")"

res = Eval(a) // チェックリスト表示 戻り値:チェック無し=""

MsgBox(res)

For no In Split(res, "<#TAB>")
msgbox(windowArray[no][1])
kill = MsgBox("窓を閉じますか?<#CR><#CR>" + STATUS(windowArray[no][0], ST_TITLE) +"<#CR>"+STATUS(windowArray[no][0], ST_CLASS),BTN_YES or BTN_NO)
If kill = BTN_YES Then
MsgBox("CtrlWin( " + windowArray[no][0] + ",CLOSE )")
EndIf
next

No.4195 2017/07/05(Wed) 02:12:34

Re: ウィンドウIDの生存期間は? / satocha
もも様

その情報は私も知りたいところです。
ですが、現状、心配であれば、

windowArrayに格納するデータをウインドウIDではなく
IDTOHND関数でウインドウハンドルにしておき、
使うとき(閉じるとき)、HNDTOID関数で元に戻すというのはどうでしょうか。

ウインドウハンドルはUWSCの処理とは無関係に定まる値だと思いますので。

No.4196 2017/07/05(Wed) 06:01:23

Re: ウィンドウIDの生存期間は? / satocha
追加です

>>テスト自体がすでにキケンだなぁと…

とのことですが、windowArrayに元のタイトルが残っているので、
CtrlWinで操作する前に、status(id,st_title)と比較すればいいかと。

タイトルだけの判断では心配なら、windowArray[n][2]にクラス名も保存しておけばいいかと思います。

No.4197 2017/07/05(Wed) 08:37:39

Re: ウィンドウIDの生存期間は? / stuncloud
idはウィンドウに対して一意です
少なくともそのウィンドウが存在している間はidは同じままです
ので

> Everythingで大量に開いた窓を閉じる処理を作りたかったのですが、実際にCTRLWINで閉じる
> 際に「閉じて番号がずれて他の窓に誤爆したら怖いな」と考えたら、テスト自体がすでに
> キケンだなぁと…


ということはないのでご安心を

ただもしかしたら、例えばid=1のウィンドウがあるとしてそれが閉じられた後に別のウィンドウをgetid()/getallwin()した場合、その別ウィンドウのidが1になることはあるかもしれません
軽く試した限りでは新しいウィンドウには新しい番号が割り当てられているようですが、一応その可能性があることを考慮しておいてください(※)

※ fopen()で得られるファイルのidはfclose()した後だと使いまわされることがわかっています

No.4198 2017/07/05(Wed) 11:26:24

Re: ウィンドウIDの生存期間は? / もも
satocha 様
>windowArrayに格納するデータをウインドウIDではなく
>IDTOHND関数でウインドウハンドルにしておき、

あーそんな感じでも行けそうですね。目から鱗でした。
ハンドルとかDLLに渡す値とか、いまいち身についてないので、自分からは怖くて…
>CtrlWinで操作する前に、status(id,st_title)と比較すればいいかと。
質問書いた時には実環境にチェック機能入れる気力が切れてたです。
ありがとうございました。

stuncloud 様
>idはウィンドウに対して一意です
>少なくともそのウィンドウが存在している間はidは同じままですので

ありがとうございます。
おそらく問題無いだろうとは思ってましたが、無自覚にシステムポコポコ壊してる
状況を想像してしまうととても怖かった物で…
stuncloud 様には以前も回答頂いていたようで、気がつくのが遅れてしまいすいませんでした。
前のレスの、自己exe化を起こす処理を組み込んでおくという発想も衝撃的でした。
ありがとうございました。

No.4202 2017/07/06(Thu) 02:14:17
エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / よっさん
以前satocha様から回答を頂き、大変恐縮ですが仕事が忙しく返信期限が過ぎてしまった件の続きです。エクセルのデータを2次元配列にいれて、表タグ作成をする方法が分かりません。XLGETDATAで2次元配列の分を<TH>タグで出力させる処理が分かりません。1次元配列の場合は希望の出力できました。2次元配列の場合はどのようなコード書けばいいのでしょうか?


[したい処理]

<TABLE class="table">
<THEAD>
<TR>
<TH>会社名1</TH>
<TH>会社名2</TH>
<TH>会社名3</TH>
</TR>
</THEAD>

<TBODY>
<TR>
<TD>エリア1</TD>
<TD>エリア2</TD>
<TD>エリア3</TD>
</TR>
</TBODY>
</TABLE>



EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
Excel.WorkBooks.Open(FileName :="ファイル名")
XLACTIVATE( Excel, "Sheet2")
hai=XLGETDATA( Excel, "b1:d1")//会社名1 会社名2 会社名3

hai1=XLGETDATA( Excel, "b2:d2")//エリア1 エリア2 エリア3


//ダミーのHTMLオブジェクトを生成
document =createOleObj("htmlfile")
//空っぽなのでbodyだけ作っておく
body =document.createElement("Body")

//tableタグを生成
table =document.createElement("table")
thead =document.createElement("thead")
tr =document.createElement("tr")
tr1 =document.createElement("tr")
th =document.createElement("th")
tbody =document.createElement("tbody")
td =document.createElement("td")


//タグ(要素)に属性がある場合は、setAttribute( 要素名, 値 )
table.setAttribute( "class", "table" )

//th要素を生成・登録
dim ths[length(hai)]
for i = 0 to length(hai)-1//1
ths[i]=document.createElement("th")
ths[i].appendChild(document.createTextNode(hai[i]))
tr.appendChild(ths[i])
next


//th要素を生成・登録
dim ths1[length(hai1)]
for i = 0 to length(hai1)-1//1
ths1[i]=document.createElement("td")
ths1[i].appendChild(document.createTextNode(hai1[i]))
tr1.appendChild(ths1[i])
next


//その他の要素を登録
body.appendChild(table)
table.appendChild(thead)
thead.appendChild(tr)
tbody.appendChild(tr1)
table.appendChild(tbody)
// tr1.appendChild(td)


//htmlオブジェクトが作ってくれたHTMLを頂く
HTML=body.innerHTML
print HTML

No.4184 2017/07/02(Sun) 13:27:35

Re: エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / 森
以前の質問の際、二次元配列についても理解を深めるようにとのアドバイスで終わっていたように記憶しています。
一応質問に従って、見出しもデータも同じ配列取り込みましたが、私なら、同じ配列には入れず、見出しは別の1次元配列に入れて処理します。
質問では、見出しが1行、データも1行ですが、その場合は、それぞれ別の1次元配列で良いと思います。
普通、二次元配列が必要になるのは、このサンプルのようにデータ部分が複数行あるケースです。
尚、より初心者の方でも参考になるよう、COMではなくUWSC標準コマンドでのサンプルとしました。
-----------------------------------
// エクセル sample.xlsx
品名,単価,在庫
りんご,150,100
みかん,100,200
バナナ,300,150
-----------------------------------

// Excelの起動
Excel = XLOPEN("sample.xlsx")

// 配列に取り込み
dim data[4][3]
for i = 1 to 4
 for j = 1 to 3
  data[i][j] = XLGETDATA( Excel, i , j )
 next
next

// ここからHTML生成
html = "<TABLE>"
html = html + "<#CR>" + " <THEAD>"
html = html + "<#CR>" + "  <TR>"
for j = 1 to 3
 html = html + "<#CR>" + "   <TH>" + data[1][j] + "</TH>" //----- 1行目は見出し
next
html = html + "<#CR>" + "  </TR>"
html = html + "<#CR>" + " </THEAD>"
html = html + "<#CR>" + " <TBODY>"
for i = 2 to 4   //------- データは2行目以降
 html = html + "<#CR>" + "  <TR>"
 for j = 1 to 3
  html = html + "<#CR>" + "   <TD>" + data[i][j] + "</TD>"
 next
 html = html + "<#CR>" + "  </TR>"
next
html = html + "<#CR>" + " </TBODY>"
html = html + "<#CR>" + "</TABLE>"

msgbox(html)

No.4185 2017/07/02(Sun) 19:33:08

Re: エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / よっさん
森様、回答ありがとうございます。さっそく教えて頂いたコードを試してみましたが、例外が発生しましたと表示、 data[i][j] = XLGETDATA( Excel, i , j )がエラーになります。
XLGETDATA( Excel, [セル範囲, Column, Sheet名] )をヘルプで見ました。
下記のようにしてもエラーになります。

data[i][j] = XLGETDATA(Excel,"a"+i+":"+"c"+j)

No.4187 2017/07/02(Sun) 21:16:25

Re: エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / 森
投稿前に動作チェックを行っているのですが、こちらでは問題なく実行されているんですよね。
念のために、もう一度実行してみましたが大丈夫でした。
エクセルのバージョン違い? ※当方はExcel 2016

しかし、そこは質問内容には関係ない部分なので、とりあえず無視して、二次元配列での処理の流れと言いますか、二次元配列自体はご理解いただけたのでしょうか?
理解できれば、よっさんが書いているスクリプトに応用して頂ければ良いかと思います。

No.4189 2017/07/02(Sun) 22:43:36

Re: エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / 森
あと、まったく余談ですが、PHPやjavascriptに、CSVファイルを取り込んでテーブルに成型して表示する機能(プラグインだったかも)があったはずですよ。
目的はUWSCの精進ではなく、楽にブラウザ上でマトリックスに成形して表示させるということだと思うので、そっちの方が便利かもです。

No.4190 2017/07/02(Sun) 22:58:08

Re: エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / satocha
エクセルからデータを抽出するところまではできているようなので
あとは、縦横のデータをどう、HTMLにしていくか、ということだと思います。

縦横なので、高々二次元の配列をHTMLに落とし込めばいいわけです。

エクセルの部分ははしょって、textblockで置き換えてみると
こんな感じでしょうか。

lines  =split( trim(companieSTR), "<#CR>" )
llen  =length(lines)
dim cells[llen -1]
for i=0 to llen - 1
 cells[i]=split( trim(lines[i]), "," )
next
html  =mkTable( cells )
sendstr(exec("notepad"),html)


function mkTable( cells[] )
 document  =createOleObj("htmlfile")
 document.write(skelton)
 table   =document.createElement("table")
 document.body.appendChild(table)
 table.setAttribute("border","<#dbl>1<#dbl>")
 tr_org   =document.createElement("tr")
 td_org   =document.createElement("td")
 th_org   =document.createElement("th")
 

 for row in cells
  tr   =tr_org.cloneNode()
  table.appendChild( tr )
  for data in row
   if pos( "*", data)=1
    node =th_org.cloneNode()
   else
    node =td_org.cloneNode()
   endif
   node.innerText =replace( data, "*", "" )
   tr.appendChild( node )
  next
 next

 result   =document.body.parentNode.outerHTML
fend
textblock skelton
<html><body></body></html>
endtextblock
textblock companieSTR
*会社名,*本社所在地
トヨタ,豊田
日産,横浜
ルノー,ブローニュ=ビヤンクール
GM,デトロイト
VW,ヴォルフスブルク
endtextblock

No.4191 2017/07/03(Mon) 19:55:55

Re: エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / よっさん
森様の提示頂きましたコードでもう一度試した所、無事できましたありがとうございます。
プラグインですがワードプレスでtablepressというものがありますので、確かにこれでエクセルデータを貼り付ければ、表作成はできます。tablepressは表作成は一手間かかるので、UWSCでできればと思っています。なんでもかんでも、UWSCでやりたい気持ちがかえって非効率にしてしまっているかもです。

No.4193 2017/07/04(Tue) 10:52:50

Re: エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / よっさん
satocha様、以前に引き続き今回もお世話になっています。教えて頂いたコードで希望の処理ができました。今の自分ではどのような構造で処理がなっているのか理解できていないので、時間をかけて読み解いていきたいと思います。
No.4194 2017/07/04(Tue) 10:54:57
モニター電源をOffでchkimgが機能しません / CORM
ノートパソコンをWindows10 homeモデルに更新したところ
モニターの電源をOFFにすると画面描写が止まるらしくUWSCのchkimgがヒットしなくなってしまいました。

レジストリ設定を変えるなどしてモニタOFF状態でもchkimgを機能させる方法を教えて頂けないでしょうか?
解決法をお持ちの方、アドバイスをお願いします

No.4183 2017/07/02(Sun) 12:48:01

Re: モニター電源をOffでchkimgが機能しません / ほり
windows10からモニターOFF時には描画出力自体をしないと以前の投稿で書いてあったような記憶があります。
省エネ関連でOSの改善でしょうか??
UWSCのことというよりもOS側の話なので、その機能を切れないかなど、ここではなくwindows関連の掲示板で問いかけた方が良いかもですね。

No.4192 2017/07/04(Tue) 10:24:04
別タブで開く画面をIESETDATAで操作したい / eric
行き詰っており、どなたか知恵をお貸しください。
社内のサイトなのですが、ログイン画面でログインするとメニュー画面に行き、そのメニューの中のハイパーリンクをクリックすると、その項目が別タブで表示され操作できるようになります。
目的は別タブで開いた画面を操作したいのですが、セキュリティの絡みで、別タブのアドレスを直接別に起動したIEに入力しても「ログイン画面」を経由するように促されます。
また、ログイン済みのIEの新規タブをクリックして入力しても同様の結果です。
IESETDATAを使用して操作したいのですが、上記の理由でリンク先のアドレスをナビゲートすることができないため、IESETDATAでの操作ができません。
IESETDATAではなく、リンク先の画面をGETIDして文字入力は一部は可能なのですが、入力できないテキストボックスがあり、どうしてもIESETDATAで入力したいのです。
別タブで開いた画面をIESETDATAで操作する方法はないでしょうか。
Windows7、IEは11です。

No.4182 2017/07/01(Sat) 23:29:04

Re: 別タブで開く画面をIESETDATAで操作したい / 森
現物確認ができないので、ベストな回答を得るのは難しいかも知れませんね。
SENDSTR(0,STR) を使い、クリップボード経由で貼り付け※SCKEY()は使えそう?
それもダメなら低レベルのウインドウ関数を使う

No.4186 2017/07/02(Sun) 19:48:06

Re: 別タブで開く画面をIESETDATAで操作したい / eric
森様 サポートありがとうございます。
現状では、おっしゃる通り画面のIDを取得してSENDSTRでテキストボックス他へ送ったのですが、一部の項目にはどうしても送れなかったので、相対座標で対処していました。
質問の件ですが、タブで開いた画面をGETACTIVEOLEOBJでIEにセットしてIESETDATAで設定することができました。
お騒がせいたしました。

No.4188 2017/07/02(Sun) 21:43:52
全1170件 [ ページ : << 1 ... 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ... 117 >> ]