[ 掲示板に戻る ]

過去ログ閲覧モード

CLKITEMの番号を数えたい / たると
会社のシステムで
リストボックスが同じところに2個並んでいます。

Aリスト  Bリスト

BのパソコンからAのパソコンに転送するためのリストなのですが
フォルダをクリックしていき、何処にあるものを持ってくるか等確認します。

そのため、

Aパソコンの
C:\TEST に

Bパソコンの
C:\MMM\YYY\A.jpeg
C:\MMM\B.jpeg
C:\MMM\ZZZZ\C.jpeg

これらを移動したい場合、
Aリストに既にあった場合は
CLKITEM(ID,"A.jpeg",CLK_LIST,True,2) 
とする必要があります。

しかし、無い場合もあります。
その場合は
CLKITEM(ID,"A.jpeg",CLK_LIST,True)
こうしないと動作しません。

最後のアイテムをダブルクリック…など
条件に合致するアイテム個数を出したいのですが
何か方法はありますでしょうか?

よろしくお願いいたします。

No.2247 2016/03/25(Fri) 12:58:35

Re: CLKITEMの番号を数えたい / stuncloud
第四引数をFALSEにすることで実際にクリック動作をさせずにクリック可能かどうかがわかるので、それでどちらをクリックするかを判断させるという手があります

if CLKITEM(ID,"A.jpeg",CLK_LIST,FALSE,2) then
 CLKITEM(ID,"A.jpeg",CLK_LIST,TRUE,2)
else
 CLKITEM(ID,"A.jpeg",CLK_LIST,TRUE,1)
endif

対象が一つまたは二つ、という場合であればこの方法が簡単ですね
三つ以上になる可能性があるのならgetitemでリストAとリストBから条件に合致するファイルの数を数えてそれに応じて番号を指定するのが良いのではないでしょうか

count = 0
for item in getitem(id, ITM_LIST, -1)
 if item = "A.jpeg" then count = count + 1
next

No.2248 2016/03/25(Fri) 13:52:17

Re: CLKITEMの番号を数えたい / たると
ありがとうございます!試してみます!!
No.2249 2016/03/25(Fri) 14:31:22
GenyMotionとuwscの相性 / ランプ
genymotionとuwscって相性悪いですか?バックグラウンドでやろうと思って
以下が作ったuwscのスクリプトなのですが、

id=GETID("Genyの情報")
MOUSEORG(id,MORG_DIRECT,MORG_BACK)
test=CHKIMG("テスト.bmp")
MSGBOX(test)

他のブラウザが被ってたり、Windowの画面外にGenyを移動させると0が返ってきて
画像認証できない。Window上に全部表示させて何もGenyのWindowに重なってないと1が返ってきて
画像認証成功します。

FireFox等のブラウザではバックグラウンド操作は成功しています。

No.2246 2016/03/25(Fri) 02:21:27
複数起動しているEXCELソフトを保存せずに全て閉じる方法について / たかし
複数起動しているEXCELソフト(例えばEXCEL2003とEXCEL2007など)を保存せずに全て閉じる方法を教えてください。
下記のスクリプトでは1つのEXCELソフトしか閉じれませんでした。
よろしくおねがいします。

例1
for a = 1 to 2
xls=GETACTIVEOLEOBJ("Excel.Application")
XLCLOSE(xls, True)
next

例2
xls=GETACTIVEOLEOBJ("Excel.Application")
XLCLOSE(xls, True)

xls2=GETACTIVEOLEOBJ("Excel.Application")
XLCLOSE(xls2, True)

No.2229 2016/03/18(Fri) 19:37:48

Re: 複数起動しているEXCELソフトを保存せずに全て閉じる方法について / umiumi
Excelは完全に終了するまでに間があるので、処理と処理の間に SLEEPが必要

while True
 Try
  xls = GETACTIVEOLEOBJ("Excel.Application")
 Except
  break
 EndTry
 Try
  XLCLOSE(xls, True)
 Except
 EndTry
 sleep(0.2)
wend

No.2230 2016/03/19(Sat) 01:43:48

Re: 複数起動しているEXCELソフトを保存せずに全て閉じる方法について / たかし
お返事ありがとうございます。
教えて頂いた方法を試したのですが、うまくいきませんでした。
引き続き解決方法があればご教示頂ければ幸甚です。

教えて頂いたスクリプトの利用結果
・エクセルを2つ起動させている状態で、このスクリプトを利用した場合、1つのエクセルしか終了せず、またUWSCはずっと起動したままです。
・クセルを1つだけ起動させている状態で、このスクリプトを利用した場合、エクセルは終了したのですが、UWSCはずっと起動したままです。

私が書いたスクリプトでエクセルを終了させて場合、エクセル終了後、UWSCも終了します。

なお、エクセルは完全に終了するまでに時間がかかるとのことでしたので、タスクマネージャーをみました。
エクセルを立ち上げるとEXCEL.EXEというイメージ名が出ました。
私が書いたスクリプトでエクセルを終了させた場合、EXCEL.EXEが消えるのはUWSCが終了後でした。
そのため、2つのエクセルを起動している状態では、何回XLCLOSEしても1つのエクセルしか終了できないようです。

なお、CTRLWINでエクセルを閉じればスクリプト終了前に、EXCEL.EXEは消えるため、複数エクセルにも対応出来ます。
ただ、CTRLWINだと保存せずに終了させる処理が複雑となるため、XLCLOSEを利用したいです。

よろしくお願い致します。

No.2231 2016/03/19(Sat) 06:29:27

Re: 複数起動しているEXCELソフトを保存せずに全て閉じる方法について / たかし
2つのスクリプト利用することで解決しました。
メインスクリプトを動かすと、全てのエクセルソフトを保存せずに全て閉じれました。
もし1つのスクリプトで解決できるならばご教示いただければ幸甚です。
メインスクリプト
Repeat
id = GETID("Microsoft Excel")
call 1つのエクセル終了.uws
sleep(1)
Until id < 0

1つのエクセル終了.uwsのスクリプト
id = GETID("Microsoft Excel")
ifb id > 0
xls=GETACTIVEOLEOBJ("Excel.Application")
XLCLOSE(xls, True)
endif

再度調べたところ、エクセルのオブジェクト取得や終了、プロセス終了は相応の勉強が必要のようでした。

よろしくおねがいします。

No.2232 2016/03/19(Sat) 10:11:03

Re: 複数起動しているEXCELソフトを保存せずに全て閉じる方法について / K.Nagatani
ただ単にExcelを保存しないで全て閉じればいいのなら

While GetID("Microsoft Excel") > 0
 REPEAT
   ACW(GETID("Microsoft Excel","XLMAIN"))
   CTRLWIN(GETID("Microsoft Excel","XLMAIN"),CLOSE)
   SLEEP(0.2)
   CLKITEM(GetID("Microsoft Excel","NUIDialog"),"保存しない")
 UNTIL GetID("Microsoft Excel","NUIDialog") > 0 or GetID("Microsoft Excel") < 0
 SLEEP(0.2)
Wend

No.2238 2016/03/19(Sat) 22:27:40

Re: 複数起動しているEXCELソフトを保存せずに全て閉じる方法について / たかし
お返事ありがとうございます。
教えて頂いたスクリプトを実行してみたのですが、私のPC環境では「保存しますか?」のメッセージで止まってしまいました。
もう少し研究してみたいと思います。
ありがとうございました。

No.2240 2016/03/20(Sun) 05:17:06

Re: 複数起動しているEXCELソフトを保存せずに全て閉じる方法について / K.Nagatani
CLKITEM(GetID("Microsoft Excel","NUIDialog"),"保存しない")のIDを確認されてみてはいかがでしょうか?
昔このサイトでいただいたものですお役に立てば・・・。

repeat
  sleep(0.5);  fukidasi("Shift + Clickで取得 : ESCで終了")
  if getkeystate(vk_shift) and getkeystate(vk_lbutton) then GetID2
until getkeystate(vk_esc)

procedure GetID2()
  ID = getid(get_frompoint_win)
  Str = "ID = GetID(<#dbl>" + status(ID,st_title) + "<#dbl>,<#dbl>" + status(ID,st_class) + "<#dbl>)"
  IDf = fopen("ID.uws",f_write);  fput(IDf,Str);  fclose(IDf)
  exec("notepad ID.uws")
  while getkeystate(vk_lbutton); wend
fend

また、ExcelVBAを使用されている場合、VBAの書き方によってはプロセス(メモリ?)に「EXCEL.EXE」が
複数できる場合がありますので一度確認されてみてはいかがでしょうか?

No.2241 2016/03/20(Sun) 08:09:42

Re: 複数起動しているEXCELソフトを保存せずに全て閉じる方法について / たかし
ID確認の方法を教えて頂き、ありがとうございます。
この方法でID確認し、教えて頂いたスクリプトを修正しようと思います。

EXCEL.EXEの件、ありがとございます。
確認したところ、エクセルのプロセスは複数ありました。
そのため私の環境ではXLCLOSEを使ってシンプルにエクセルを終了させることが出来なかったようです。
上記のようにcallを使って一旦は自己解決したものの、今後のために勉強しようとおもいます。
ご丁寧にありがとうございました。

No.2243 2016/03/21(Mon) 09:49:48

Re: 複数起動しているEXCELソフトを保存せずに全て閉じる方法について / しろまさ
// 保存しない条件であればこれ・・・遅かったか。。

DosCmd("TASKKILL /F /IM excel.exe")

// 未保存XLのWB取得が出来なくてCOM検証に時間が掛かりました。(そして強制終了に頼る^^)

No.2244 2016/03/21(Mon) 10:12:36

Re: 複数起動しているEXCELソフトを保存せずに全て閉じる方法について / たかし
お返事ありがとうございます。

DosCmd("TASKKILL /F /IM excel.exe")は私の環境でもすべてのエクセルが終了出来ました!

DosCmd("TASKKILL /F も試したのですが/Fの使い方が悪かったのか、そのときはうまくいきませんでした。
また、強制終了だとブックに悪影響がある気がして、あまり研究しませんでした。
これだとシンプルに終了出来ますね。

質問するまでに10数時間掛けて調べたのですが、なかなか良いスクリプトが見つかりませんでした。
お陰様でなんとかなりそうです。
ありがとうございます。

No.2245 2016/03/21(Mon) 13:25:44
ie.document.frames.itemエラー / sen
いつもお世話になっております。
以前教えていただいたのを快適に使用させていただいていたのですが、
いつの間にかエラーが出て止まるようになっていました。
変更したのは、ipアドレスくらいなのですが、どうすれば元のように動きますでしょうか?
(IE.Navigateのipアドレスの部分はきちんと直しました。開くのは問題ありません。)
ご教授願いませんでしょうか?

エラーメッセージ
//COM_Error:Access violation at address 00680641 in module 'UWSC.exe'. Read of address 00000000 48行目: リンク = IE.document.frames.item["FrMenu"].document.getElementsByTagName("a")

Public IE
DIM 選択
SELECT SLCTBOX(SLCT_BTN or SLCT_STR,0,"項目選択","開くのみ","エリア別一括印刷","■終了■")
 CASE "開くのみ"
  Pたぴた開く
 CASE "エリア別一括印刷"
  選択 = "エリア別一括印刷"
 CASE "終了"
  EXITEXIT
selend

IFB 選択 = "エリア別一括印刷" THEN
 dim セレクト
 SELECT SLCTBOX(SLCT_BTN or SLCT_STR,0,"印刷","A社")
  CASE "A社"
   セレクト = "A社"
 selend

 hashtbl アドレス
 dim リンク = ie.document.frames.item("FrMenu").document.getElementsByTagName("a")

 dim 店id = fopen("",F_READ or F_WRITE)// テンポラリーファイル作成
 Fput(店id,企業体分類, F_ALLTEXT)// ファイル形式で利用
  for リンク in getoleitem(リンク)
   for i = 1 to fget(店id,F_LINECOUNT)
    ifb セレクト= fget(店id,i,2) then
     ifb リンク.innerText = fget(店id,i,1) then
      アドレス[fget(店id,i,1)] = リンク.href
     endif
    endif
   next
  next
 fclose(店id)

 for k in アドレス
  BusyWait()
  ie.navigate(アドレス[k])
  BusyWait()
  ie.ExecWB(6, 0) // 印刷ダイアログ
  sleep(0.1)
  id = GETID("印刷", "#32770", -1)
  sleep(0.1)
  CLKITEM(id, "印刷(P)", CLK_BTN)
  sleep(0.5)
 next

 IE.QUIT
ENDIF

///////////////////////////////////////////////////////////////////////
procedure Pたぴた開く()
 IE = CreateOLEObj("InternetExplorer.Application")
 IE.Visible = True
 setOleEvent()
 IE.Navigate("http://172.27.5.5/tapita/home.html")
 BusyWait()
 IESetData(IE,"a","id") // TEXT
 IE.Navigate("http://172.27.5.5/tapita/home.html?menu=uent&user=a") // INPUT
 BusyWait()
 IESetData(IE,True,"","ログイン") // BUTTON
 BusyWait()
 IELink(IE,"遠方工事")
 BusyWait()
 id = GETID("たぴた - Internet Explorer", "IEFrame", -1)
 CTRLWIN(id, MAX)
FEND

DEF_DLL SendMessageA(Hwnd, Long, Long, Dword): bool: user32
CONST WM_ACTIVATE = $06
Public Pub_url, Pub_docc, Pub_BeforNav_cnt, Pub_DocComp_cnt, Pub_inp_flg
Procedure BusyWait()
Sleep(0.3)
tm = GetTime()
repeat
ifb GetTime() - tm > 90 // TimeOut
Pub_docc = ""; Pub_BeforNav_cnt=0; Pub_DocComp_cnt=0
IE.Navigate(Pub_url)
tm = GetTime()
endif
Sleep(0.2)
ifb Pub_inp_flg
Pub_inp_flg = False
continue
endif
if IE.busy then continue
if Pub_url = "" then break // No read
if (Pos("*"+Pub_url+"*",Pub_docc)) or (Pos("*"+IE.LocationURL+"*",Pub_docc)) or (Pub_BeforNav_cnt<=Pub_DocComp_cnt) then else continue
errflg = False
if IE.document.title = "503 Unavailable" then errflg = True
if IE.document.title = "Service Unavailable" then errflg = True
if IE.document.title = "503 Service Temporarily Unavailable" then errflg = True
ifb errflg
Sleep(90) // 503: Wait&Retry
tm = 0
continue
endif
Sleep(0.3)
until ! Pub_inp_flg
Pub_url=""; Pub_docc=""; Pub_BeforNav_cnt=0; Pub_DocComp_cnt=0
SendMessageA(IE.Hwnd, WM_ACTIVATE, 0, 0)
Fend
Procedure setOleEvent()
OleEvent(IE, "DWebBrowserEvents2", "BeforeNavigate2", "fucBeforNav")
OleEvent(IE, "DWebBrowserEvents2", "DocumentComplete", "fucDocComp")
OleEvent(IE, "DWebBrowserEvents2", "OnQuit", "fucQuit")
Pub_url=""; Pub_docc=""; Pub_BeforNav_cnt=0; Pub_DocComp_cnt=0; Pub_inp_flg=False
Fend
Procedure fucBeforNav()
ifb (Pos("javascript:",""+EVENT_PRM[1])=0) and ("about:blank"<>""+EVENT_PRM[1])
if Pub_url="" then Pub_url = ""+EVENT_PRM[1]
Pub_BeforNav_cnt = Pub_BeforNav_cnt + 1
endif
Pub_inp_flg = True
Fend
Procedure fucDocComp()
ifb (Pos("javascript:",""+EVENT_PRM[1])=0) and ("about:blank"<>""+EVENT_PRM[1])
Pub_docc = Pub_docc + "*"+EVENT_PRM[1]+"*"
Pub_DocComp_cnt = Pub_DocComp_cnt + 1
endif
Pub_inp_flg = True
Fend
Procedure fucQuit()
ExitExit
Fend
Procedure PopupWin(title, btn, no=-1, str="")
id = Getid(title,"#32770",10)
Sleep(1)
if no>=0 then Sendstr(id,str,no,True)
Clkitem(id,btn)
Fend

TEXTBLOCK 企業体分類
鰍`社 厚木店,A社
ENDTEXTBLOCK

No.2216 2016/03/16(Wed) 21:52:53

Re: ie.document.frames.itemエラー / umiumi
おそらくフレーム間のアドレスが別になった為
http://www.uwsc.info/faq.html#N37

No.2219 2016/03/17(Thu) 00:51:19

Re: ie.document.frames.itemエラー / sen
フレーム間のアドレスは、どうやったら調べられるのでしょうか?
No.2220 2016/03/17(Thu) 01:17:28

Re: ie.document.frames.itemエラー / umiumi
home.html の中で フレーム(FrMenu) の定義がされているはずです。
そのフレームのパスを確認してください。

No.2228 2016/03/17(Thu) 23:28:41

Re: ie.document.frames.itemエラー / SEN
下記の様に書かれているのですが、どうなのでしょうか?


home.html

<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>たぴた</TITLE>
</HEAD>
<BODY>
<P align="right"><FONT SIZE=-1><B>Webデータベース</FONT> <FONT COLOR="#008B45">たぴた</B></FONT>
<CENTER><H1>MENU</H1></CENTER><HR>
<table align="center" border=0>
<TR><TD><H3><A HREF="view.html?menu=top&db=899395fb8d488e96">遠方工事</a></H3></TD></TR>
<TR><TD><H3><A HREF="admin.html">管理画面</a></H3></TD></TR>
</TABLE><HR>
</BODY>
</HTML>


home.html?menu=uent&user=a

<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>たぴた</TITLE>
</HEAD>
<FRAMESET COLS="200,*">
<FRAME SRC="view.html?menu=list&db=899395fb8d488e96" NAME="FrMenu">
<FRAME SRC="view.html?menu=title&db=899395fb8d488e96" NAME="FrMain">
</FRAMESET>
</HTML>

No.2235 2016/03/19(Sat) 19:14:53

Re: ie.document.frames.itemエラー / umiumi
データベースを参照しているようで、それが別の場所なのでは。
社内システムだと思うので、これ以上はシステム管理者の方に尋ねてください。

あるいは以下を試してみる
IEGETSRCでソースを取得しフォームに書き出し利用
form = CREATEFORM("about:blank", "", True, FOM_FORMHIDE)
form.document.write(IEGETSRC(IE, "BODY", 1))    // 数字は試して合わせてください
dim リンク = form.document.getElementsByTagName("a")

No.2242 2016/03/20(Sun) 21:20:54
Windows10+InternetExplorer11でエラーが発生します / きの子
環境は、Windows10で一昨日の状態で、WindowsUpdateを終了させて更新がない最新版の状態です。
(TH2からのクリーンインストールしてWindowsUpdateした状態で、EaseUS Todo Backup、ATOK2015、ウイルスバスタークラウド最新版、以外のアプリケーションはもちろん、MS-Officeもインストールしていません)
UWSCは、Pro版のVersion5.2.1.0です。

RecIEでの自動記述コードに追記した部分は、
 While True
   IE.Navigate("http://www.yahoo.co.jp/")
   BusyWait()
   Sleep(10) // 10秒の間を取る
 Wend
のみです。

上記の環境のyahoo.uwsを実行させて、3〜4時間しますとかなりの確率でエラーが発生します。
(Sleep(10)をカットすればもっと短時間でエラーがでるかもしれません)
エラー内容は、
 Internet Explorerは動作を停止しました
 問題が発生したため、プログラムが正しく動作しなくなりました。プログラムは閉じられ、解決策がある場合はWindowsから通知されます。
というものです。
http://i.imgur.com/LiibtZv.jpg

そのエラーを閉じますと、
 COM_Error:例外が発生しました。
 33行目:IF IE.busy THEN CONTINUE
という表示ですので、Procedure BusyWait() 内の if IE.busy then continue がエラーになっているようです。
http://i.imgur.com/JqBlrvm.jpg

投稿しますと、URLが多すぎるとのエラーが出てしまうので、次に投稿します。

No.2236 2016/03/19(Sat) 19:52:59

Re: Windows10+InternetExplorer11でエラーが発生します / routa
IEは長時間の使用で不安定になりますね。
適当な回数でIEを再起動したらどうでしょうか。

No.2239 2016/03/19(Sat) 23:17:04
Windows10+InternetExplorer11でエラーが発生します / きの子
前の投稿からの続きです。

Yahoo.UWSの中身は、
http://i.imgur.com/JMeMCIi.jpg
です

解決方法がありましたら教えて頂けないでしょうか?
宜しくお願いいたします。

No.2237 2016/03/19(Sat) 19:53:43
Unicodeを含んだ文字列の処理について / リキュール
IE.document.body.innerTEXT で取り込んだ中に Unicode が含まれています。
CHK = ISUNICODE(文字列) で確認できます。
文字列の Unicode 部分を " "(スペース文字)に変換したいのですが方法がわかりません。
Unicode 部分の取り出しが出来れば REPLACE(文字列,?," ") で処理できるのですが。
よろしくお願いします。

No.2233 2016/03/19(Sat) 15:57:48

Re: Unicodeを含んだ文字列の処理について / リキュール
自己解決しました。

LEN = LENGTH(文字列)
for i = 1 to LEN
MOJI = COPY(文字列,i,1)
if ISUNICODE(MOJI) = true then
文字列 = REPLACE(文字列,MOJI," ")
endif
next

もっと簡単な方法がありましたらお願いします。

No.2234 2016/03/19(Sat) 17:22:42
inputなどの表示位置を記憶したい / もす
input()の表示位置を記憶して次回起動時に同じ位置に表示するのって簡単にできますか?

短いスクリプトで初期値も横着してinput()で済ましているような物を使う時、
邪魔にならない位置に置きたいけど固定位置というほどではないような場合、
前回表示位置の記憶が簡単にできそうなら、スクリプト作成時のテンプレにしたいのですが
難しいでしょうか?

No.2223 2016/03/17(Thu) 12:28:11

Re: inputなどの表示位置を記憶したい / stuncloud
座標を監視しておく関数をthreadで実行しておくのが定番ですね

--------------------------------------
public Point[1]

thread KeepInputBoxPoint()
input("好きな場所に移動して閉じる")

input(Point[0] + ":" + Point[1], "", FALSE, Point[0], Point[1])

procedure KeepInputBoxPoint()
 id = getid("", "TUinpBox_uwsc")
 while status(id, ST_VISIBLE)
  Point[0] = status(id, ST_X)
  Point[1] = status(id, ST_Y)
  sleep(0.1)
 wend
fend
--------------------------------------

> thread KeepInputBoxPoint()
をinput()の直前に呼んでおくと、Point[]に座標が保存されます
毎回これを書くのも面倒なので

--------------------------------------
function input2(msg, default = EMPTY, pwd = FALSE)
 thread KeepInputBoxPoint()
 if Point[0] = EMPTY or Point[1] = EMPTY then
  result = input(msg, default, pwd)
 else
  result = input(msg, default, pwd, Point[0], Point[1])
 endif
fend
--------------------------------------

こんな関数を作っておくと楽ちんです

No.2225 2016/03/17(Thu) 16:57:56

Re: inputなどの表示位置を記憶したい / もす
ありがとうございます!
No.2227 2016/03/17(Thu) 18:50:05
CREATEFORMのデータ取得が遅いです / M
CREATEFORMを関数を作って別スレッドで実行しているのですが、データの取得が遅いです。
普通に関数を実行すると速くデータを取得できるのですが、別スレッドにすると異常に遅いです。

あと、PUBLIC変数でCREATEFORMから取得して、別スレッドでCOMを操作しようとすると、
COMエラーになります。

フォームはラジオボタンとチェックボックスとセレクトボックスのみです。
データの取得はGETFORMDATAを使っています。

速くする方法があれば教えてください
UWSCは最新版を使ってます。

よろしくお願いします。

No.2208 2016/03/14(Mon) 13:27:49

Re: CREATEFORMのデータ取得が遅いです / M
わかりづらかったかもしれないので、簡単なコードを作ってみました。
下のコードは初めのウィンドウから変更すると吹き出しを表示するプログラムですが、
吹き出しの表示が遅いです。THREADを取って実行すると速く表示されます。
何かおかしなところがあれば教えてください。
よろしくお願いします。

PUBLIC COMID
THREAD WIN1()
SLEEP(200)

PROCEDURE WIN1()
COMID=CREATEFORM("about:blank","",TRUE,,450,200)
COMID.Document.write(block1)
SETFORMDATA(TRUE,"radio",1)
SETFORMDATA(false,"check1")
SETFORMDATA(false,"check2")
SETFORMDATA(false,"check3")
COMID.document.getElementById("select1").options[0].selected= true;
COMID.document.getElementById("select2").options[0].selected= true;
COMID.document.getElementById("select3").options[0].selected= true;
WHILE TRUE
IF 1 <> IEGETDATA(COMID,"radio",FOM_GETVALUE)
fukidasi("radio")
ELSEIF false <> IEGETDATA(COMID,"check1")
fukidasi("check1")
ELSEIF false <> IEGETDATA(COMID,"check2")
fukidasi("check2")
ELSEIF false <> IEGETDATA(COMID,"check3")
fukidasi("check3")
ELSEIF 1 <> val(IEGETDATA(COMID,"select1"))
fukidasi("select1")
ELSEIF 1 <> val(IEGETDATA(COMID,"select2"))
fukidasi("select2")
ELSEIF 1 <> val(IEGETDATA(COMID,"select3"))
fukidasi("select3")
ELSE
fukidasi()
ENDIF
SLEEP(0.1)
WEND
FEND

Textblock block1
<body>
<table border="0"><tr><td>
<input name="radio" type="radio" id="radio1" value="1" /><label for="radio1">radio1</label>
<input type="radio" name="radio" id="radio2" value="2" /><label for="radio2">radio2</label>
<input type="radio" name="radio" id="radio3" value="3" /><label for="radio3">radio3</label>
<input type="radio" name="radio" id="radio4" value="4" /><label for="radio4">radio4</label>
</td></tr><tr><td>
<input type="checkbox" name="check1" id="check1" /><label for="check1">check1</label>
<input type="checkbox" name="check2" id="check2" /><label for="check2">check2</label>
<input type="checkbox" name="check3" id="check3" /><label for="check3">check3</label>
</td></tr><tr><td>
<label for="select1">select1</label>
<select name="select1" id="select1">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<label for="select2">select2</label>
<select name="select2" id="select2">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<label for="select3">select3</label>
<select name="select3" id="select3">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</td></tr>
</table>
</body>
Endtextblock

No.2213 2016/03/16(Wed) 07:39:29

Re: CREATEFORMのデータ取得が遅いです / しき
>PUBLIC変数でCREATEFORMから取得して、別スレッドでCOMを操作しようとすると、COMエラーになります。
スレッド間で相互アクセスはできません。
メインでcreateしたIEオブジェクトを別スレッドで操作するには、そのスレッド内で改めてgetする必要があります

>別スレッドにすると異常に遅いです。
試してみました。スレッド内で実行すると、getformdata, iegetdata が共に遅くなりますね

//  sub_formTest("main")
thread sub_formTest("thread"); sleep(200)

procedure sub_formTest(sType)
  o_formIE = CreateForm("about:blank", "サンプル", true, ,450, 200)
  o_formIE.Document.write("<input name=txt value='"+ sType +"'>")
  
  for i=1 to 10
    t = (gettime() *1000 + g_time_zz)
    ifb (i <= 5) then
      s = "getformdata "+ getformdata("txt")
    else
      s = "iegetdata "+ iegetdata(o_formIE, "txt")
    endif
    t = (gettime() *1000 + g_time_zz) - t
    
    print i +" "+ s +" "+ t +" msec"
    sleep(0.1)
  next
  
  exitexit
fend


//結果 UWSC 5.2.1, win7pro 64bit, cpu Core i5-3570k
1 getformdata main 0 msec
2 getformdata main 0 msec
3 getformdata main 0 msec
4 getformdata main 0 msec
5 getformdata main 0 msec
6 iegetdata main 0 msec
7 iegetdata main 0 msec
8 iegetdata main 0 msec
9 iegetdata main 0 msec
10 iegetdata main 0 msec

1 getformdata thread 50 msec
2 getformdata thread 0 msec
3 getformdata thread 0 msec
4 getformdata thread 50 msec
5 getformdata thread 50 msec
6 iegetdata thread 1450 msec
7 iegetdata thread 1400 msec
8 iegetdata thread 1550 msec
9 iegetdata thread 1450 msec
10 iegetdata thread 1500 msec

No.2215 2016/03/16(Wed) 15:25:59

Re: CREATEFORMのデータ取得が遅いです / umiumi
IEGETDATA関数ではなく、GETFORMDATA関数を使用してください。
No.2217 2016/03/17(Thu) 00:36:47

Re: CREATEFORMのデータ取得が遅いです / M
しきさん、umiumiさん
回答ありがとうございます。

IEGETDATAもGETFORMDATAも同じものだろうと勝手に思いこんでいました。
GETFORMDATAに変えたところ速くなりました。
ありがとうございます。

スレッド間の相互アクセスはできないとありますが、数値や文字の入った変数は
読み書きできています。COMオブジェクトのみできないということでしょうか?

No.2221 2016/03/17(Thu) 02:16:53

Re: CREATEFORMのデータ取得が遅いです / しき
>スレッド間の相互アクセスはできないとありますが、数値や文字の入った変数は
>読み書きできています。COMオブジェクトのみできないということでしょうか?

できるものとできないものがあります。
経験上、ウインドウを持つCOMオブジェクトはNGのようです


public o_Fs, o_Ws, dic, o_IE, o_Excel
o_Fs = CreateOleObj("Scripting.FileSystemObject")
o_Ws = CreateOleObj("WScript.Shell")
dic = CreateOleObj("Scripting.Dictionary")

o_IE = CreateOleObj("InternetExplorer.Application")
o_IE.Visible = true

o_Excel = CreateOleObj("Excel.Application")
o_Excel.Visible = true

//sub_threadTest()
thread sub_threadTest(); sleep(30)

procedure sub_threadTest()
  print o_Fs.GetTempName()
  print o_Ws.CurrentDirectory
  print dic.Count
  
//  print o_Excel.Version //threadでエラー
  msgbox(o_IE.FullName) //threadでエラー
  
  exitexit
fend

No.2224 2016/03/17(Thu) 14:52:44

Re: CREATEFORMのデータ取得が遅いです / M
しきさん、回答ありがとうございます。

できるものとできないものがあるのですね、勉強になりました。
できれば相互アクセスできるように対応してほしいですが、
現状できないとわかったのでよかったです。

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

No.2226 2016/03/17(Thu) 18:17:27
記録したものの再生速度について / Frad
記録したものを再生すると記録した時の2分の1程度の速さで再生されてしまうんですが、
タイミングを手動で書き換えてというのも量が膨大で途方に暮れそうです・・・
なにかいい方法はないでしょうか?

No.2222 2016/03/17(Thu) 03:46:31
全692件 [ ページ : << 1 ... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 70 >> ]