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

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

処理が歯抜けになる / YMK
データ群にアクセスし、高速化のために同時進行処理しているのですが、
処理が歯抜けになってしまいます。

以下は、症状が起きるプログラムですが、
1〜30000の数字が(スレッド処理なので順番はともかく)全て出力されるはずですが、
実際には、7522〜7541が抜けたり、4239〜4261が抜けたり、また、やるときによって抜ける箇所がバラバラになってしまいます、、

どのような修正をすれば良いかご教授下さい。

--------------------------------------------------------
Public str = "",スレッド数 = 0 ,フラグ[100000]

for i = 1 to 30000 step 20
thread 情報取得(i)
スレッド数 = スレッド数 +1
while スレッド数 > 60 //スレッドは60を超えないように
wend
next

for i = 1 to 30000 step 20//全てのスレッドの完了待ち
while フラグ[i] <> 1
sleep(0.001)
wend
next

//結果をテキストに出力
f = fopen("test.txt",F_WRITE)
fput(f,str) ; fclose(f)

PROCEDURE 情報取得(i)
for num = 0 to 19
str = str +(i +num) +"<#cr>"
next

スレッド数 = スレッド数 -1
フラグ[i] = 1
fend

No.1557 2023/02/27(Mon) 10:20:23

Re: 処理が歯抜けになる / stuncloud
> str = str +(i +num) +"<#cr>"
この部分ですかねえ…排他制御なんかがあったほうが良い気がします
ただ、そうするとせっかくthreadで並行処理してるのにstrに詰めるところがボトルネックになりそうですよね

とにかく結果をすべて変数strに入れていくというのがどう見ても悪手なので、まずはそこを見直すのが良いのではないでしょうか
この場合であれば情報取得関数内でF_EXCLUSIVEを付けて書き出すとか?

例示されたコードに関してはこうかな?という話で、実際の解決策はケースバイケースだと思います
ただ、threadでグローバル変数を随時書き換えていくというのはやるべきではないでしょう

No.1558 2023/02/27(Mon) 16:26:39

Re: 処理が歯抜けになる / YMK
stuncloud 様、ご返信有り難うございます。

>threadでグローバル変数を随時書き換えていくというのはやるべきではない

strに随時追記するのではなく、別途配列に代入させたら安定させることが出来ました。

有り難うございました。

No.1559 2023/02/27(Mon) 19:48:33
CREATEFORMで生成したウインドウを全画面にしたい / けいち

CREATEFORMで作ったウインドウを画面いっぱいにしたいのですがオプションを見ても
最大化ボタンまででタイトルバーが残ります。
ウインドウのIDを取得してCTRLWINから最大化も同様でした
なにか特殊な方法が必要でしょうか?
過去ログから探してみましたがそれらしきスレを参考にしましたがリンク先は既に無くなっていました。
良い方法は無いでしょうか?

No.1552 2023/02/21(Tue) 22:23:22

Re: CREATEFORMで生成したウインドウを全画面にしたい / stuncloud
SetWindowLongでウィンドウスタイルを変更し、WS_POPUP or WS_VISIBLEのみにするとクライアント領域だけが表示される (タイトルバーなどが消える) ようです
その後画面幅いっぱいまでウィンドウをリサイズすればフルスクリーンのような表示にできると思います
事前にGetWindowLongでもともとのスタイルを保持しておけば、再度SetWindowLongを実行することで元のウィンドウの状態に戻せます
スタイルの取得・変更はGWL_STYLEです

No.1553 2023/02/21(Tue) 23:02:14

Re: CREATEFORMで生成したウインドウを全画面にしたい / けいち
stuncloud様
レスありがとうございます。
SetWindowLongAを検索しながら下記のようなサンプルを作っています
いろいろな検索結果からためしていますが
使い方がわからずエラーがでてしまいます。
どのようにすればできるでしょうか?

DEF_DLL GetWindowLongA(HWND, int): dword: User32
DEF_DLL SetWindowLongA(HWND, int, dword): dword: User32
CONST GWL_STYLE = -16
CONST WS_CAPTION = $C00000


// フォーム作成
obj = CREATEFORM("about:blank", "タイトル", True, FOM_NOHIDE,200,200,0,0)  // フォーム生成
obj.ToolBar = False
obj.StatusBar = False
SetWindowLongA(obj.Hwnd, GWL_STYLE, GetWindowLongA(obj.Hwnd, GWL_STYLE) - WS_CAPTION)

obj.Document.write(フォーム)       // HTMLを書き込む

while obj.Visible              // 画面が出ている間
  ifb GETFORMDATA("OKボタン") then // OKボタンが押された
MSGBOX("OK押した")
  endif
  Sleep(1)
wend

TextBlock フォーム
 <form method="POST">
  <input type="submit" value=" OK " name="OKボタン">

 </form>
EndTextBlock

No.1554 2023/02/22(Wed) 11:48:41

Re: CREATEFORMで生成したウインドウを全画面にしたい / stuncloud
> 使い方がわからずエラーがでてしまいます。
エラーで止まった場合は
・どの行で発生したのか
・エラーメッセージ
を書いてもらわないとわかりません
この二点は必ず書くようにしてください

結論から言うと悪いのは
> obj.Hwnd
です、CreateFormのオブジェクトにhwndというプロパティはありません
このあたりはエラーメッセージがCOMエラーであることから簡単に推察できますね (def_dllの関数はCOMエラーを吐かない)

エラーメッセージをちゃんと読むことや
> SetWindowLongA(obj.Hwnd, GWL_STYLE, GetWindowLongA(obj.Hwnd, GWL_STYLE) - WS_CAPTION)
といった書き方をやめてGetWindowLongAの引数を変数に取るなどをしつつ問題点の切り分けをしていけばエラー原因も特定できたと思います
もう少し頑張りましょう


それはそれとして、上記コードを改変してフルスクリーンのサンプルを書いてみました

DEF_DLL GetWindowLongA(HWND, int): dword: User32
DEF_DLL SetWindowLongA(HWND, int, dword): dword: User32
CONST GWL_STYLE = -16
// CONST WS_CAPTION = $C00000
const WS_POPUP = $80000000
const WS_VISIBLE = $10000000

// フォーム作成
obj = CREATEFORM("about:blank", "タイトル", True, FOM_NOHIDE,200,200,100,100)
obj.ToolBar = False
obj.StatusBar = False
id = getid(GET_FORM_WIN)
hwnd = idtohnd(id)
oldstyle = GetWindowLongA(hwnd, GWL_STYLE)
newstyle = WS_POPUP + WS_VISIBLE

obj.Document.write(フォーム)

while obj.visible
 if getformdata("フルスクリーン") then
  SetWindowLongA(hwnd, GWL_STYLE, newstyle)
  ctrlwin(id, MAX)
 elseif getformdata("元に戻す") then
  ctrlwin(id, NORMAL)
  SetWindowLongA(hwnd, GWL_STYLE, oldstyle)
 endif
wend

TextBlock フォーム
<form method="POST">
<input type="submit" value="フルスクリーン" name="フルスクリーン">
<input type="submit" value="元に戻す" name="元に戻す">
</form>
EndTextBlock

No.1555 2023/02/22(Wed) 13:55:34

Re: CREATEFORMで生成したウインドウを全画面にしたい / けいち
stuncloud様
エラー特定の方法やサンプルコードまで頂き感謝致します。
元のサイズに戻す方法も大変参考になりました。
貴重なお時間を割いて頂きありがとうございました。

No.1556 2023/02/22(Wed) 22:36:26
UWSCの文字列の結合について / haku
CSVからデータベースへレコードを登録しようとしています。
その際に大量に文字列の結合が必要なのですが、想像していた以上に処理が遅くて困っています。
速度をアップさせる方法がないでしょうか?

No.1550 2023/02/16(Thu) 17:44:34

Re: UWSCの文字列の結合について / stuncloud
要約すると
・CSVから得たデータをDBに書き込む
・文字列結合処理がある
・一連の処理が遅く感じる
・早くしたい
という内容なのでこれだけだと回答は難しいです

処理が遅いのは文字列結合部分だけなのでしょうか?そもそも文字列結合は本当に遅いのでしょうか?
一連の処理の要所要所で実行時間を計測し、遅い部分を突き止めつつそのコードの提示をしてもらうといったことをしていただく必要があるように思います

No.1551 2023/02/16(Thu) 18:42:46
UWSCからsqlite3.dllを使ってDB操作 / トリビア
UWSCからsqlite3のデータベースを扱いたく、exe版を利用していましたが、
DEF_DLLでsqlite3.dllを呼び出し使用する方法を探しています。
こちら方法をご教示いただけないでしょうか。

No.1544 2023/02/11(Sat) 00:02:35

Re: UWSCからsqlite3.dllを使ってDB操作 / stuncloud
C++ですがわかりやすいものがありました
https://seraphy.hatenablog.com/entry/20061031/p1
sqlite3_open16()でDBに接続してsqlite3_exec()でSQLを実行する、という流れのようですね
sqlite3_openだとUTF8ですがsqlite3_open16ならUTF16を使うようです
UWSCであればUTF16のほうが使いやすいと思います (def_dllの際にwstringを使う)

関数の解説は以下から見れます、ちょっと読みにくい…
https://www.sqlite.org/c3ref/funclist.html

def_dll sqlite3_open16(wstring, var dword):int:sqlite3.dll
def_dll sqlite3_exec(dword, wstring, dword, dword, dword):int:sqlite3.dll
でいいのかな?あまり自信ないですがいろいろ試してみてください
・openの第二引数はポインタのポインタなのでここで得られた値(アドレス)の先にある値を取らないとDBハンドルのポインタにならない気がする
 ・{var dword} でなんとかならんか?RtlCopyMemoryするのが無難か
・dwordのとこにNULLを入れる場合はNULLではなく0でいいです

No.1545 2023/02/11(Sat) 01:37:25

Re: UWSCからsqlite3.dllを使ってDB操作 / トリビア
stuncloudさん
ご教示ありがとうございます。
いただいた情報をもとに少し試行錯誤してみます!
またご報告いたします

No.1546 2023/02/11(Sat) 11:42:08

Re: UWSCからsqlite3.dllを使ってDB操作 / stuncloud
sqlite3_open16の第二引数、ポインタのポインタについて補足します

まず、var dwordとしてポインタを32ビット整数として受けます
ポインタなので受けた値が示すのはメモリ上のアドレスとなります
このアドレス上にある値がsqliteのハンドルのポインタです (sqlite3_execに渡す値)
あるアドレスが示す先にある値を任意の型で得るための関数が以下になります

def_dll RtlMoveMemory(var dword, dword, dword):kernel32

第一引数で得たい値を受けます、ポインタなので型をdwordとします

コード例は以下の通りです (コードの検証はしていないためこの通りに動かない可能性があります)

ppdb = 0
sqlite3_open16(filename, ppdb) // ハンドルのポインタのポインタをppdb変数で受ける

// ハンドルのポインタを受ける変数
pdb = 0
RtlMoveMemory(pdb, ppdb, 4) // ppdbが示すアドレスにあるデータをdword型としてpdbに受ける


sqlite3_exec(pdb, sql)

No.1547 2023/02/11(Sat) 12:46:43

Re: UWSCからsqlite3.dllを使ってDB操作 / トリビア
詳細な解説をいただき、ありがとうございます。
引き続き下記ですが操作が出来ないので試行錯誤してみます!


def_dll sqlite3_open16(wstring, var dword):int:sqlite3.dll
def_dll sqlite3_exec(dword, wstring, dword, dword, dword):int:sqlite3.dll
def_dll sqlite3_close(wstring):int:sqlite3.dll
def_dll RtlMoveMemory(var dword, dword, dword):kernel32

ppdb=0
sqlite3_open16("sample1.db",ppdb)

pdb=0
RtlMoveMemory(pdb, ppdb, 4)

sqlite3_exec(pdb, "create table Data(id, name);")
sqlite3_exec(pdb, "insert into Data(id, name) values (1,2);")
sqlite3_close(pdb)

No.1548 2023/02/11(Sat) 13:37:49

Re: UWSCからsqlite3.dllを使ってDB操作 / トリビア
色々と教えていただきましたが、下記で操作できるようになりましたので、
ご報告いたします。ありがとうございました。

def_dll sqlite3_open16(wstring, var dword):int:sqlite3.dll
def_dll sqlite3_exec(dword, dword, dword, dword, dword):int:sqlite3.dll
def_dll sqlite3_close(dword):int:sqlite3.dll
def_dll RtlMoveMemory(var dword, var dword, dword):kernel32

ppdb=0
ret=sqlite3_open16("sample1.db",ppdb);

pdb=0
RtlMoveMemory(pdb, ppdb, 4)

ret=sqlite3_exec(pdb, "create table Data(id, name);",0,0,0)
ret=sqlite3_exec(pdb, "insert into Data(id, name) values (1,2);",0,0,0)
ret=sqlite3_close(pdb);

No.1549 2023/02/12(Sun) 21:03:55
Selenium edge の再接続について / みつ
どうしてもフレーム操作が必要 (おそらくIEモードがサポートされる2029年頃まで) な為、
Selenium egdeへの再接続が以下で問題ないかご教授をお願いできないでしょうか。

左画面と右に上下2画面の3画面に分かれており、右上で入力検索を行い、右下の結果を取得するを繰り返すので
別画面を開いて対応できません(知識不足かもしれませんが)。

UwscWebDriver の SwitchFrame() で対応したかったのですが、最新のUwscWebDriverでも動きませんでした。
VBAでは動くことを確認できましたが、UWSCで動かしたいです。


edgeバージョン:109.0.1518.70 (公式ビルド) (64 ビット)
edgedriver バージョン:109.0.1518.70 
SeleniumBasicフォルダに msedgedriver.exe では動かなかった為、edgedriver.exe に名称を変更したらVBAでは動きました。現在はedgedriver.exeにしてあります。

前準備
"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=9222 --user-data-dir="C:\Users\Temp_ForEdge"
をbatファイルに記載し起動


driver = CreateOleObj("Selenium.WebDriver")
//driver.SetCapability "ms:edgeOptions", "{""debuggerAddress"":""127.0.0.1:9222""}" ←VBAではこれで再接続できます
driver.SetCapability("ms:edgeOptions", "{<#DBL><#DBL>debuggerAddress<#DBL><#DBL>:<#DBL><#DBL>127.0.0.1:9222<#DBL><#DBL>}") ← UWSCではここでCOM_Errorとなってしまいます。
driver.Start("Edge")
driver.Get("http://www3.rocketbbs.com/601/siromasa.html")

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

No.1541 2023/02/02(Thu) 14:10:44

Re: Selenium edge の再接続について / stuncloud
> <#DBL><#DBL>
<#DBL>一個でいいんじゃないでしょうか
VBAは"を"でエスケープしてますが、UWSCではそこは不要なので

No.1542 2023/02/02(Thu) 14:53:47

Re: Selenium edge の再接続について / みつ
stuncloud 様

毎度的確なご回答ありがとうございます。
ばっちり動きました。
これで何とか動かせそうです。


>VBAは"を"でエスケープしてますが、UWSCではそこは不要なので

知識不足でした。
勉強になります。

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

No.1543 2023/02/02(Thu) 18:07:40
Funcionの参照渡しから参照戻りについて / haku
下記にて受け取りができずに困っています。
ご助言よろしくお願いします。

HASHTBL Dic1 =HASH_SORT


Dic1 = Test(Dic1)
↑↑↑↑↑↑↑

Function Test(Var Dic)
Dic = HASH_REMOVEALL 
Result = Dic
FEND

No.1538 2023/01/24(Tue) 10:26:37

Re: Funcionの参照渡しから参照戻りについて / stuncloud
問題点は2つあります

> Function Test(Var Dic)

連想配列を受けるのであれば引数名に[]を付ける必要があります

Function Test(Var Dic[])

> Result = Dic

UWSCのユーザー定義関数は配列及び連想配列を戻り値として返す事ができません
参照渡しにより引数として渡した変数が書き換えられるので、ここでは戻り値も不要でしょう

procedure Test(var Dic[])
 Dic = HASH_REMOVEALL
fend

実行例は以下のようになります

HASHTBL Dic1 =HASH_SORT
// 要素を10個追加
for i = 0 to 9
 Dic1[i] = i
next

print length(Dic1) // 10
Test(Dic1)
print length(Dic1) // 0 (Test関数内でDic1の全要素が削除された)

No.1539 2023/01/24(Tue) 11:51:33

Re: Funcionの参照渡しから参照戻りについて / haku
ご助言に感謝しつつコードを修正します。
No.1540 2023/01/24(Tue) 14:10:44
既に開いている複数のEXCELをコントロールしたい / haku
既に開いている複数のEXCELをコントロールしたい。
EXCELを開いた数だけComを取得したいのですが、方法はありませんか?
For I = 0 to 100
COM_ERR_IGN
Dim EXCEL = GETACTIVEOLEOBJ("Excel.Application","",I)
print EXCEL
COM_ERR_RET
next

このように回してみても、最初の1つ目のComは取得できるのですが、2番目以降が取得できません。

ご助言よろしくお願いします。

No.1537 2023/01/07(Sat) 11:16:34
XLOPENでうまくエクセルが立ち上がらない。 / sen
いつもお世話になっております。
下記のようにしてエクセルを立ち上げて使用しています。

あるときから、家のパソコンではうまくいくのですが、会社のパソコンでは、
エクセルがうまく立ち上がらなかったり、ファイル表示がうまくされなくて実行できなくなりました。
一度、ファイルを立ち上げてから、保存して閉じてから実行するとうまくいくときもあります。

自分で作成して自分で動かしている別のUWSCのプログラムでうまくエクセルが閉じていないのが
原因だと思ったりもするのですが、原因を掴めません。
何かヒントになるようなものがあれば、ご教授ください。
よろしくお願い申し上げます。

※手がかりになるようなものがなくて済みません。

dim ファイル=input("ピッキング済リスト")
Excel = XLOPEN(ファイル)

No.1533 2022/10/03(Mon) 22:34:41

Re: XLOPENでうまくエクセルが立ち上がらない。 / リキュール
会社のパソコンはuwscのPro版が入っていますが?

XLOPENのファイル名にpath名、拡張子を記載したら?

No.1535 2022/10/17(Mon) 08:18:00

Re: XLOPENでうまくエクセルが立ち上がらない。 / sen
リキュール様、ありがとうございます。
色々と調べていて、エクセルの自動保存が駄目なのではないかと気付きました。

No.1536 2022/11/13(Sun) 09:52:08
別フォルダからのファイル名変更がうまくできません。 / みみ
別フォルダからのファイル名変更がうまくできません。

ren ああ.txt Sangonomiy.txt

UWSCで上記の文をBATファイルに記述し、起動しているのですがファイル名が変更されません。手動でBATファイルを起動するか、操作する.uwsファイルが同じフォルダにある場合は正しく実行されます。
どうも別のフォルダからだと操作できないようです。
起動するときにコマンプロンプトが一瞬表示されるので、BATファイルのパスが間違っているということはありません。DOSコマンドも試してみたのですが、同じような結果になりました。


CMD = "CD " + "C:\a"
DOSCMD("a.bat")
このような方法でカレントディレクトリを移動してから起動してもうまくいきませんでした。どうすればいいでしょうか。大量のフォルダを操作するため手動というわけにはいきません。

No.1534 2022/10/16(Sun) 19:03:42
UWSCを管理者として実行しているかチェック / みく
UWSCを管理者として実行しているかチェックすることはできるでしょうか。
No.1531 2022/09/15(Thu) 00:31:29

Re: UWSCを管理者として実行しているかチェック / stuncloud
def_dll IsUserAnAdmin():bool:shell32.dll

if IsUserAnAdmin() then
 print "管理者として実行されています"
else
 print "管理者として実行されていません"
endif

No.1532 2022/09/17(Sat) 04:08:27

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

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

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

Rocket Board Type-X (Free) Rocket BBS