108668
UWSC 仮 掲示板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオン
動作不具合での質問の場合には環境を表記(OS,バージョン等)
タイトルは内容を表し、内容はネットゲーム関係禁止
自身でコードを書く気の無いナマケモノは特に質問禁止
失敗作でもコードを投稿すること(具体性の無い質問は無視される可能性大)

UWSC掲示板 が復活することを祈り、それまでの繋ぎとして。
環境設定[s7777777]

数値の桁数をそろえたい / かーくん
1〜9は0001〜0009の文字列
10〜99は0010〜0099
100〜999は0100〜0999
1000〜9999はそのまま
を一行でする方法はありますか?

桁数を調べてif文を使うと何行にもなってしまうし
format関数でやろうとしましたが、上手く行きませんでした。
format("000" + x ,3)

No.1182 2021/02/14(Sun) 03:28:36

Re: 数値の桁数をそろえたい / satocha
確かにformat関数の動きがおかしいですね。
仕方ないので
replace(format(x,4)," ","0")
でどうでしょうか。

No.1183 2021/02/14(Sun) 04:10:31

Re: 数値の桁数をそろえたい / かーくん
satocha さん、有難うございます。
Formatで左にできたスペースを「0」に変える方法、思いつきませんでした。
これだと他の事にも応用できそうです。
 

No.1184 2021/02/14(Sun) 04:53:32

Re: 数値の桁数をそろえたい / Rayna
>>1182 かーくん さん

Dim i, x
// "000"+x で文字列型になるので
// 文字列型の前方繰り返し処理になってますね
For x In Split("1 11 111 1111", " ", FALSE, TRUE)
 Print VarType(x)=VAR_DOUBLE // True // この時点では数値型(Double型)
 Print VarType("000"+x)=VAR_USTR // True // この時点で文字列型(UStr型)にキャストされる
 Print Format("000"+x, 3)
Next

// つまり以下と同じ動作です
For i = 0 To 9
 Print "i="+i+":"+Format("string", i)
Next

// 正しくは以下の2パターン、場合によって使い分けると便利です
For x In Split("1 11 111 1111", " ", FALSE, TRUE)
 // 数値型として半角スペースで埋めて置き換え // >>1183 satocha さんの方法
 Print Replace(Format(x, 4), " ", "0")
 // 必要文字数からx文字数を引いて文字列"0"を繰り返し + x
 Print Format("0", 4-Length(x)) + x
Next

// 前者は16進数で処理するときにも対応 // デメリット:数値以外繰り返し処理, 左詰めができない
 Print Replace(Format($FF, 4, -1), " ", "0") // "00FF"
 Print Replace(Format("abc", 4, -1), " ", "0") // "abca"

// 後者は数値に限らず半角文字列に対応 // デメリット:変数を用意しないと冗長, 16進数が面倒
 x = $FF // 255
 Print Format("0", 4-Length(x)) + x // "0255"
 x = Format($FF, 0, -1) // こうすれば16進数も対応
 Print Format("0", 4-Length(x)) + x // "00FF"
 x = "abc" // 文字列
 Print Format(".", 4-Length(x)) + x // ".abc"
 x = "あ" // 全角文字列が入ってる場合はLengthBを使う(埋め文字が半角の場合のみ有効)
 Print Format(".", 4-LengthB(x)) + x // "..あ" // 右詰め
 Print x + Format(".", 4-LengthB(x)) // "あ.." // 左詰め

No.1185 2021/02/14(Sun) 10:51:06

Re: 数値の桁数をそろえたい / かーくん
Raynaさん有難うございます。
加える「0」の文字列を作って、xの左に加える方法なるほどです。
また、文字列だった場合の方法も教えて頂きありがとうございました。

No.1186 2021/02/14(Sun) 13:24:07

Re: 数値の桁数をそろえたい / しろまさ
// シンプルにこんな方法もあります。
Dim n = 99
MsgBox( Copy("000"+n, Length(n)) )

No.1189 2021/02/15(Mon) 13:11:40
多次元の連想配列の値を更新したい / cho
内容がタイトルと相違してきたので、別スレッドにしました。
No.1177 2021/02/13(Sat) 16:42:51 からの続きです。

通常の多次元と同じ書き方でSyntaxErrorが出ます。
たぶん、とても簡単なことだと思うのですが・・・


DIM v[1][1]

v[0][0] = "value" // 通常の2次元はこの書き方で代入できる
PRINT v[0][0]

hashtbl h
h["hoge"] = split("foo bar baz") // splitでSafeArrayにする
print h["hoge"][0] // foo

h["hoge"][0] = "f002" // 同じ書き方でもSyntaxErrorがでる
print h["hoge"][0]

// やってみた書き方(他言語の書き方も参考してみましたが全滅でした)
 // h["hoge"] = 0."f002"
 // h["hoge",0] = "f002"
 // h = ["hoge",[0] = "f002"]
 // h = ["hoge","f002"]
 // h = ["hoge"]["f002"]
 // h["hoge"] = 0."f002"
 // h["hoge"] = 0:"f002"
 // h["hoge"] = [0]:"f002"
 // $h["hoge"][0] = "f002"
 // h["hoge"]["0"] = "f002"
 // h["hoge"][0] = $"f002"
 // h["hoge"] = [0,"f002"]
 // h["hoge"] = [0]"f002"
 // h["hoge"[0]] = "f002"
 // h["hoge",0] = "f002"
 // h["hoge"][0] = h["hoge"]["f002"]
 // h["hoge"][0] = {"f002",,}

// あれから粘ってやってみましたが、自己解決に至りませんでした。
// 値の更新はとりあえず、置換などの後ろ向きな解決法が使えたので困ることはないと思います。
// それでも、連想の多次元を使えることを知れたのは幸運でした。ありがとうございます。
// 時間に余裕が出たら再チャレンジしてみます。

//苦肉の策。置換してSafeArrayで丸ごと更新
value = h["hoge"][0]
str = JOIN(h["hoge"])
h["hoge"] = SPLIT(REPLACE(str,value,"f003")) //値が重複する場合もあるので、カウントもする処理も追加する

print h["hoge"][0]

No.1180 2021/02/13(Sat) 19:13:41

Re: 多次元の連想配列の値を更新したい / cho
時間的にすれ違ったので、転載します。

>>  ☆ Re: EVALで値の代入したい NEW / stuncloud 引用
>> > h["hoge"][0] = "f002" // 同じ書き方でもSyntaxErrorがでる
>> うわあ、確認不足でしたごめんなさい
>> これはおそらく連想配列の要素にインデックス指定して代入、をUWSCが許容していないということだと思います
>> 値を読むだけならOKだけど代入は無理ということになりますね
>> つまりこの方法は使えない…ので忘れてください…ほんとすいません…
>> 
>> > COMオブジェを経由して使える連想配列という認識
>> そんな感じでOKです
>> 例えば連想配列を関数の戻り値にしたいけど、仕様上できないので代わりにScripting.Dictionaryを使う
>> みたいな感じで使うことがあったりなかったりします



stuncloudさんレスありがとうございます。

なるほど、仕様上できないのですね。
SyntaxError = 構文エラーなので、書き方があるのかと思いました。
わかってスッキリしました。

実は、先日の質問内容(moduleと2次元で解決できると考えた)ですが、
「適当な数字」の桁数が多かった(JANコードみたいなものです)ため、2次元配列に入れることが出来なく、解決策を考えていました。
適当な数字をなぜキーにしていたのか、うっかり忘れていました。
そこに、Scripting.Dictionaryのお話をいただけて、
もしかしたら出来るかも。という気持ちになっています。

話に出たのは偶然だったかもですが、新しいヒントをありがとうございます。
頑張ってみます。

No.1181 2021/02/13(Sat) 19:47:29

Re: 多次元の連想配列の値を更新したい / しゅん
// こんな感じ?

hashtbl h
h["hoge"] = split("foo bar baz") // splitでSafeArrayにする
print h["hoge"][0] // foo

SetHash(h, "hoge", 0, "f002")
print h["hoge"][0]


PROCEDURE SetHash(var h[], key, index, value)
  DIM sa = h[key]
  sa[index] = value
  h[key] = sa
FEND

No.1187 2021/02/15(Mon) 07:54:57

Re: 多次元の連想配列の値を更新したい / cho
しゅんさんありがとうございます。

まさしくやりたいことが実現できます。
値の重複を気にすることなく、ダイレクトに更新できる点がとてもスマートだと思いました。
その自作関数丸ごと使わせていただきます。感謝。

このスレを参考にされる方が他にもいるかもしれないので、
私が確認用に使ったコードを載せておきます。
連想配列を多次元・可変長で使う方の参考になれば幸いです。

hashtbl h
h["hoge"] = split("foo bar baz") // splitでSafeArrayにする
h["fuga"] = SPLIT("apple orange melon mango banana kiwi")
// print h["hoge"][0] // foo

SetHash(h, "hoge", 0, "f002")
// print h["hoge"][0]
SetHash(h, "fuga", 4, "GoBananas")

// 確認用
FOR i = 0 TO LENGTH(h)-1
 key = h[i,HASH_KEY]
 FOR j = 0 TO LENGTH(h[key])-1
   PRINT key+"["+j+"] = "+h[key][j]
 NEXT
NEXT

PROCEDURE SetHash(var h[], key, index, value)
  DIM sa = h[key]
  sa[index] = value
  h[key] = sa
FEND

// bananaをGoBananasに変えて洒落を利かせてみました(笑)

No.1188 2021/02/15(Mon) 11:31:07
EVALで値の代入したい / cho
お世話になります。
表題の件ですが、行き詰っているので解決できるヒントがあればお願いします。

HASHTBL Apple
HASHTBL Orange
HASHTBL Melon

TEXTBLOCK list_fruit
Apple
Orange
Melon
ENDTEXTBLOCK

DIM fruit_list[3]
Array = SPLIT(list_fruit,"<#CR>")
FOR i=0 TO LENGTH(Array)-1
  fruit_list[i] = Array[i]
  PRINT "fruit_list["+i+"] = "+fruit_list[i] // 確認用
NEXT

fruit_Number = "100" //適当な数字
Apple[fruit_Number] = "ふじ"
PRINT Apple[fruit_Number] // = ふじ と表示される
PRINT EVAL(fruit_list[0]+"[fruit_Number]") // = ふじ と表示される

// やりたいこと
  // EVAL(fruit_list[0]+"[fruit_Number]") = "紅玉" //代入して値を更新したい。ここでエラーが出る
  // PRINT EVAL(fruit_list[0]+"[fruit_Number]") // 紅玉 と表示させたい
// 試したこと(EVALは代入に:=を使うらしい)
  // ()の位置や""で囲む位置などを工夫したがエラーになる
  // EVALの重ね掛けを試してみるなど迷走中・・・
  // EVAL(EVAL(fruit_list[0]+"[fruit_Number]"):="紅玉")
  // EVAL(EVAL(fruit_list[0]+"[fruit_Number]")+":=<#DBL>紅玉<#DBL>") //エラーはでないが代入されない
// 希望の条件
  // 自作関数の引数にfruit_list[]を使ってFORで回したい
  // PUBLICは使いたくない

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

No.1162 2021/02/11(Thu) 01:32:40

Re: EVALで値の代入したい / しゅん
// おしいですね!
EVAL(fruit_list[0]+"[fruit_Number] := <#DBL>紅玉<#DBL>") //代入して値を更新できます!
PRINT EVAL(fruit_list[0]+"[fruit_Number]") // 紅玉 と表示されます!

No.1163 2021/02/11(Thu) 09:04:21

Re: EVALで値の代入したい / Rayna
>>1162 cho さん

代入できてない場合は以下に気をつけてみてください
 代入しようとした変数が間違っている
  Eval した関数のローカル変数として作成しようとするので
  代入先ではなく新変数に入ってる可能性があります
 Evalを使用した, モジュール、関数内、関数外に同名の変数がある
  Eval は変数を外向きに探索するので 場合によっては Global. This. 等を明示しないと駄目な場合があります

これを意識しながら書くと失敗しにくいと思います
分かりづらいなら Eval しようとしてる文字列を一度 Print してみてください

以下を例にあげると
>>  // EVAL(EVAL(fruit_list[0]+"[fruit_Number]")+":=<#DBL>紅玉<#DBL>") //エラーはでないが代入されない
 Print EVAL(fruit_list[0]+"[fruit_Number]")+":=<#DBL>紅玉<#DBL>" // "ふじ:=<#DBL>紅玉<#DBL>"
 EVAL(EVAL(fruit_list[0]+"[fruit_Number]")+":=<#DBL>紅玉<#DBL>")
 Print Eval(fruit_list[0]+"[fruit_Number]") // ふじ と表示される
 Print Eval("ふじ") // 紅玉 と表示される
新規変数 ふじ に代入してますね

>>  // 自作関数の引数にfruit_list[]を使ってFORで回したい
Function f(fruit_list[])
 [] をつけると 変数, 配列, 連想配列 を引数として受けることが出来ます

No.1164 2021/02/11(Thu) 09:45:56

Re: EVALで値の代入したい / しゅん
// Raynaさん、丁寧なフォロー、ありがとうございます。
// よくよく考えると、EVAL使うのが間違いな気がしてきました。


HASHTBL Fruits

TEXTBLOCK list_fruit
Apple
Orange
Melon
ENDTEXTBLOCK

DIM fruit_list[3]
Array = SPLIT(list_fruit,"<#CR>")
FOR i=0 TO LENGTH(Array)-1
  fruit_list[i] = Array[i]
  PRINT "fruit_list["+i+"] = "+fruit_list[i] // 確認用
NEXT

fruit_Number = "100" //適当な数字
Fruits[GetIdx("Apple", fruit_Number)] = "ふじ"
PRINT Fruits[GetIdx(fruit_list[0], fruit_Number)] // ふじ と表示される
Fruits[GetIdx(fruit_list[0], fruit_Number)] = "紅玉"
PRINT Fruits[GetIdx(fruit_list[0], fruit_Number)] // 紅玉 と表示される



FUNCTION GetIdx(kind, index)
  RESULT = kind + CHR(0) + index // 絶対に使わない文字を区切り文字にする
FEND

No.1165 2021/02/11(Thu) 10:50:48

Re: EVALで値の代入したい / cho
しゅんさんありがとうございます。

EVAL(fruit_list[0]+"[fruit_Number] := <#DBL>紅玉<#DBL>")
この囲み方、覚えておきます。ホント惜しかった。でも重ね掛けに視点が移っていたので、気が付くのに時間がかかったか、あきらめていたかもです。助かりました。

Raynaさんありがとうございます。

いただいたコードを実行してみました。
ふじ という変数に紅玉が入っているのを確認しました。
外向きに探索という表現は初耳でわかりませんでしたが、調べてみます。
盲点になりそうな点を教えていただきありがとうございます。

EVALで代入できることがわかったので、幅が広がりそうです。
本当にやりたいことは、20個程度ある連想を、PUBLICを使わずに自作関数を通して更新していくことです。

と、返信を書いている間に、しゅんさんからそれらしい追加アイデアが!
さっそく試してみます。
取り急ぎ、お礼まで。

No.1166 2021/02/11(Thu) 11:21:21

Re: EVALで値の代入したい / Rayna
>>1166 cho さん

>> 外向きに探索という表現は初耳でわかりませんでしたが、調べてみます。

分かりづらかったかもしれないので補足
Eval に限った話ではないですが
UWSC では スクリプト、モジュール、関数に参照できる範囲があり 同名の 関数名, 変数名 をつけることが出来ます

Const, TextBlock, Public, Public HashTbl, Def_Dll, Procedure, Function がグローバル参照で
Dim, HashTbl はローカル参照です

Module m の Procedure p 内で 変数 m.v を呼ぼうとして Eval("v") とかすると
m.p() 内に 変数 v がなければ成功しますが あった場合 m.p() 内の v が優先されます
それを回避する為に明示しないと駄目な場合があるよって話でした

詳しくはプログラミングにおけるスコープという概念を調べてください
どこからならどの変数を参照できるか等確かめてみてもいいかもしれません

//| サンプル |//////////

Public vp = "スクリプトのグローバル変数"
Dim v = "スクリプトのローカル変数"

m.p()

Procedure p()
 Dim v = "モジュール外関数のローカル変数"
FEnd

Module m
 Public vp = "モジュールのグローバル変数"
 Dim v = "モジュールのローカル変数"
 Procedure p()
  // 変数は Global が使えない
  Dim v = "モジュール内関数のローカル変数"
  Print v // Eval("v")
  Print This.v // Eval("This.v")
 FEnd

 Procedure p2()
  p() // m.p()
  m.p() // m.p()
  This.p() // m.p()
  Global.p() // p()
 FEnd
EndModule

No.1167 2021/02/11(Thu) 13:00:39

Re: EVALで値の代入したい / cho
しゅんさんありがとうございます。
残念ながら、私の力量では希望の処理をさせることができませんでした。
Fruits[GetIdx(fruit_list[0], fruit_Number)] = "紅玉"
しかし、このような形で、配列に関数を書くことができることを学びました。
アドバイスありがとうございます。

今一度、やりたいことを整理したので、何か良いヒントがあればお願いします。
EVALは使ったことがなく、苦肉の策でしたのでこだわりはありません。
やりたいことは、たぶん仕様的に無理かもしれないと考えていますが、
最悪、連想を宣言した関数内でFORをさせることは出来そうです。
同じ処理が何度か出てくるのでそのたびに書くと無駄にコードが長くなるので
少しでも見やすくできればと考えています。


HASHTBL Apple // 連想配列が20個程度ある
HASHTBL Orange
HASHTBL Melon

TEXTBLOCK list_fruit
Apple
Orange
Melon
ENDTEXTBLOCK

DIM fruit_list[3]
Array = SPLIT(list_fruit,"<#CR>")
FOR i=0 TO LENGTH(Array)-1
  fruit_list[i] = Array[i]
  PRINT "fruit_list["+i+"] = "+fruit_list[i] // 確認用
NEXT

fruit_Number = "100" //適当な数字
Apple[fruit_Number] = "ふじ"
Orange[fruit_Number] = "甘夏"
PRINT Apple[fruit_Number] // = ふじ と表示される
PRINT Orange[fruit_Number] // = 甘夏 と表示される

// この部分を別関数にしてFORで回したい(fruit_Numberは固定です) ////////
  EVAL(fruit_list[0]+"[fruit_Number] := <#DBL>つがる<#DBL>")
  EVAL(fruit_list[1]+"[fruit_Number] := <#DBL>清見<#DBL>")
///////////////////////////////////

PRINT Apple[fruit_Number] // = つがる と表示される
PRINT Orange[fruit_Number] // = 清見 と表示される

//処理ここまで

  //自作関数の処理 ※イメージなので動作しません
   // 連想を引数にすると解決できますが、20個ぐらい書くので、リスト化したものでシンプルにしたい
   // 連想をPUBLICするとこの問題は解決できますが、PUBLICしたくない
  PROCEDURE value_Update(Var fruit_list[],fruit_Number)
   // New_valueは外部データから取得するため、この関数内のコードは少し長くなります。
   FOR i=0 TO LENGTH(fruit_list)-1
    EVAL(fruit_list[i]+"[fruit_Number] := New_value")
   NEXT
  FEND

// 何かアイデアやヒントがあればぜひお願いします。

No.1168 2021/02/11(Thu) 13:28:08

Re: EVALで値の代入したい / cho
Raynaさんありがとうございます。

サンプルを動かして、コードの流れと結果を見比べてみました。
まだ、Evalの振る舞い(?)を理解できていませんが、

MODULEを使った場合のスコープについては理解が進んだような気がします。
特に、今回のヒントで、
「連想をPUBLICしたくないけど、別関数の処理結果で値を変えたい」というわがままは、
連想を宣言した処理をまるごとMODULEで括ってしまえば、
MODULE内で、PUBLICを宣言することで解決できそうな気がしています。

今から、仕事で少し外出してきますが、帰宅後色々試してみます。
スコープという視点、貴重なヒントになりました。ありがとうございます。

No.1169 2021/02/11(Thu) 13:55:13

Re: EVALで値の代入したい / stuncloud
連想配列ではなく二次元配列を使うという案

const lists = 3 // リストの数 (20個あるなら20)
const items = 200 // 最大アイテム数

// リスト一覧 ※ 必ず連番にしていく
const Apple = 0
const Orange = 1
const Melon = 2

dim fruit_list[lists - 1][items - 1]


fruit_Number = 100

fruit_list[Apple][fruit_Number] = "ふじ"
fruit_list[Orange][fruit_Number] = "甘夏"

print fruit_list[Apple][fruit_Number]
print fruit_list[Orange][fruit_Number]

procedure value_Update(var fruit_list[], fruit_Number)
 for i = 0 to length(fruit_list) - 1
  New_value = New_value取得処理()
  fruit_list[i][fruit_Number] = New_value
 next
fend


fruit_list[Apple][0] みたいな書き方ができるので区別はしやすいかな?という感じでやっています
evalも使いませんし
ただ、そのためのcosnt定義でうっかりするとバグになっちゃうしあまり良い解決案ではないですね

# enum欲しくなりますね

No.1170 2021/02/11(Thu) 14:07:43

Re: EVALで値の代入したい / cho
stuncloudさんありがとうございます。

希望通りの処理ができました。
2次元配列が呼出時に連想配列と同じ書き方ができるというのも、私にはとても新鮮な使いかたで感動しました。
cosntを超えるとバグるかもしれないという点も考慮してitemsを調整してみます。

全体処理に組み込んだ時に希望通りの動作をしてくれるように頑張ります。

しゅんさん、 Raynaさん、stuncloudさん改めてありがとうございます。
いただいたアイデアやヒントはどれも、今後に役立たせていけそうです。

なるべく自分で解決する努力をしますが、行き詰った時にアドバイスを求めるかもしれません。
また見かけた時は何卒よろしくお願いします。

No.1171 2021/02/12(Fri) 07:40:04

Re: EVALで値の代入したい / しゅん
// もう不要かもしれませんが、こんな感じ?


HASHTBL Fruits // 連想配列はこれ一つでOKです。CONST/fruit_listを20個作ってください

// Const良いですね。この方式の場合、ユニークなら連番でなくても良いです。
Const Apple = 100
Const Orange = 200
Const Melon = 300
DIM fruit_list[] = Apple, Orange, Melon

fruit_Number = "100" //適当な数字
Fruits[_I(Apple, fruit_Number)] = "ふじ" // Apple[fruit_Number]をこう書き換えます。以下同じ
Fruits[_I(Orange, fruit_Number)] = "甘夏"
PRINT Fruits[_I(Apple, fruit_Number)] // = ふじ と表示される
PRINT Fruits[_I(Orange, fruit_Number)] // = 甘夏 と表示される

value_Update(Fruits, fruit_list, fruit_Number)

PRINT Fruits[_I(Apple, fruit_Number)] // = つがる と表示される
PRINT Fruits[_I(Orange, fruit_Number)] // = 清見 と表示される



FUNCTION _I(kind, index) // GetIdxは入力が面倒なので変えました
  RESULT = kind + CHR(0) + index // 絶対に使わない文字を区切り文字にする
FEND


TEXTBLOCK list_data
紅玉
清見
マスクメロン
つがる
ENDTEXTBLOCK

PROCEDURE value_Update(var fruits[], fruit_list[], fruit_Number) // fuit_listは参照のみなのでvar不要
 DIM datas = SPLIT(list_data, "<#CR>")
 FOR i=0 TO LENGTH(datas)-1
  fruits[_I(fruit_list[i Mod 3], fruit_Number)] = datas[i]
 NEXT
FEND

No.1173 2021/02/12(Fri) 12:10:56

Re: EVALで値の代入したい / cho
しゅんさん気にかけていただいてありがとうございます。

コード拝見させていただきました。

連想配列を一つにすることで参照渡しで更新できるのはとても便利だと感じました。

連想配列を多次元(例:連想名[キー][][]][]など)にできないかと数日間悩んでいたのを憶えています。
この書き方を使えるようになれば、いろんな問題が解決できそうです。

今回はMODULEと2次元配列で私の問題を解決できそうですが、
誰か(未来の私かもしれない)の参考になると思います。
素晴らしいヒントとコードをありがとうございます。

No.1175 2021/02/12(Fri) 17:50:06

Re: EVALで値の代入したい / stuncloud
> 連想配列を多次元
SafeArrayを使えば連想配列で個別に配列を持たせることも可能です

hashtbl h

h["hoge"] = split("foo bar baz") // splitでSafeArrayにする
print h["hoge"][0] // foo

h["fuga"] = safearray(0, 9) // 長さ10の空の配列
h["piyo"] = safearray(0, 9, 0, 2) // 二次元配列もできる

さらにさらに
変数に連想配列のようにキーと値のペアを保持できるものを代入したい、という場合はScripting.Dictionaryが使えます
(値の出し入れがメソッド経由になるのでちょっと書くのが手間になりますが、なかなか便利です)

h["d"] = createoleobj("Scripting.Dictionary")
h["d"].Add("foo", "FOO") // foo というキーに対して FOO という値をセット
print h["d"].Item("foo") // FOO

No.1176 2021/02/13(Sat) 11:31:46

Re: EVALで値の代入したい / cho
stuncloudさんありがとうございます。

連想配列も多次元にできるのですね。
配列を勉強していた時に、とあるブログで
・連想配列は多次元配列では使えないのでありません。
という一文を読んで、鵜呑みにしていました。お恥ずかしいです。

SafeArrayは戻り値を配列で受ける時だけ使っていました。
SafeArrayの公式ヘルプを読みました。引数の意味と2次元まで作成できる点、理解しました。

恥をかいたついでに、無知を披露してしまいますが、
多次元の連想配列に代入する書き方を教えてください。
1時間程度彷徨いましたが、ヒントになる記事を見つけることができませんでした。
通常の多次元と同じ書き方でSyntaxErrorが出ます。
たぶん、とても簡単なことだと思うのですが・・・

DIM v[1][1]

v[0][0] = "value" // 通常の2次元はこの書き方で代入できる
PRINT v[0][0]

hashtbl h
h["hoge"] = split("foo bar baz") // splitでSafeArrayにする
print h["hoge"][0] // foo

h["hoge"][0] = "f002" // 同じ書き方でもSyntaxErrorがでる
print h["hoge"][0]



Dictionaryも初耳でしたので、調べていました。
COMオブジェを経由して使える連想配列という認識を得ました(誤解してるかもですが)
こんなこともできるのか。と、改めてUWSCの魅力を感じていました。
そして、ここで回答をいただくたびに新しい言葉を教えてもらって感謝しています。

No.1177 2021/02/13(Sat) 16:42:51

Re: EVALで値の代入したい / stuncloud
> h["hoge"][0] = "f002" // 同じ書き方でもSyntaxErrorがでる
うわあ、確認不足でしたごめんなさい
これはおそらく連想配列の要素にインデックス指定して代入、をUWSCが許容していないということだと思います
値を読むだけならOKだけど代入は無理ということになりますね
つまりこの方法は使えない…ので忘れてください…ほんとすいません…

> COMオブジェを経由して使える連想配列という認識
そんな感じでOKです
例えば連想配列を関数の戻り値にしたいけど、仕様上できないので代わりにScripting.Dictionaryを使う
みたいな感じで使うことがあったりなかったりします

No.1179 2021/02/13(Sat) 18:57:59
ライセンスキーの確認方法 / orey
有料版のproをメインPCとサブ機で使っていましたがメインPCが逝ってしまい新調しました。
新しくインストールしたのですがライセンスキーがわからなくなってしまいました。
サブ機の方で使っているのでライセンスキーの確認をしたいのですが、確認方法をご存じの方がいらっしゃいましたら教えていただけませんでしょうか。
よろしくお願いいたします。

No.1172 2021/02/12(Fri) 10:42:24

Re: ライセンスキーの確認方法 / しろまさ
すなわちそれはUWSCに限らず、他人のライセンスキーを奪う方法と同じですよね?
モラル的にアウトなので自分で調査しきれないなら諦めてください。

No.1174 2021/02/12(Fri) 13:21:25

Re: ライセンスキーの確認方法 / 諦めないで
おそらくベクターで購入していると思いますが、その場合は以下の方法で確認できます。
1) ベクターPCショップ
  https://pcshop.vector.co.jp/service/
2) 右上にある[ご注文の確認・受取はこちら]の青いボタン
3) [購入履歴の確認]ボタン
4) ログイン
  ※ログイン情報が分からない場合は下部のリマインダーを使う
5) [最近半年分の注文] --> [全て表示]に変更
6) [ライセンスキーを表示]ボタン

無いとは思いますが、他の購入サイトであっても購入履歴から確認できると思います。

No.1178 2021/02/13(Sat) 16:47:48
同じアプリを区別 / sousou
お世話になります。
ソフトを1度起動すると、1つも画面が出てきますが、再度、起動すると、同じ画面がまた出ます、そこでこの二つを区別したいのですが、なにかしらの方法はございますでしょうか、getidでは、当然、同じものしか取得できません。
getid("無題 - メモ帳", "Notepad")

No.1159 2021/02/09(Tue) 12:06:09

Re: 同じアプリを区別 / Rayna
>>1159 sousou さん

・Execで起動時のIdを取る
 一番確実でローコスト, 安定性もある
 一部取れないウインドウとかは
  idWnd = Status(Exec("app.exe"), ST_PARENT)
 とかで取れる場合がある

・GetId, Exec を使わない場合
 GetAllWinを使うことになりますが実行コスト高めです

 ・GetAllWinで差分を獲得する
  Dim saIds, saNewIds, idWnd
  SendStr(Exec("notepad.exe"), "1つめ")
  saIds = GetNewWin() // すべてのウインドウ
  SendStr(Exec("notepad.exe"), "2つめ")
  saNewIds = GetNewWin(saIds) // すべてのウインドウ - saIds

  idWnd = GetIdByIdList(saIds, EMPTY, "Notepad", 1) // 1つめ
  SendStr(idWnd, "<#CR>1つめに追記")
  idWnd = GetIdByIdList(saNewIds, EMPTY, "Notepad", 1) // 2つめ
  SendStr(idWnd, "<#CR>2つめに追記")

 ・GetAllWinのフィルター関数を作る
  // ウインドウクラスが "Notepad" And プライマリモニタに表示されてるウインドウ
  For idWnd In GetIdsByEval("Status(<ID>, ST_CLASS)=<#DBL>Notepad<#DBL> And Status(<ID>, ST_MONITOR)=0")
   Print GetStr(idWnd, 1)
  Next


// 関数サンプル
// GetAllWinで差分を獲得する
Function GetNewWin(saOldWins=)
 GetAllWin()
 Select VarType(saOldWins)
 Case VAR_ARRAY Or VAR_VARIANT
  Dim aNewIds[Length(saOldWins)+Length(ALL_WIN_ID)]
  Dim sOldWins = " "+Join(saOldWins, " ")+" "
  Dim i, j=0
  For i = 0 To Length(ALL_WIN_ID)-1
   If Pos(" "+ALL_WIN_ID[i]+" ", sOldWins)<>0 Then Continue
   aNewIds[j] = ALL_WIN_ID[i]
   j = j + 1
  Next
  RESULT = Slice(aNewIds, 0, j-1)
 Default
  RESULT = Slice(ALL_WIN_ID)
 SelEnd
FEnd
Function GetIdByIdList(saIds, sTitle=, sClass=, nOffset=0)
 RESULT = -1
 nOffset = Int(nOffset)
 If VarType(saIds)<>(VAR_ARRAY Or VAR_VARIANT) Then Exit
 If Length(sTitle+sClass)=0 Then Exit
 If nOffset=0 Then nOffset=1
 Dim idWnd
 For idWnd In saIds
  IfB VarType(sTitle)<>VAR_EMPTY Then
   If Pos(sTitle, Status(idWnd, ST_TITLE))=0 Then Continue
  EndIf
  IfB VarType(sClass)<>VAR_EMPTY Then
   If Pos(sClass, Status(idWnd, ST_CLASS))<>1 Then Continue
  EndIf
  RESULT = idWnd
  nOffset = nOffset - 1
  If nOffset=0 Then Exit
 Next
FEnd

// GetAllWinのフィルター関数を作る
Function GetIdsByEval(sEval="")
 GetAllWin()
 Dim idWnd, i=-1, aIds[i]
 sEval = Replace(sEval, "<ID>", "idWnd")
 IfB Length(sEval)=0 Then
  RESULT = Slice(ALL_WIN_ID)
  Exit
 EndIf
 For idWnd In ALL_WIN_ID
  Try
   If Eval(sEval) Then
    i = i + 1
    Resize(aIds, i)
    aIds[i] = idWnd
   EndIf
  Except
  EndTry
 Next
 RESULT = Slice(aIds, 0, i)
FEnd

No.1160 2021/02/09(Tue) 15:42:16

Re: 同じアプリを区別 / sousou
Rayna様、ありがとうございます、Execで起動時のIdは、-1とか、0で区別できませんでしたが、GetAllWinは、不安定ながら確認できました。
コスト高めな関数までご提示いただき、今後の参考にさせていただきます、ありがとうございました。

 ・

No.1161 2021/02/09(Tue) 19:43:03
ウィンドーズ10標準搭載の音声認識について / yamada
お世話になります。
ウィンドーズ10標準搭載の音声認識について教えてください。
こちらのアプリですがクリックアイテムなどの認識も効かず
画像認識でマウスを移動させてからマウスクリックという動作も
ききません。
マイクのオンオフ切り替えで何か良い方法があればお教えください。

No.1143 2021/02/04(Thu) 14:48:53

Re: ウィンドーズ10標準搭載の音声認識について / Rayna
>>1143 yamada さん

 音声認識がどれ指してるのか分からなかったけど
 マイクミュートをUIでできればいいなら "control.exe mmsys.cpl" 使えばできます
 見栄えは AcW(idWnd, G_SCREEN_W, G_SCREEN_H) でマシになるかも

 なにかののトリガーでミュートするにしても外部ソフトと連携したほうが楽だし安定性はあがると思います
 ちょっと調べた感じコマンドラインでやるなら NirCmd とか便利そう

 他には以下でもできそう
 ・デバイスの有効無効を切り替える
  → 無効中は認識されなくなるので他のソフトのマイク設定が飛ぶかも
 ・音声認識がUWPアプリならマイクの権限を奪う(レジストリ)

No.1150 2021/02/05(Fri) 13:23:11
UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / あきら
UwscWebDriver
MODULE_VERSION = "0.4.1"

Google Chrome は最新版です
バージョン: 88.0.4324.104(Official Build) (64 ビット)

Firefox
バージョン: 84.0.2

ChromiumEdge
バージョン 88.0.705.50 (公式ビルド) (64 ビット)

以下を実行すると、Firefoxは、期待通り、2つのタブのtitleとurlがとれますが、
ChromiumEdgeとChromeは、2つ目のタブが、1つ目のタブのtitleとurlになってしまいます。
これは、正常でしょうか?


call UwscWebDriver.uws
//driver = WebDriver.Start(WebDriver.ChromiumEdge)
driver = WebDriver.Start(WebDriver.Chrome)
//driver = WebDriver.Start(WebDriver.firefox)

//driver.SwitchWindow(driver.Navigate("http://www3.rocketbbs.com/601/bbs.cgi?id=siromasa&mode=find","siromasa"))
driver.Navigate("http://www3.rocketbbs.com/601/bbs.cgi?id=siromasa&mode=find")
h1 = driver.GetCurrentWindowHandle()

driver.Navigate("https://stuncloud.github.io/UwscWebDriver/", "second")
h2 = driver.SwitchWindow("second")

h = driver.GetWindowHandles()
print "length(h) = " + length(h)


for h in driver.GetWindowHandles()
driver.SwitchWindow(h)
title = driver.GetTitle() //OK
url = driver.GetUrl() //OK
print "title(test) = " + title
print "url(test) = " + url
next
exitexit

No.1112 2021/01/26(Tue) 15:33:16

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / stuncloud
> これは、正常でしょうか?
返ってくる値に関しては各種weberiver依存なので、UwscWebDriverが保証できるものはなにもありません
(UwscWebDriverから介入できる部分ではないのでいかんともしがたいのです)
特にtitleとurlに関しては想定している値が取れないことが多い印象なので、そのつもりで使ってください

回避策はExecuteScriptを使ったJavaScript実行による値の取得、となります

No.1114 2021/01/26(Tue) 16:00:52

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / あきら
titleとurlの表示は、そうかもしれませんが、driver.SwitchWindow(h)で、2つ目のタブへdriverオブジェクトが移っていないようです。
No.1115 2021/01/26(Tue) 17:49:04

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / stuncloud
> 2つ目のタブへdriverオブジェクトが移っていないようです
GetTitle()やGetUrl()以外のことをしても1つ目のタブに対して操作が行われるということでしょうか?
driver側でなにか仕様が変わったのかもしれませんが、しばらく調査する時間が取れないのでgithubのissueを書いておいていただけますか?

No.1116 2021/01/26(Tue) 19:51:23

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / stuncloud
あと、正常に動作していたブラウザおよびdriverのバージョンがわかるようなら教えて下さい
例えば、今回の88にしてから発生していてその前の87なら動いていた、みたいな情報が可能ならほしいです

No.1117 2021/01/26(Tue) 19:54:52

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / あきら
終了した時に、オブジェクトが移っていれば、タブの色が白に変わっています。
firefoxは、終了した時には、タブの色は、2つ目のタブが白になっています。
ChromiumEdgeとChromeは、終了した時には、1番目のタブの色が白になっています。
GetTitle()やGetUrl()以外のことをしても1つ目のタブに対して操作が行われるということでしょうか?との事ですが、タブの色が変わっていないので、オブジェクトは、移っていないと思います。

ブラウザ、UwscWebDriver共、今回のバージョンが、初めてで、前のバージョンは、試していません。

No.1118 2021/01/26(Tue) 20:47:55

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / あきら
print "url(test) = " + urlの後ろに、下記追加して、確かめました。

//htmlソースを取得
str = driver.GetSource()
id=exec("notepad")
sendstr(id,str)

htmlソースが、メモ帳に表示されます。
firefoxでは、2つ目のメモ帳に、2つ目のタブのソースが表示されます。
ChromiumEdgeとChromeは、2つ目のメモ帳に、1つ目のタブのソースが表示されます。

ChromiumEdgeとChromeは、driverオブジェクトは、2つ目のタブへ移動していません。

No.1119 2021/01/27(Wed) 07:59:34

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / stuncloud
print driver.SwitchWindow(h)
をして表示される値を教えて下さい
・2つ目の値が1つ目の値と同じ
・2つ目の値が非表示
のいずれかであれば問題が生じています

それと
> h2 = driver.SwitchWindow("second")
ここでも切り替わってなさそうですか?
この h2 の値も教えて下さい

No.1120 2021/01/27(Wed) 08:53:32

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / あきら
ChromiumEdgeです。
投稿時、urlにエラーが出るので、httpをttpに変更しています。
--------実行結果-----------------
length(h) = 2
driver.SwitchWindow(h)の結果 = CDwindow-41DB837B3D6B99BAF5B9B38F53C1A36F
title(test) = UWSC 仮 掲示板
url(test) = ttp://www3.rocketbbs.com/601/bbs.cgi?id=siromasa&mode=find
driver.SwitchWindow(h)の結果 = CDwindow-41DB837B3D6B99BAF5B9B38F53C1A36F
title(test) = UWSC 仮 掲示板
url(test) = ttp://www3.rocketbbs.com/601/bbs.cgi?id=siromasa&mode=find
h2の値 = CDwindow-41DB837B3D6B99BAF5B9B38F53C1A36F
title(h2) = UWSC 仮 掲示板
url(h2) = ttp://www3.rocketbbs.com/601/bbs.cgi?id=siromasa&mode=find
--------------------------


1.print driver.SwitchWindow(h)の結果:
2つ出て来てますが、同じ値です。
CDwindow-41DB837B3D6B99BAF5B9B38F53C1A36F
CDwindow-41DB837B3D6B99BAF5B9B38F53C1A36F
2.h2の値
nextの次に下記を入れました。
h2 = driver.SwitchWindow("second")
print "h2の値 = " + h2
title = driver.GetTitle() //OK
url = driver.GetUrl() //OK
print "title(h2) = " + title
print "url(h2) = " + url
結果:
h2 = CDwindow-41DB837B3D6B99BAF5B9B38F53C1A36F
h2 = driver.SwitchWindow("second")をnextの後にいれたら、2つ目のタブが白に変わりました。
titleとurlは、1つ目のタブですが、2つ目のタブのソースを見ると、2つ目のタブの内容です。
切り替わっているようです。

No.1122 2021/01/27(Wed) 10:54:58

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / stuncloud
ありがとうございます

現在すぐに修正に着手できる状況ではないので、すぐには出来ませんがひとまず近いうちに調査だけはします

No.1123 2021/01/27(Wed) 12:10:23

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / stuncloud
こちらでも動かしてみました
どうやらウィンドウハンドル値による切り替えができていない?
ひとまずは名前による切り替えを使うようにしてください

https://github.com/stuncloud/UwscWebDriver/issues/10

調査や修正の報告は以後こちらでやります

No.1124 2021/01/27(Wed) 14:15:39

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / あきら
1つ目のタブのどこかで、クリックして、2つ目のタブが開かれた時、2つ目のタブをコントロールをしようとしても、名前がないので、コントロールできません。
修正、期待しています。

No.1125 2021/01/27(Wed) 15:24:11

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / stuncloud
0.4.2を出しました
タブを切り替えて操作はできるようになりました
(FindElementしてSetValueはできた)

URLとタイトルが正常に取れない問題は原因がわからないので未対応です
(SwitchWindowしてもハンドルが変わっていないせいなのだけれどその原因がさっぱりわからない)

URLなどに関しては
> 回避策はExecuteScriptを使ったJavaScript実行による値の取得、となります
を必要に応じてやってください

あと、この変更により古いバージョンのブラウザやwebdriverで正常動作しない場合があるかもしれませんがそこまでサポートしません
ブラウザおよびwebdriverを更新してください

No.1134 2021/02/01(Mon) 15:33:00

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / UwscWebDriver 0.4.2の結果

//-------------UwscWebDriver 0.4.2の結果------------
//下記スクリプトで、検証しました。
//投稿できないので、httpは、ttpに変えています。
//-----------------↓検証script↓-----------------------
call UwscWebDriver.uws
//driver = WebDriver.Start(WebDriver.ChromiumEdge)
//driver = WebDriver.Start(WebDriver.Chrome)
driver = WebDriver.Start(WebDriver.firefox)

driver.Navigate("ttps://stuncloud.wordpress.com/2019/03/26/1-5/#more-1684") //ヤツの名はイッパイアッテナ | たっぷす庵
h1 = driver.GetCurrentWindowHandle()
sleep(3)
title = driver.GetTitle() //OK
url = driver.GetUrl() //OK
print "title(h1) = " + title
print "url(h1) = " + url
print "h1 = " + h1
elem = driver.FindElement("a[href=<#dbl>ttp://www3.rocketbbs.com/601/siromasa.html<#dbl>]") //仮掲示板
elem.Click_js()
sleep(3)
//新しく、仮掲示板のタブが開く

//最後のタブへ移動、windowhandle取得
h = driver.GetWindowHandles()
print "length(h)(仮掲示板のタブが開いた後) = " + length(h) //結果は2で、2つ認識している。
h2 = driver.SwitchWindow(h[length(h)-1]) //最後のタブへ移動
title = driver.GetTitle() //OK
url = driver.GetUrl() //OK
print "title(h2) = " + title
print "url(h2) = " + url
print "h2 = " + h2
sleep(3)

driver.Navigate("ttps://github.com/stuncloud/UwscWebDriver/tags", "second") //github
sleep(5) //これ必要、これないと、url、titleが取得できない。

//最後のタブへ移動、windowhandle取得
h = driver.GetWindowHandles()
print "length(h)(githubのタブが開いた後) = " + length(h) //結果は3で、3つ認識している。
h3 = driver.SwitchWindow(h[length(h)-1]) //最後のタブへ移動

//h = driver.GetWindowHandles()
//print "length(h)(githubのタブが開いた後) = " + length(h)

for h in driver.GetWindowHandles()
print ""
print "h = " + h
print "driver.SwitchWindow(h)の結果 = " + driver.SwitchWindow(h)

title = driver.GetTitle() //OK
url = driver.GetUrl() //OK
print "title(test) = " + title
print "url(test) = " + url

next
print ""

//h1のタブへ移動します。
driver.SwitchWindow(h1)
print "h1の値 = " + h1
title = driver.GetTitle() //OK
url = driver.GetUrl() //OK
print "title(h1) = " + title
print "url(h1) = " + url

//-----------------↑検証script↑-----------------------


//Firefoxでは、うまく、オブジェクトが移動できました。ありがとうございます。
//ChromiumEdgeとChromeでは、うまく、移動していないようです。

No.1144 2021/02/04(Thu) 18:02:43

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / あきら
Firefoxの結果です

title(h1) = ヤツの名はイッパイアッテナ | たっぷす庵
url(h1) = ttps://stuncloud.wordpress.com/2019/03/26/1-5/#more-1684
h1 = 15
length(h)(仮掲示板のタブが開いた後) = 2
title(h2) = UWSC 仮 掲示板
url(h2) = ttp://www3.rocketbbs.com/601/siromasa.html
h2 = 41
length(h)(githubのタブが開いた後) = 3

h = 15
driver.SwitchWindow(h)の結果 = 15
title(test) = ヤツの名はイッパイアッテナ | たっぷす庵
url(test) = ttps://stuncloud.wordpress.com/2019/03/26/1-5/#more-1684

h = 41
driver.SwitchWindow(h)の結果 = 41
title(test) = UWSC 仮 掲示板
url(test) = ttp://www3.rocketbbs.com/601/siromasa.html

h = 6442450946
driver.SwitchWindow(h)の結果 = 6442450946
title(test) = Tags · stuncloud/UwscWebDriver · GitHub
url(test) = ttps://github.com/stuncloud/UwscWebDriver/tags

h1の値 = 15
title(h1) = ヤツの名はイッパイアッテナ | たっぷす庵
url(h1) = ttps://stuncloud.wordpress.com/2019/03/26/1-5/#more-1684

No.1145 2021/02/04(Thu) 18:19:44

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / あきら

Chromeの結果です。

title(h1) = ヤツの名はイッパイアッテナ | たっぷす庵
url(h1) = ttps://stuncloud.wordpress.com/2019/03/26/1-5/#more-1684
h1 = CDwindow-04CB5A6C4F449A1E611271048AF94449
length(h)(仮掲示板のタブが開いた後) = 2
title(h2) = ヤツの名はイッパイアッテナ | たっぷす庵
url(h2) = ttps://stuncloud.wordpress.com/2019/03/26/1-5/#more-1684
h2 = CDwindow-04CB5A6C4F449A1E611271048AF94449
length(h)(githubのタブが開いた後) = 2

h = CDwindow-04CB5A6C4F449A1E611271048AF94449
driver.SwitchWindow(h)の結果 = CDwindow-04CB5A6C4F449A1E611271048AF94449
title(test) = ヤツの名はイッパイアッテナ | たっぷす庵
url(test) = ttps://stuncloud.wordpress.com/2019/03/26/1-5/#more-1684

h = CDwindow-06A87D36DD060E938B79108D8DB089A3
driver.SwitchWindow(h)の結果 = CDwindow-04CB5A6C4F449A1E611271048AF94449
title(test) = ヤツの名はイッパイアッテナ | たっぷす庵
url(test) = ttps://stuncloud.wordpress.com/2019/03/26/1-5/#more-1684

h1の値 = CDwindow-04CB5A6C4F449A1E611271048AF94449
title(h1) = ヤツの名はイッパイアッテナ | たっぷす庵
url(h1) = ttps://stuncloud.wordpress.com/2019/03/26/1-5/#more-1684

No.1146 2021/02/04(Thu) 18:21:22

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / stuncloud
ええとですね、こちらでは
・タブの移動は成功する
・タブを移動してinputへのテキスト入力は成功する
・タブを移動した際にタイトルやURL、およびウィンドウハンドルの取得がうまく行かない(原因不明)
ということをお伝えしたつもりです
(検証環境に関してはgithubのissueに書いてあるとおりです)

その上でお聞きしますが、あなたは僕になにを伝えようとなさっているのですか?
何をしてほしいのですか?

タイトルとURLが取れないという話なら今のところどうにもならないので、繰り返しになりますが
> URLなどに関しては
> > 回避策はExecuteScriptを使ったJavaScript実行による値の取得、となります
> を必要に応じてやってください

しかないです

webdriverはapi仕様がぜんぜんわからない(seleniumの動作を確認するしかないが得られる情報が不十分)のでこの手の不具合だと正直なにが悪いのかすらわからん状況です
なのでどうにもならないと言った場合はマジでどうにもなってないということをご理解ください
chromium系はpuppeteerのやってる方式にしたほうが良いのかなあ…

No.1147 2021/02/04(Thu) 20:21:46

Re: UwscWebDriver:ChromiumEdgeとChromeで、SwitchWindowで、切り替わらない。 / stuncloud
あと今後もなにかあるならgithubのissueに書いてください
最後にそれだけはお願いします

No.1148 2021/02/04(Thu) 20:23:35
カラー変換 / kinkin
お世話になります。
カラーコード16進数FFFFFFは、10進数では、16777215となりますが、計算式としては、どう求めればよいでしょうか。
関数もなく、記号を変換していくのは、不可能に近いと思うのですが、webでは変換機があります、uwscのみでの変換ができそうな方、ご教授いただければ幸いです。

No.1133 2021/02/01(Mon) 14:51:11

Re: カラー変換 / stuncloud
print $FFFFFF

// 文字列から変換なら
hex = "FFFFFF"
print val("$" + hex)

No.1135 2021/02/01(Mon) 15:36:21

Re: カラー変換 / kinkin
関数があったのですね、天と地の差、神と初心者の間にあるのは、$のみだったとは、、1週間探し悩んだのですが、ありがとうございました。
No.1136 2021/02/01(Mon) 16:02:50

Re: カラー変換 / しろまさ
// 大変と言われるとやってみたくなる奴
dim i, n, c = "FFFFFF"
for i = 0 to length(c)-1
  n = n + (pos(copy(c,i+1,1),"0123456789ABCDEF")-1) * Power(16,length(c)-1-i)
next
msgbox(n)

No.1139 2021/02/02(Tue) 12:04:55

Re: カラー変換 / kinkin
ありがとうございます。
>// 大変と言われるとやってみたくなる奴 
しろまささん、できちゃうのですね。
まさか逆に、16777215をFFFFFFに変えることも可能なのでしょうか、色々試行錯誤しましたが、自分の力では、不可能であると判断させていただきましたが。



No.1140 2021/02/04(Thu) 09:12:47

Re: カラー変換 / しろまさ
// めんどいが乗り船なので
dim r, s, n=16777215
repeat
  r=n mod 16;s=copy("0123456789ABCDEF",r+1,1)+s;if n-r=0 Then Break Else n=(n-r)/16
until FALSE
msgbox(s)

> 自分の力では、不可能であると判断させていただきましたが。
こういう考え方は嫌い。努力しろ。
最近の若者は聞けばなんでも答えが貰えると思ってる節がある。

No.1141 2021/02/04(Thu) 10:34:34

Re: カラー変換 / Rayna
>>1140 kinkin さん

 UWSCの構文、関数だけで完結するなら
 Valの使い方はヘルプだけだと16進文字列も変換できる事が分かりづらいかもしれないですが
 他はすべてヘルプに書いてます

 スクリプト > スクリプト構文 > 16進指定
 スクリプト > スクリプト関数 > Format

 手動で計算したいのなら FFFFFF や 16777215 が何進数か理解出来てるわけですから
 「進数変換 計算 方法」あたりで検索すれば大量にでてきますし計算できると思います

No.1142 2021/02/04(Thu) 10:52:15
Control-Alt-Delete / souso
お世話になります、以下、「Ctrl」+「Alt」+「Delete」3つのキーで画面を切り替えたいのですがまったく反応しません、待ち時間を変えてもダメでした、対策原因を教えていただけないでしょうか。
sleep(1)
KBD(VK_CTRL,DOWN,32)
KBD(VK_ALT,DOWN,328)
KBD(VK_DELETE,CLICK,483)

これでもダメでした。
id=getid(GET_ACTIVE_WIN) //id=0 でもダメ
SCKEY(id, VK_ALT,VK_CTRL,VK_DELETE)

No.1137 2021/02/02(Tue) 11:00:02

Re: Control-Alt-Delete / stuncloud
> 対策原因を教えていただけないでしょうか。
原因:物理キーボードじゃないからです
対策:ないです
あと、仮にでキーが通ったとしてもセキュリティオプション画面をUWSCから操作することができないはずです

逆に言うとキーボードからの入力は受け付けてるのでその部分だけマクロ機能が使えるキーボード的な何かと連携する…ということならできるかもしれませんが
まぁその、原則勝手に動かされては困る部分なのでWindows上で動作するアプリケーション側からは操作できないものなんだと認識しておいてください

No.1138 2021/02/02(Tue) 11:40:40
Win10 Uws2exeでエラー / ROM
お世話になります。

使用していたPCが"経年劣化"となり、新しいPCに移行しました。

UWSCのEXE化ツール"Uws2exe"を使用すると「作成に失敗しました4」が現れます。
(UDebugなどは(今のところ)正常に使用できています)

Win10の環境でUWSCproをご使用の方のコメントを頂ければ幸いです。
よろしくお願いします。


環境:
  Win10 HOME 64bit
  UWSCpro Ver-5.3.0.2

No.1129 2021/01/31(Sun) 10:22:38

Re: Win10 Uws2exeでエラー / stuncloud
Windows10でも本来であれば正常に利用できるはずです

なので現象の再現ができないかいくつか考えられそうなパターンを試してみました

その結果、exeuws.exeを意図的に破壊した場合に
> 作成に失敗しました 3
> 作成に失敗しました 4

の2つのエラーダイアログが表示されることを確認しました

一旦UWSC Proをアンインストールし、インストールし直してみていただけますでしょうか
ファイル破損が原因であればそれで解消するかもしれません

No.1130 2021/01/31(Sun) 14:45:34

Re: Win10 Uws2exeでエラー / ROM

stuncloudさん

早速の返信ありがとうございます!!

>Windows10でも本来であれば正常に利用できるはずです
そうですよね。

>一旦UWSC Proをアンインストールし、インストールし直し
再インストールしましたが、「作成に失敗しました 4」が相変わらず現れます

もちろん、.uwsは正常に動作していますし、Udebugも正常です。
  (少なくとも変な症状は見当たりません)

PC移行の際、何かミスを犯してるのかしら。。。

それにしては、Office、AcrobatReader、Hidemaruなどは正常に動作している。。。不思議です。

No.1131 2021/01/31(Sun) 20:02:22

Re: Win10 Uws2exeでエラー / stuncloud
だめでしたか
あとは…そうですね…

・インストールし直しの際に C:\Program Files (x86)\UWSC 以外のフォルダにインストールしてみる
 →別のドライブとか
・%TMP%(%TEMP%)フォルダを空にする
 →exe化の作業がtmpで行われてる…として、なにか悪さをするゴミが残ってしまっている(かもしれない)

あたりをやってみる…?
(やったからどうだレベルの思いつきでしかなくなにか根拠があるわけでもないですが)

あ、あとファイル破損の疑いがあるのでuws2exe.exeとexeuws.exeのsha256ハッシュ値を取ってもらえますか?
(PowerShellのGet-FileHashで取れます)
それを正常動作しているこちらのファイルと比較してみます

それと一応確認ですが、インストールにはPro版のインストーラを使われている…ということで大丈夫ですよね?
もしそうでなかったら正規のインストーラを使ってください


最後にもうひとつお願い

この手の問題はumiumiさんでないと詳細がわからないので、申し訳ないのですが解決策を知ってる人というのは(おそらく)いません
自分で手を動かすしかないのです
掲示板でのフォローには限界があるので、ROMさん本人にも解決策を探す努力をしていただく必要があります
思いつく限りいろいろ試してみてください

No.1132 2021/02/01(Mon) 11:16:49

以下のフォームに記事No.と投稿時のパスワードを入力すれば
投稿後に記事の編集や削除が行えます。
200/200件 [ ページ : << 1 ... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 >> ]

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

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

Rocket Board Type-X (Free) Rocket BBS