12067
UWSC 仮 掲示板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオンにしてください
動作不具合での質問の場合には環境(OS,IEのバージョン等)の表記もしてください
タイトルは質問内容を表したものにしてください
ネットゲーム関係の質問はご遠慮ください
UWSC掲示板 が復活することを祈り、それまでの繋ぎとして。
Gmailのログイン / アホの僕
Gmailへのログインを行いたくて、RecIEで記述させたところ、下記になりましたが、InternetExplorer11で実行しても動きません。

IESetData(IE,"xxxxxxxx@gmail.com","Email")
IESetData(IE,True,"signIn")

内容は、
【GmailへログインするURL】
https://accounts.google.com/ServiceLogin/signinchooser?service=mail&flowName=GlifWebSignIn&flowEntry=ServiceLogin
【メールアドレス入力する部分のBODY】
<input name="identifier" tabindex="0" class="whsOnd zHQkBf" id="identifierId" dir="ltr" spellcheck="false" aria-label="メールアドレスまたは電話番号" type="email" jsname="YPqjbf" data-initial-value="" data-initial-dir="ltr" autocapitalize="none" autocomplete="username">
【次へのBODY】
<span class="RveJvd snByac">次へ</span>

なのですが、どのようにすればメールアドレスを入力し、次へのボタンをクリックすることができるか、ご教示頂ければと思います。

No.159 2019/01/11(Fri) 17:39:19

Re: Gmailのログイン / stuncloud
nameが違いますね
iesetdataだと次へボタンは押せるかよくわかんなかったので使ってません

IESetData(IE,"xxxxxxxx@gmail.com","identifier")
ie.document.querySelector("#identifierNext span").click()

No.160 2019/01/11(Fri) 19:21:30

Re: Gmailのログイン / アホの僕
stuncloudさん

さすがです。
stuncloudさんに教えて頂いたものを参考にして、次のパスワードを入れるところまで行きました。
これから、また次を悩みます。

どうも有り難うございました。

No.161 2019/01/11(Fri) 21:39:27

Re: Gmailのログイン / stuncloud
がんばってください

と言いたいところなんですが…gmailに限らずgoogleのwebアプリはかなり複雑なのでdom操作でどうにかしようとなるとかなりめんどくさい(僕ならやりたくない)んですよね
そもそももうあまりIEを使いたくないというのもあります
で、gmailに関してはいくつか代替手段が考えられるので、もしIE操作で行き詰まってしまったらそれらに移行することも検討してみてください

1. メールソフトを使う

メールソフトはUWSCで操作しやすいものが良いでしょう
clkitemやsendstrなどで操作できるし、予めgmailのSMTPを登録しておくことになるのでメール送信時のログイン処理などは省けます

2. CDOを使う

GUIの操作がなくなるので早いです
「CDO gmail」で検索するとサンプルが山ほど出てくるので、学習コストがわりと低いところが良いですね
ただし、gmailの運用のしかたによってはCDOではメールが送れないかもしれません

3. google APIを使う

僕なら迷わずこれにします
ただし、
・APIを使うまでの敷居が高め
・APIを使えるようになるまでの学習コストが高め
なのでそのあたりにくじけないほどのやる気が出せるかどうかがポイントですかね

オススメは1かな

No.162 2019/01/11(Fri) 23:25:36
ファイル数とID数が違う時、増えた分のIDの把握について / せつき
ファイル数とID一覧の配列サイズが違ったら、新しく増えたIDを取得して把握したいのですが、コードの書き方が分かりません。
教えて頂けないでしょうか?

fp="C:\\user\a\"
num=getdir(fp)//ファイル数7 idにもとづいてファイルを取得する

Dim ID一覧 =1,2,3,4,5,6,7,8,9,10
a=LENGTH(ID一覧)

if num<>a then //id数とファイル数が違ったら処理
cou=0
for i in hai
if i=getdir_files[cou] then
continue
else
sendstr(0,i)//新しく増えたIDの把握
cou=cou+1
endif
next
endif

No.136 2018/12/29(Sat) 13:01:37

Re: ファイル数とID数が違う時、増えた分のIDの把握について / Rayna
>>136 せつき さん

構文が間違っているところが結構あるのでヘルプを確認しながら
見直してみることをおすすめします
元のスクリプトにUWSCが何をしようとしてるかの説明付けときますので参考になれば。


//| Test.uws |////////////////////////////////////////
//| 変数 fp にフォルダパスを代入
//|  UWSCの文字列においてバックスラッシュのエスケープは必要ありませんので
//|  fp="C:\user\a\" で大丈夫です
fp="C:\\user\a\"

//| 変数 num に fp 内のファイル数を代入(ファイル名一覧は 配列変数 GETDIR_FILES に格納)
//|  IDに基づいてっていうのがよくわかりませんでした
//|  GetDir関数でファイル名を獲得する際にIDは生成されません
num=getdir(fp) // ファイル数7 idにもとづいてファイルを取得する

//| 変数 ID一覧 を宣言、1を代入
//|  配列の宣言をしたいのかもですが、構文が間違っています
//|  正しくは Dim ID一覧[]=1,2,3,4,5,6,7,8,9,10 です
Dim ID一覧 =1,2,3,4,5,6,7,8,9,10

//| 変数 a に ID一覧 の長さ(1)を代入
//|  変数 a には 1 が代入されていますので 長さは 1 です
a=LENGTH(ID一覧)

//| numとaを比較して 等しくないなら実行
//|  ファイル数が7なのであれば絶対に実行されません
if num<>a then //id数とファイル数が違ったら処理
 //| 変数 cou に 0 を代入
 cou=0
 //| 変数 hai の要素を 変数 i に順次代入
 //|  変数 hai は宣言されてないので配列としても文字列としても要素を読み出すことができません
 //|  実行するとわかりますがここでエラーが出ます。
 for i in hai
  //| i と GETDIR_FILES[cou] を比較して条件分岐します
  if i=getdir_files[cou] then
   //| ループを最初から、hai から次の要素を読み出します
   continue
  else
   //| 変数 i を クリップボードにコピーします
   //|  クリップボードは上書きされるのでこの場合 hai 最後の要素だけがクリップボードにコピーされます
   sendstr(0,i)//新しく増えたIDの把握
   //| 変数 cou に 1 足します
   cou=cou+1
  endif
 next
endif
//////////////////////////////////////////////////////

No.138 2018/12/30(Sun) 22:52:32

Re: ファイル数とID数が違う時、増えた分のIDの把握について / せつき
Rayna様、返信ありがとうございます。詳細な説明感謝します。
私のしたい処理が下記になります。

//ID一覧ファイルの内容は増えたり減ったりする、今回は4つあるとする
[ID一覧.txt]
882_ファイル1
879_テスト
877_検証
862_UWSC

//下記のディレクトリには3つのファイルが作成されている
a="C:\user\ローカル\"

C:\user\ローカル\882_ファイル1.md
C:\user\ローカル\879_テスト.md
C:\user\ローカル\877_検証.md

したい処理は、上記の2つを比較して差分である862_UWSCを取得したいです。
ID一覧.txtの内容は、配列にいれる。
dim hai[]="882_ファイル1","879_テスト","877_検証","862_UWSC"

getdir(a)

これで2つの配列が作成。
これを比較して差分である862_UWSCを取得したい。

No.139 2018/12/31(Mon) 00:56:12

Re: ファイル数とID数が違う時、増えた分のIDの把握について / Rayna
>>139 せつき さん
思ったのと違いましたが、そういう動作をするのならファイルの存在確認をしたほうが手っ取り早いかもです
減った分の獲得をしたいなら逆のことをすればいいです

//| IdCheck.uws |///////////////////////////////////////////////////
//| 初期定義
Dim pathTargetDir = フォルダのパス
Dim pathIdListTxt = ID一覧のパス
Dim arrayExt[] = ".md"

//| 増えた分の差分の獲得
Dim fidIdList=FOpen(pathIdListTxt), arrayId=Split(FGet(fidIdList, F_ALLTEXT), "<#CR>", TRUE); FClose(fidIdList)
Dim strResult = ""
Dim Id, Ext
For Id In arrayId
 For Ext In arrayExt
  If FOpen(pathTargetDir+"\"+Id+Ext, F_EXISTS) Then Continue 2 Else Break
 Next
 If Length(strResult) Then strResult=strResult+"<#CR>"+Id Else strResult=Id
Next
If Length(strResult) Then MsgBox(strResult) Else MsgBox("増えてないよ")

//| 減った分の差分の獲得
GetDir(pathTargetDir)
Dim arrayFile = Slice(GETDIR_FILES)
Dim strIdList = "<#CR>" + Join(arrayId, "<#CR>") + "<#CR>"
Dim File
strResult = ""
For File In arrayFile
 For Ext In arrayExt
  If Pos("<#CR>"+Replace(File, Ext, "")+"<#CR>", strIdList) Then Continue 2 Else Break
 Next
 If Length(strResult) Then strResult=strResult+"<#CR>"+File Else strResult=File
Next
If Length(strResult) Then MsgBox(strResult) Else MsgBox("減ってないよ")
////////////////////////////////////////////////////////////////////

No.141 2019/01/01(Tue) 11:34:12

Re: ファイル数とID数が違う時、増えた分のIDの把握について / せつき
Rayna様、回答ありがとうございます。期待通りの処理ができました。
forinを2重に使用してContinue 2、条件外でBreakかなり解読に難しいですね。
何回も見て解読しようとしてますが、なかなかですね。

>>For Id In arrayId
 For Ext In arrayExt
  If FOpen(pathTargetDir+"\"+Id+Ext, F_EXISTS) Then Continue 2 Else Break
 Next
 If Length(strResult) Then strResult=strResult+"<#CR>"+Id Else strResult=Id
Next
---------------------
>>GetDir(pathTargetDir)
>>Dim arrayFile = Slice(GETDIR_FILES)


上記ですが、GETDIR_FILESの配列のまま利用もできると思うのですが、なぜSliceするのかが分かりません。arrayFileという配列名で指定できるのでわかりやすくするために、Sliceしているのかな?とも思っています。
---------------------
>>Dim fidIdList=FOpen(pathIdListTxt), arrayId=Split(FGet(fidIdList, F_ALLTEXT), "<#CR>", TRUE); FClose(fidIdList)

「;」の利用ですが、これはどういう意図で使用するのでしょうか?わたしの認識としては、1行にまとめたい時に利用するという認識です。

No.151 2019/01/03(Thu) 15:49:53

Re: ファイル数とID数が違う時、増えた分のIDの把握について / Rayna
>>151 せつき さん

> forinを2重に使用してContinue 2、条件外でBreakかなり解読に難しいですね。
> 何回も見て解読しようとしてますが、なかなかですね。


「ファイルが作成されている」とだけで拡張子の数が不明瞭だったので拡張性をもたせました
拡張子が1つしかないなら単純化できます

//| No151.uws |/////////
Ext=".md"
For Id In arrayId
 If FOpen(pathTargetDir+"\"+Id+Ext, F_EXISTS) Then Continue
 If Length(strResult) Then strResult=strResult+"<#CR>"+Id Else strResult=Id
Next
////////////////////////

拾ったスクリプトで何をしているかわからないときは
検証スクリプト作って自分で試してみるのも手ですね
私もわからないときはします
---------------------
> arrayFileという配列名で指定できるのでわかりやすくするために、Sliceしているのかな?とも思っています。
そのとおりです
---------------------
> 「;」の利用ですが、これはどういう意図で使用するのでしょうか?わたしの認識としては、1行にまとめたい時に利用するという認識です。
そのとおりです、ファイルのオープン・クローズ処理を1行にまとめたかったので使いました

No.155 2019/01/05(Sat) 12:13:03

Re: ファイル数とID数が違う時、増えた分のIDの把握について / せつき
Rayna様、返信ありがとうございます。

>>拾ったスクリプトで何をしているかわからないときは
検証スクリプト作って自分で試してみるのも手ですね
私もわからないときはします

私もひろったスクリプトは、なるだけ部分的な最小化した形で検証するようにはしてます。

No.156 2019/01/06(Sun) 14:29:17
slctboxのタイトルバーをアクティブにしてクリックする方法 / せりあ
slctboxのタイトルバーをアクティブにしてクリックをしたいのですが、カーソルがタイトルバーにいってくれません。
なにか良い方法ないでしょうか?


dim hai[]="0","1","2"
iti=slctbox(SLCT_BTN or SLCT_NUM, 0, "カテゴリー選択",hai)

sec=2
SLEEP(sec)
id = GETID("UWSC - " + Get_UWSC_Name, "TUslctBox_uwsc")
x = status(id, ST_x) + status(id, ST_WIDTH) / 2
y = status(id, ST_Y) + 10
// mmv(x, y) // ポインタで座標確認
btn(LEFT, CLICK, x, y)

No.152 2019/01/03(Thu) 15:51:47

Re: slctboxのタイトルバーをアクティブにしてクリックする方法 / satocha
そのスクリプトだと、
iti=slctbox(SLCT_BTN or SLCT_NUM, 0, "カテゴリー選択",hai)
が終わらないと(つまり手入力でボタンをクリックした後でないと)次の行に進みません。
スクリプトでクリックするには、同時並行でクリックするプロシジャを呼び出さなければなりません。
そのための構文としてthreadが用意されています。

thread sbClick()
dim hai[]="0","1","2"
iti=slctbox(SLCT_BTN or SLCT_NUM, 0, "カテゴリー選択",hai)
msgbox(iti)

procedure sbClick()
 id = GETID("UWSC - " + Get_UWSC_Name, "TUslctBox_uwsc",-1)
 x = status(id, ST_x) + status(id, ST_WIDTH) / 2
//Y座標の調整は試行錯誤で決めてください。下の170は私の環境で2を押してくれます。
 y = status(id, ST_Y) + 170
 btn(LEFT, CLICK, x, y)
fend

No.154 2019/01/04(Fri) 01:35:48
EXCELウィンドウ内へBALLOON表示 / ROM
お世話になります。

EXCELファイルを開き、EXCELのウィンドウ内にBALLOONやMsgBOXを表示したい。
以下のようなスクリプトを実行したところ、BALLOONの表示位置はEXCELウィンドウの左上よりズレた位置に表示されます。
EXCELの位置情報とUWSCの位置情報とはズレが有る(何等かの変換が必要?)のでしょうか?
どなたか、ご教示いただければ幸いです。

Excel = XLOPEN( "Test.xlsx")
vTop=Excel.Application.Top
vLeft=Excel.Application.Left
BALLOON("Test",vLeft,vTop)

環境:Windows10、EXCEL2013、UWSC5.3.0.2

No.103 2018/12/21(Fri) 11:55:59

Re: EXCELウィンドウ内へBALLOON表示 / stuncloud
status()はどうでしょうか
こちらではExcelのウィンドウの左上にballoonが表示されました
(Excel2016)

id = hndtoid(Excel.hwnd)
vTop = status(id, ST_X)
vLeft = status(id, ST_Y)

No.104 2018/12/21(Fri) 15:12:33

Re: EXCELウィンドウ内へBALLOON表示 / ROM
stuncloudさん

返事が遅くなり、申し訳ありません。

hndtoidコマンド、大変勉強になりました。
ありがとうございました!!

No.153 2019/01/03(Thu) 17:05:14
作業時間計算スクリプトの書き方 / かなこ
作業開始してスクリプト起動して開始時間である1119(11時19分)を1行目に書込する。
作業終了にスクリプト起動して終了時間を2行目に書込する。
2行目から1行目を引いて、0705(7時間05分)を取得する方法が分かりません。
ご教授願いませんでしょうか

[作業時間計算スクリプト]
w_fp="C:\User\作業時間記録.txt"

GETTIME()

time =G_TIME_HH2 + G_TIME_NN2

fid=fopen(w_fp, f_read or F_WRITE8)
fput(fid,GETTIME)
fclose(fid)

[作業時間記録.txt]
1105
1810
---------------------

No.140 2019/01/01(Tue) 11:28:32

Re: 作業時間計算スクリプトの書き方 / Rayna
>>140 かなこ さん

時間のフォーマットが HHNN なので GetTime の第2引数を使うのが簡単だと思います
GetTime を多用したくない場合は FGet したものを Copy で2桁ずつにばらして計算すれば大丈夫です

//| CalcTime.uws |//////////////////////////////////////////////
Dim arrayDemo[] = "開始時間記録部", "終了時間記録部", "作業時間計算部"
Dim pathWorkTimeTxt = "作業時間記録.txt"
Dim secStart, secEnd

Dim fid = FOpen(pathWorkTimeTxt, F_READ Or F_WRITE8)
Select SlctBox(SLCT_BTN Or SLCT_STR, 0, "処理を選択", arrayDemo)
Case "開始時間記録部"
 GetTime()
 FPut(fid, G_TIME_HH2+G_TIME_NN2, 1)
Case "終了時間記録部"
 GetTime()
 FPut(fid, G_TIME_HH2+G_TIME_NN2, 2)
Case "作業時間計算部"
 //| GetTime関数の戻値が0になるのが 2000/01/01 00:00:00 なのでそれに合わせてます
 //| YYYYMMDDHHNNSS の HHNN に FGet した値を入れています
 secStart = GetTime(0, "20000101"+FGet(fid, 1)+"00")
 secEnd = GetTime(0, "20000101"+FGet(fid, 2)+"00")
 GetTime((secEnd-secStart)/86400, "20000101000000")
 MsgBox("作業時間: "+G_TIME_HH2+G_TIME_NN2)
SelEnd
FClose(fid)
////////////////////////////////////////////////////////////////

No.144 2019/01/01(Tue) 14:53:44

Re: 作業時間計算スクリプトの書き方 / かなこ
Rayna様、完璧に期待通りの処理ができました。
gettimeでけっこう調べてたんですが、なかなか良い情報がなかったので助かりました。

No.148 2019/01/03(Thu) 11:12:50

Re: 作業時間計算スクリプトの書き方 / Rayna
>>148 かなこ さん
GetTimeの第2引数、最初少しわかりにくいですよね
私も最初は理解のためにサンプル作って何回か試しました
でもわかると便利なのでぜひ理解していただきたいです

そこの部分だけ少し加筆しておきますね
 //| @ 2000/01/01 00:00:00 から 2000/01/01 HH:NN:00 の秒数を獲得
 secStart = GetTime(0, "20000101"+FGet(fid, 1)+"00")
 //| A 2000/01/01 00:00:00 から 2000/01/01 HH:NN:00 の秒数を獲得
 secEnd = GetTime(0, "20000101"+FGet(fid, 2)+"00")
 //| B 2000/01/01 00:00:00 から A-@秒先 の時間を特殊変数に入れる(第1引数の単位は日)
 GetTime((secEnd-secStart)/86400, "20000101000000")
 //| C Bで獲得した特殊変数を獲得する
 MsgBox("作業時間: "+G_TIME_HH2+G_TIME_NN2)

No.150 2019/01/03(Thu) 14:39:53
最初の空行で判断して変数を2つにはそれぞれ空行までの変数、空行からの変数取得 / あらわし
最初の空行で判断して変数を2つに1文字目から最初の空行手前までを取得これをa変数とし、空行の終わりから下の文字列を取得しb変数にいれる方法を探しています。
なにか良い方法ないでしょうか?

作業内容1
作業内容2
作業内容3

テストテストテストテストテストテストテストテストテスト
テストテストテストテストテストテストテストテストテストテストテスト
テストテストテストテストテストテストテストテスト
---------------------
希望の処理

[a変数]
作業内容1
作業内容2
作業内容3

[b変数]
テストテストテストテストテストテストテストテストテスト
テストテストテストテストテストテストテストテストテストテストテスト
テストテストテストテストテストテストテストテスト

No.145 2019/01/02(Wed) 12:43:41

Re: 最初の空行で判断して変数を2つにはそれぞれ空行までの変数、空行からの変数取得 / Rayna
>>145 あらわし さん

そういう文字列操作なら
Pos, Copy, BetweenStr, Split, Join あたりですね
それぞれにメリットデメリットあります

//| No145.uws |////////////////////////////
Dim strEmptyRow = "<#CR><#CR>"
Dim a, b

Print "■Pos, Copy"
//| O 多分一番分かりやすい文字列操作です
//| X 長くなりやすい、関数を多用すると早くはないです
a = Copy(Text, 1, Pos(strEmptyRow, Text)-1)
b = Copy(Text, Pos(strEmptyRow, Text)+Length(strEmptyRow))
PutAB(a, b)

Print "■BetweenStr"
//| O 比較的シンプルで短く書ける、長い文字列のトリムのときとか便利
//| X 関数名が長いので多用すると長くなる
a = BetweenStr(Text, EMPTY, strEmptyRow)
b = BetweenStr(Text, strEmptyRow)
PutAB(a, b)

Print "■Split, Join"
//| O 空文字無視とか色々できるので便利、改行ごとに分けたい時とか重宝します
//| X 配列操作なので少しわかりにくい、配列を作成しているので多用すると遅い
Dim sarrayText = Split(Text, strEmptyRow)
a = sarrayText[0]
b = Join(sarrayText, strEmptyRow, FALSE, 1)
PutAB(a, b)

While Status(GetId(GET_LOGPRINT_WIN), ST_VISIBLE); Sleep(0.5); WEnd

TextBlock Text
作業内容1
作業内容2
作業内容3

テストテストテストテストテストテストテストテストテスト
テストテストテストテストテストテストテストテストテストテストテスト
テストテストテストテストテストテストテストテスト

1つ目より下の改行は無視
EndTextBlock

Procedure PutAB(a, b)
 Dim uwCrLf="<#CR>"
 Print "[var a]"+uwCrLf+a+uwCrLf+"[var b]"+uwCrLf+b+uwCrLf+"---"+uwCrLf
FEnd
///////////////////////////////////////////

No.146 2019/01/02(Wed) 14:16:04

Re: 最初の空行で判断して変数を2つにはそれぞれ空行までの変数、空行からの変数取得 / あらわし
Rayna様、丁寧な回答ありがとうございます。
"<#CR><#CR>"で空行を判断するのは思いつきませんでした。
下記の空行は<#CR><#CR>という判断で問題ないでしょうか?

TextBlock Text
作業内容1<#CR>
作業内容2<#CR>
作業内容3<#CR>
<#CR><#CR>
テストテストテストテストテストテストテストテストテスト<#CR>
テストテストテストテストテストテストテストテストテストテストテスト<#CR>
テストテストテストテストテストテストテストテスト<#CR>

1つ目より下の改行は無視
EndTextBlock

>a = BetweenStr(Text, EMPTY, strEmptyRow)
EMPTYがこういう形で使えるとは知りませんでした。上記のEMPTYは、作業内容1の一番最初という意味ですよね?。

No.147 2019/01/03(Thu) 11:10:26

Re: 最初の空行で判断して変数を2つにはそれぞれ空行までの変数、空行からの変数取得 / Rayna
>>147 あらわし さん
--------------------
> 下記の空行は<#CR><#CR>という判断で問題ないでしょうか?

作業内容3 の行の<#CR> 空白行の<#CR>で <#CR><#CR>です
なのでこうなります

...内容3<#CR>
<#CR>
テスト...

1行にして考えると分かりやすいかもです

...内容3<#CR><#CR>テスト...

--------------------
> EMPTYがこういう形で使えるとは知りませんでした。上記のEMPTYは、作業内容1の一番最初という意味ですよね?。

その認識で大丈夫です
引数を省略、もしくは空文字を指定すると
文字列の最初から 第三引数の文字列前まで の獲得になるので他にも以下の書き方ができます
 BetweenStr(s, , strEmptyRow)
 BetweenStr(s, "", strEmptyRow)
 BetweenStr(s, EMPTY, strEmptyRow)
私は次の理由で EMPTY を使ってます、正直好みだと思います
 省略 :Function, Procedure で定義した関数では同じような省略ができない (書式の統一)
 ""  :"" という文字列を指定した気になるので違和感
 EMPTY:変数の初期値なので何も指定していない気になれる
--------------------

No.149 2019/01/03(Thu) 12:57:14
IEのダウンロード処理について / せりあ
IEでダウンロード処理をしたいのですが、下三角を押して、名前を付けて保存を押して指定ファイル名で保存をしたいです。これをどうコードで書いたらいいのか分かりません。過去の掲示板のダウンロード処理とかも見たのですが、いまいち分かりません。どうかご教授願いませんでしょうか?

下記がスクリーンショットで撮った部分です。
https://gyazo.com/5f38398a861efaee8bc2aca20dc96489

【過去の掲示板で参考にしたコード】

// IEDownLoad(IE,ファイルのURL[,保存先フルパス,保存名,上書き設定])
// ※[]内省略可

//---------------<sample 1>-------------------

URL=""
dl_pas="C:\Documents and Settings\user\My Documents\Dropbox" //保存場所のフルパス
dl_name="item.csv" //保存名
over_w=True //上書きする:True しない:false

IEDownLoad(IE,URL,dl_pas,dl_name,over_w)


//--
Procedure IEDownLoad(IE,URL,dl_pas="",dl_name="",over_w=true)
IE.Navigate2(URL,"&H800")
Repeat //反応が悪いのでダイアログが消えるまで繰返す
dl=getid("ファイルのダウンロード","#32770", -1)
Ctrlwin(dl,ACTIVATE)
sckey(dl,VK_S)
sleep(1)
Until getid("ファイルのダウンロード","#32770")=-1
SaveDialog(dl_pas,dl_name,over_w)
Fend
Procedure SaveDialog(dl_pas="",dl_name="",over_w=true)
dl=getid("名前を付けて保存","#32770", -1)
ifb dl_name=""
dl_name=getstr(dl)
endif
ifb !(dl_pas="")
ifb !(copy(dl_pas,Length(dl_pas))="\")
dl_pas=dl_pas+"\"
endif
endif
dl_pas=dl_pas+dl_name
Sendstr(dl,dl_pas)
Clkitem(dl, "保存(S)")
sleep(2)
sub=getid(GET_ACTIVE_WIN,"#32770", -1)
ifb pos("上書きしますか?",getstr(sub,1,4))>0
ifb over_w
sckey(sub,VK_Y)
else
sckey(sub,VK_N)
Clkitem(dl, "キャンセル")
endif
endif
dl=getid("完了しました","#32770")
ifb !(Chkbtn(dl,"ダウンロードの完了後、このダイアログ ボックスを閉じる"))
sckey(dl,VK_C)
endif
dl=getid("ダウンロードの完了","#32770")
Clkitem(dl, "閉じる")
Fend

No.135 2018/12/29(Sat) 11:10:47

Re: IEのダウンロード処理について / Rayna
>>135 せりあさん

過去ログ検索してみたらスクリプトのソースは
ttp://urx.red/OUoJ
みたいですね(長かったので短縮しました)

// 動作環境 XPsp3,IE8で確認
となっています

IE8のダウンロードの挙動は以下の様な感じなので
ttps://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=2408-1955
最新のIEとは挙動が違うわけです

スクリプトを見たところ
ダウンロードダイアログのウインドウIDを獲得しているので
恐らく現行のIEは対応できないですね

なので名前をつけて保存のところだけ大雑把に書いてみました
何をしているかコメントアウトしているので理解しながら色々試してみてください
//| IE11_NotificationBar_SaveAs.uws |//////////////////////////////////
Option Explicit
Dim objIE, widIE, cidNotifyBar
Dim boolDebug = FALSE

//| IEのCOMオブジェクトを獲得
objIE = GetActiveOleObj("InternetExplorer.Application")
//| IEのウインドウIDを獲得
widIE = HndToId(objIE.HWnd)
//| 通知バーのコントロールIDを獲得
cidNotifyBar = HndToId(GetCtlHnd(widIE, "Frame Notification Bar"))

// テスト用なので動作には不要
IfB boolDebug Then
 //| cidNotifyBar の ボタンオブジェクト名 一覧
 GetItem(cidNotifyBar, ITM_BTN Or ITM_ACCCLK)
 MsgBox(Join(ALL_ITEM_LIST, "<#CR>"))
EndIf

//| 保存の▼をクリックするの難しかったので
//| 右クリックでボタンにフォーカスさせてからキーボードで選択してます
//| 多分もっとうまいことできる人いると思います
IfB ClkItem(cidNotifyBar, "保存", CLK_BTN Or CLK_RIGHTCLK) Then
 //| cidNotifyBar に Kbd を 直接入力
 MouseOrg(cidNotifyBar)
  Kbd(VK_DOWN)
  Kbd(VK_A)
 MouseOrg(0)
EndIf
///////////////////////////////////////////////////////////////////////

あとは前に作ったのですけど
ファイルのURLが獲得できるならIEに頼らなくてもApi使ってこんなのとか
//| Download.uws |/////////////////////////////////////////////////////
Function Download(urlDownloadFile, pathSaveFile)
 Def_Dll URLDownloadToFileA(Long, String, String, Long, Long): Long: urlmon.dll
 Dim pCaller=0, szURL=urlDownloadFile, szFileName=pathSaveFile, dwReserved=0, lpfnCB=0
 RESULT = ! URLDownloadToFileA(pCaller, szURL, szFileName, dwReserved, lpfnCB)
FEnd

Module Download
TextBlock h
概要
 ファイルのダウンロード
構文
 戻値 = Download(urlDownloadFile, pathSaveFile)
引数
 urlDownloadFile
  ダウンロードするURLを指定
 pathSaveFile
  保存先を指定
戻値
 FALSE:エラー有り
 TRUE :成功
EndTextBlock
EndModule
///////////////////////////////////////////////////////////////////////

No.137 2018/12/30(Sun) 13:11:22

Re: IEのダウンロード処理について / せりあ
Rayna様、回答ありがとうございます。回答頂いたコードで△から名前を付けて保存を押せました。
名前を付けて保存のファイル名書込は下記でできました。

id1=GETID("名前を付けて保存","#32770")
ACW(id1,17,50,784,592,0)
ファイル名=input("msg")
sendstr(id1, ファイル名)
sec=0.5
SLEEP(sec)

KBD(VK_RETURN,CLICK,40)

No.143 2019/01/01(Tue) 12:56:24
csvファイルの列を開かずに列削除 / sen
いつもお世話になっております。
csvファイルの列を開かずに列削除したいのです。
実際は30列くらいありますので、下のようにすると手間です。
もっとシンプルなのがありましたら、ご教授ください。
よろしくお願い申し上げます。

fid = fopen("test.csv", F_READ or F_WRITE)
 for i = 1 to FGET(fid,-1)
  x = fget(fid,i,1)+","+fget(fid,i,4)
  fput(fid,x,i)
 next
fclose(fid)

No.92 2018/12/16(Sun) 22:44:12

Re: csvファイルの列を開かずに列削除 / しろまさ
// パッと思いついた置換部だけ。ノーシンプル。だが速い(きっと)

TextBlock tb
11,12,13,14,15,16,17,18,19,20,
21,22,23,24,25,26,27,28,29,30,
31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49,50,
51,52,53,54,55,56,57,58,59,60,
EndTextBlock

MsgBox( regReplace(tb + "<#CR>", "((?:.*?,){1,1})" + "(?:.*?,){1,2}" + "((?:.*?,){1,1})" + ".*(\r\n)", "$1$2$3") )
// 正規表現 置換
Function regReplace(a_text, a_ptn, a_after)
Dim reg = CreateOLEObj("VBScript.Regexp"); reg.Global = TRUE; reg.Multiline = TRUE; reg.pattern = a_ptn; Result = reg.Replace(a_text, a_after)
FEnd

No.93 2018/12/17(Mon) 16:24:15

Re: csvファイルの列を開かずに列削除 / sen
しろまさ様
ありがとうございます。

速い!
短い!
難しい!

説明があると、助かります。(^_^)

No.95 2018/12/18(Tue) 00:19:38

Re: csvファイルの列を開かずに列削除 / satocha
しろまささん、お見事。

複雑な正規表現を考えなくていいように、関数化してみました。

TextBlock tb
11,12,13,14,15,16,17,18,19,20,
21,22,23,24,25,26,27,28,29,30,
31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49,50,
51,52,53,54,55,56,57,58,59,60,
EndTextBlock

//欲しい列には1,不要な列には0となる配列を作って呼び出す。下は2、5、8、9列を選ぶ例。
msgbox(selectColumns( tb, split( "0,1,0,0,1,0,0,1,1,0", "," ) ))

// 正規表現 置換
Function regReplace(a_text, a_ptn, a_after)
  Dim reg = CreateOLEObj("VBScript.Regexp"); reg.Global = TRUE; reg.Multiline = TRUE; reg.pattern = a_ptn; Result = reg.Replace(a_text, a_after)
FEnd

function  selectColumns( CsvString, NeededColumns[] )
  RegPattern=""
  targetPattern=""
  location=0
  for i=0 to length( NeededColumns ) - 1
    flag=val( NeededColumns[ i ] )
    if flag
      RegPattern=RegPattern + "(.*?,{1})"
      location=location + 1
      targetPattern=targetPattern + "$" + location
    else
      RegPattern=RegPattern + "(?:.*?,{1})"
    endif
  next
  
  result=regReplace( CsvString + "<#CR>", RegPattern, targetPattern )
fend

No.96 2018/12/18(Tue) 06:15:18

Re: csvファイルの列を開かずに列削除 / しろまさ
satochaさん、ありがとうございます。そちらのほうがお見事です。

> 説明があると、助かります。(^_^)
正規表現を勉強する。
http://siromasa.html.xdomain.jp/uwsc/u_term/34_SeikiHyougen.html

ってのも不親切なのでメタ文字の解釈の仕方を少々。
 ?:   ()内をノンキャプチャ(置換$に拾わせない)
 .*?,  ,が出現するまでの0以上の文字の連続(? 最短マッチ)
 {1,1}  前()内パターンの繰り返しが1回以上1回まで({1} でも同意)
 外側の() 置換$で拾わせるため

+ は区切を解りやすくするため
"((?:.*?,){1,1})" 拾うためのパターン1
"(?:.*?,){1,2}"  捨てるためのパターン
"((?:.*?,){1,1})" 拾うためのパターン2
".*(\r\n)"    残りを捨て(最長マッチ)、改行を拾うためのパターン3
"$1$2$3"     パターン123を表示

以上。

No.98 2018/12/18(Tue) 09:46:11

Re: csvファイルの列を開かずに列削除 / sen
しろまさ様・satocha様、ありがとうございます。

勉強不足です。
正規表現はこんな事もできるんですね。


もう1点質問しても良いでしょうか?
前半のsplitの部分を修正しやすくする為に作成してみたのですが、
そのままだとうまくいきません。
「,1,」を消すとうまく動きますが、なんか気持ち悪い感じです。



dim 削除部分,ファイル名 = "t.csv"
ID = fopen(ファイル名)
 for i = 1 to 100
  if FGet(ID,1,i) = "" then break
  ifb pos("電話",FGet(ID,1,i)) = 0
   削除部分 = 削除部分 + "1,"
  else
   削除部分 = 削除部分 + "0,"
  endif
 next
fclose(ID)
削除部分 = COPY(削除部分,1,LENGTH(削除部分)-3)

//t.csv
//扱店後TEL,電話,備考
//会社a,111,前半
//会社b,222,後半

No.115 2018/12/23(Sun) 16:32:48

Re: csvファイルの列を開かずに列削除 / sen
色々とありがとうございました。
私には難しい部分もありますが、見事に動いています。
これがあれば、自由自在に必要な項目を抽出できます。
できれば、どこかのサイトに保存して欲しい気持ちでいっぱいです。
本当はuwscでもcsvの処理はできるんだろうけど、でも「時間が掛かるからやっぱりエクセルしかないな!」というレベルの方はたくさんいます。

みなさんの実力はすごいです。
ありがとうございました。

No.132 2018/12/27(Thu) 22:54:34

Re: csvファイルの列を開かずに列削除 / しろまさ
> 私には難しい部分もありますが、
難しそうという先入観を捨てれば、なんでも素直に受け入れられると思いますよ。
覚えることは少ないです。後は何回も試行錯誤すればすぐに使いこなせます。
私も正規表現は師匠にあれこれ質問して理解しました(ありがとうございました)

利用できるツールを集めるのではなく、常に基本(根本)を理解するようにすれば
いくらでも応用が利かせられるようになると思いますよ。

私も常に学ぶ側の姿勢でこの掲示板を見ています。
この掲示板はuwscに限らず、とても多くのことのきっかけを学べますので。

No.133 2018/12/28(Fri) 08:59:32

Re: csvファイルの列を開かずに列削除 / sen
恥ずかしいかぎりです。
お正月、正規表現に格闘してみます。
ありがとうございました。

No.134 2018/12/28(Fri) 22:18:26
タスクマネージャーからexeを消したい。 / みあどん
お世話になります。
exeファイルを起動させるのですが、何故か完全に停止できません。
最後に必ず、exitexitしているので、動作は、正常に動いています。
毎回、手動で消しているのですが、タスクマネージャーから起動中のexeをUWSCで自動で消す方法がございましたら、ご教授いただけませんでしょうか。

No.128 2018/12/27(Thu) 07:45:01

Re: タスクマネージャーからexeを消したい。 / しろまさ
DosCmd("TASKKILL /F /IM UWSC.exe")
など。

No.129 2018/12/27(Thu) 09:24:15

Re: タスクマネージャーからexeを消したい。 / Rayna
しろまささんので解決されたかと思いますが
原因の解決になれば。

@ CtrlWin(WindowID, CLOSE)で終了できていない場合
 CtrlWin(WindowID, CLOSE) で終了している場合
 ウインドウの状態によっては終了できない場合があります
 その場合 CtrlWin(WindowID, CLOSE2) を使用すると終了できます

 例えば以下の場合
 //| Sample1.uws |////////////////////////
  Dim WId = Exec("notepad.exe")
  ScKey(WId, VK_ALT, VK_F, VK_A)
  GetId("名前を付けて保存", "#32770", -1)
  
  // この状態の WId は CLOSE では終了できない
  CtrlWin(WId, CLOSE); Sleep(1)
  IfB Status(WId, ST_ISID) Then
   MsgBox("終了できていない")
  Else
   MsgBox("終了できた")
  EndIf

  // この状態の WId は CLOSE2 で終了できる
  CtrlWin(WId, CLOSE2); Sleep(1)
  IfB Status(WId, ST_ISID) Then
   MsgBox("終了できていない")
  Else
   MsgBox("終了できた")
  EndIf
 /////////////////////////////////////////

A 途中で終了されて終了処理が実行されていない場合
 Try-Finally-EndTry, Option OptFinally を使用するとうまくいくかもです
 Option OptFinally は Try 実行中に ExitExit された場合に Finally を実行したあとに終了するオプションです
 詳しくはヘルプ参照してください
 //| Sample2.uws |////////////////////////
  Option OptFinally
  Dim WId = Exec("notepad.exe")
  Try
   // 処理
   ExitExit
  Finally
   CtrlWin(WId, CLOSE2)
  EndTry
 /////////////////////////////////////////

No.130 2018/12/27(Thu) 12:43:53
水無さんのブログで公開しているスクリプトIFB GET_UWSC_NAME = "Ini.uws"の意味 / せりあ
>>メイン実行時にGET_UWSC_NAMEでスクリプト名を判定するようにすると、CALLしやすくなります。

>>単体で実行できた上、CALLして利用するのも容易

とブログでは書かれています。

水無さんのブログで公開しているスクリプトが下記。
下記のIFB GET_UWSC_NAME = "Ini.uws" THENをどういう意図で利用しているのかがいまいちわかりません。CALLしやすくするというのも意味がわかりません。
Ini.uwsというファイル名であればTHEN以下の処理をすると意味だとは思うのですが

最近、CALLの使い方を研究していて一つの部品のような形で利用するのがベストかなと思っています。UWSCの使い方がまだまだ若輩者のわたし、ご教授願いませんでしょうか?



OPTION EXPLICIT

IFB GET_UWSC_NAME = "Ini.uws" THEN
DIM ss = Ini.Read()
DIM i, j, ks
//Ini.Write("sec1", "c", "C")
FOR i = 0 TO LENGTH(ss) - 1
PRINT "[" + ss[i] + "]"
ks = Ini.Read(ss[i])
FOR j = 0 TO LENGTH(ks) - 1
PRINT " " + ks[j] + " = " + Ini.Read(ss[i], ks[j])
NEXT
NEXT
//Ini.Write("sec1", "c", " b")
ENDIF

No.94 2018/12/17(Mon) 19:47:22

Re: 水無さんのブログで公開しているスクリプトIFB GET_UWSC_NAME = "Ini.uws"の意味 / トシ
Ini.uws単体で動作させた時と、他所からCALL Ini.uwsされた時に、
そのIF判定が無かったらどうなるか調べれば理解出来るかと。

ただブログにも書かれてますが、

>そもそも、CALL前提のスクリプトなら、FUNCTIONやPROCEDURE/MODULEしか書かないのも手です。

って話で、CALLを部品のように使用されるのであれば
あまり気にしなくていい話かもしれません

No.97 2018/12/18(Tue) 09:00:07

Re: 水無さんのブログで公開しているスクリプトIFB GET_UWSC_NAME = "Ini.uws"の意味 / せりあ
トシ様、返信ありがとうございます。
下記のように試してみました。IFB GET_UWSC_NAME = "Ini.uws" THENを使うメリットがいまいち分かりません。

【呼び出される側】にIFB GET_UWSC_NAME = "Ini.uws" THENがあると、【呼び出す側】でcallしても呼び出されない。
【呼び出される側】単体では、msgboxで1が表示となります。


【呼び出される側】(Ini.uws)
IFB GET_UWSC_NAME = "Ini.uws" THEN

msg=1
msgbox(msg)

ENDIF

【呼び出す側】
call GET_CUR_DIR+"\ini.uws"

No.99 2018/12/18(Tue) 10:45:48

Re: 水無さんのブログで公開しているスクリプトIFB GET_UWSC_NAME = "Ini.uws"の意味 / トシ
試しに書かれた小さなコードではメリットは無いです
それが例えば便利な関数をいくつか含むuwsファイルだったら?
便利な関数だけ使いたいけど、メインの処理は動作させたくない場合だったら?

CALL前提で一つの部品のように考えて実装している場合、
動作しては困るメイン処理が無い場合が多いと思いますので、
あまり気にしなくてもいい話かな、という意味で書きました

No.100 2018/12/18(Tue) 10:59:54

Re: 水無さんのブログで公開しているスクリプトIFB GET_UWSC_NAME = "Ini.uws"の意味 / しゅん
個人的なコードを書く時のルールです。
・汎用的な機能(INIの読み書き等)は、MODULEにまとめる
・特定のスクリプトを書く際に、必要な機能があったら、「CALL Ini.uws」等して取り込み使う
・汎用的なスクリプトの先頭には、テストスクリプトを書く

Ini.uwsについて言うと、
・Ini.uwsを単体で実行した場合は、動作確認用のテストスクリプトを実行する
・INIの読み書きを使いたい側は、CALLする。その時、テストスクリプトは実行しない

という欲求があるわけです。
これをクリアするために、IF文でテストスクリプトを閉じ込めています。

No.101 2018/12/18(Tue) 12:53:28

Re: 水無さんのブログで公開しているスクリプトIFB GET_UWSC_NAME = "Ini.uws"の意味 / しろまさ
Moduleの前提として次の考えを持っています(C言語のInclude的な考え)

@ Call時に実行されたくない(後で関数として呼ぶため)
A Callはスクリプト先頭で1回しか呼ばない(繰り返して使用しないため)
B 関数や変数をModule内に閉じ込める(複数のModuleをCallした際に名前競合を防ぐため)

複ModuleをCallして使ってると単Moduleの動作確認の必要もありますし、
他者から頂いたModuleをテスト使用する際にも以下の記述は便利です。
> IFB GET_UWSC_NAME = "Ini.uws"

簡単に言えば、「テスト実行枠」ということです。

No.102 2018/12/18(Tue) 13:49:38

Re: 水無さんのブログで公開しているスクリプトIFB GET_UWSC_NAME = "Ini.uws"の意味 / せりあ
しゅんさま、返信ありがとうございます。
>>・INIの読み書きを使いたい側は、CALLする。その時、テストスクリプトは実行しない
【呼び出される側】(Ini.uws)のmsg=1 msgbox(msg)がテストスクリプトとして、callしたい場合、
IFB GET_UWSC_NAME = "Ini.uws" THEN ENDIFで囲まれているので呼び出せないのでは。
わたしの理解力が乏しいのかと思いますが、いまいちわかりません。

【呼び出される側】(Ini.uws)
IFB GET_UWSC_NAME = "Ini.uws" THEN

msg=1
msgbox(msg)

ENDIF

【呼び出す側】
call GET_CUR_DIR+"\ini.uws"

No.106 2018/12/21(Fri) 17:53:45

Re: 水無さんのブログで公開しているスクリプトIFB GET_UWSC_NAME = "Ini.uws"の意味 / せりあ
しろまさ様、返信ありがとうございます。

私は下記のような感じでCLASS内の関数を呼び出して使っています。
IFB GET_UWSC_NAME = "共通化.uws" 、これをどう使っていくのかがいまいちわかりません。



[呼び出す側]

call C:\Users\user\Desktop\共通化.uws
url="http://www3.rocketbbs.com/601/siromasa.html"
COMMON.cre1(url)
---------------------
[呼び出される側]

call C:\Users\user\Desktop\共通化.uws //下記の関数が記載されているフルパス

CLASS COMMON
function cre1(url) //スクレイピング用1_最速
TRY
   IE = CREATEOLEOBJ("InternetExplorer.Application")
  EXCEPT
   EXEC("C:\Program Files\Internet Explorer\iexplore.exe")
   IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
  ENDTRY
IE.visible = true
IE.navigate(url)
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
result = IE
fend

//他にも関数色々

endclass

No.107 2018/12/21(Fri) 18:02:56

Re: 水無さんのブログで公開しているスクリプトIFB GET_UWSC_NAME = "Ini.uws"の意味 / しろまさ
私の使い方と概ね同じですね。
call C:\Users\user\Desktop\共通化.uws 
は冒頭呼出用で他のファイルから呼び出せば
当然 IFB GET_UWSC_NAME = "共通化.uws" は実行されません。

では、共通化.uws をダブルクリックで実行した場合はどうですか?
IFB GET_UWSC_NAME = "共通化.uws" が実行されると思います。
だからここにテストコード等を書くのです。
このClassはこんな感じで使うんですよ〜みたいな。

私の場合は 共通化.uws を目的に合わせて複数呼んで使ってるようなイメージです。
 Call ..\Lib\Module_XL2.UWS
 Call ..\Lib\Module_ADO.UWS
 Call ..\Lib\Module_IEForm.UWS
 Call ..\Lib\Module_DateTime.UWS
 Call ..\Lib\Module_Winsock.UWS
等々..

No.108 2018/12/21(Fri) 18:50:20

Re: 水無さんのブログで公開しているスクリプトIFB GET_UWSC_NAME = "Ini.uws"の意味 / せりあ
しろまささん、ありがとうございます。
なるほど、そういう使い方ができたんですね。これは、全然気づかなかったです。
こういう発想を思いつく先輩方すごいです。
下記のような使い方ということですね。

>>私の場合は 共通化.uws を目的に合わせて複数呼んで使ってるようなイメージです。

Call ..\Lib\Module_XL2.UWSにすべての関数をまとめるのではなく、
Call ..\Lib\Module_ADO.UWSとかに分けているのは、管理面のわかりやすさという点でやっておられるのでしょうか?


IF GET_UWSC_NAME = "00_共通化.uws" then

url="http://www3.rocketbbs.com/601/siromasa.html"
COMMON.cre1(url)
endif

CLASS COMMON

function cre1(url)
TRY
   IE = CREATEOLEOBJ("InternetExplorer.Application")
  EXCEPT
   EXEC("C:\Program Files\Internet Explorer\iexplore.exe")
   IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
  ENDTRY
IE.visible = true
IE.navigate(url)
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
result = IE
fend
endclass

endif

No.109 2018/12/21(Fri) 22:16:32

Re: 水無さんのブログで公開しているスクリプトIFB GET_UWSC_NAME = "Ini.uws"の意味 / しろまさ
管理面のわかり易さもありますが、
機能と表示や操作を分ける為でもあります。

1つのModuleが膨大な機能を有しますので、
なんでもかんでもくっつけると起動が遅くなったりしますし。

No.110 2018/12/22(Sat) 10:32:58

Re: 水無さんのブログで公開しているスクリプトIFB GET_UWSC_NAME = "Ini.uws"の意味 / せりあ
しろまさ様、返信ありがとうございます。

>>機能と表示や操作を分ける為でもあります。
なるほど、Module内の関数の種類、msgboxやfukidasi等の表示に関する関数、com操作に関数操作等で分けるということですね。

>>1つのModuleが膨大な機能を有します
>>なんでもかんでもくっつけると起動が遅くなったりしますし。


たしかにModule内関数は、私の場合2千行超えてるんで遅くなってるかもです。

色々勉強になります。ありがとうございます。

No.111 2018/12/22(Sat) 10:52:29
以下のフォームに記事No.と投稿時のパスワードを入力すれば
投稿後に記事の編集や削除が行えます。
43/200件 [ ページ : << 1 2 3 4 5 >> ]

- HOME - お知らせ(3/8) - 記事検索 - 携帯用URL - フィード - ヘルプ - 環境設定 -

- Skin: Modern v2.0 - Author: ロケットBBS -

Rocket Board Type-X (Free) Rocket BBS