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

Name
Subject
Color
Cookie / Pass
水無さんのブログで公開しているスクリプトIFB GET_UWSC_NAME = "Ini.uws"の意味 NEW / せりあ
>>メイン実行時に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"の意味 NEW / トシ
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"の意味 NEW / せりあ
トシ様、返信ありがとうございます。
下記のように試してみました。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"の意味 NEW / トシ
試しに書かれた小さなコードではメリットは無いです
それが例えば便利な関数をいくつか含むuwsファイルだったら?
便利な関数だけ使いたいけど、メインの処理は動作させたくない場合だったら?

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

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

Re: 水無さんのブログで公開しているスクリプトIFB GET_UWSC_NAME = "Ini.uws"の意味 NEW / しゅん
個人的なコードを書く時のルールです。
・汎用的な機能(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"の意味 NEW / しろまさ
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
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ファイルの列を開かずに列削除 NEW / しろまさ
// パッと思いついた置換部だけ。ノーシンプル。だが速い(きっと)

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ファイルの列を開かずに列削除 NEW / sen
しろまさ様
ありがとうございます。

速い!
短い!
難しい!

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

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

Re: csvファイルの列を開かずに列削除 NEW / 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ファイルの列を開かずに列削除 NEW / しろまさ
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
IEでバックグラウンドでhtmlソースを取得する方法 / せりあ
IEでバックグラウンドでhtmlソースを取得する方法ないでしょうか?
a=IE.document.body.innerhtmlでhtmlソースの取得ができるまではわかったのですが、
IEでhtmlソースの取得するには、下記のようにしてアクセスしてます。
これだと、ウィンドウは右下に配置して他の作業のじゃまにならないようにしてるんですが、アクティブウィンドウ繰り返し、IEにとられるので作業がしにくいです。
バックグラウンドで取得できれば、他の作業のじゃまにならないので便利なのですが、良い方法ないでしょうか?

IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.visible = true
IE.navigate(URL)
a=IE.document.body.innerhtml
id1 = hndtoid(IE.hwnd)
ctrlwin(id1,close)

acw(id, 1345,720,234,92, 100)//右下に配置

//繰り返し

No.85 2018/12/15(Sat) 11:12:04

Re: IEでバックグラウンドでhtmlソースを取得する方法 / stuncloud
> IE.visible = true
ここをfalseにすればIEが非表示になりますよ

No.86 2018/12/15(Sat) 13:16:15

Re: IEでバックグラウンドでhtmlソースを取得する方法 / せりあ
stuncloud様、返信ありがとうございます。IE.visible = falseでもデータ取得できたの知らなかったです。
IE11以降、下記のように書かないとエラーになるので、下記だとIEの初期画面がたちあがって
GETACTIVEOLEOBJでつかむのでバックグラウンドでできないです。

TRY
   IE = CREATEOLEOBJ("InternetExplorer.Application")
EXCEPT
   EXEC("C:\Program Files\Internet Explorer\iexplore.exe")
   IE = GETACTIVEOLEOBJ("InternetExplorer.Application")

ENDTRY


ウィンドウズ10使ってるのでIE11からバージョンを落とすこともできないですし、困ったものです。
以前のように、IE = CREATEOLEOBJ("InternetExplorer.Application")だけでできたら便利なのに。

No.87 2018/12/15(Sat) 20:52:25

Re: IEでバックグラウンドでhtmlソースを取得する方法 / Rayna
>>87 せりあ さん
横から失礼します

IE11 で CreateOleObj 失敗したことないですが
IEを Exec して GetActiveOleObj する場合は
IEのコマンドライン引数に -embedding を付加すると Create した時と同様の状態でIEを立ち上げることができます

具体例をあげると以下のような感じです
//| Sample.uws |////////////////////////
Option Explicit
Dim IE, a
Dim URL = "h"+"ttp://example.com/"

Try
 IE = CreateOleObj("InternetExplorer.Application")
Except
 Exec("<#DBL>C:\Program Files\Internet Explorer\iexplore.exe<#DBL> -embedding")
 //| 獲得漏れ対策
 Repeat
  Com_Err_Ign
  IE = GetActiveOleObj("InternetExplorer.Application")
  Com_Err_Ret
 Until ! COM_ERR_FLG
EndTry

//| 処理等(最初から Visible=FALSE で実行されるのでバックグラウンドで実行可能)
IE.Navigate(URL)
Repeat; Until IE.readyState=4
a = IE.document.body.innerhtml
Print a
SlctBox(0, 0, "Pause", "Resume")

//| 表示させるときは普通に Visible=TRUE
IE.Visible = TRUE
SlctBox(0, 0, "Pause", "Exit")

IE.Quit()
IE = NOTHING

No.88 2018/12/15(Sat) 23:57:33

Re: IEでバックグラウンドでhtmlソースを取得する方法 / stuncloud
IEを起ち上げずにやりたいならばこういう方法もあります

url = "http://www3.rocketbbs.com/601/bbs.cgi?id=siromasa&mode=res&resto=85"

xh = createoleobj("Msxml2.XMLHTTP")
xh.open("GET", url, FALSE)
xh.send()
// source = xh.responseText // utf-8
source = decode(xh.responseBody, CODE_BYTEARRAY) // sjis
print source

素のhtmlが欲しい場合はこれで取れます
ただしjsなどで加工された後の状態のhtmlは取れません

> IEのコマンドライン引数に -embedding を付加すると Create した時と同様の状態でIEを立ち上げることができます
こんなのがあったんですね、勉強になりました

No.89 2018/12/16(Sun) 14:56:04

Re: IEでバックグラウンドでhtmlソースを取得する方法 / せりあ
Rayna様、回答ありがとうございます。
-embedding を付加するとCreate した時と同様の状態でIEを立ち上げることができるなんてすごいですね。
このような貴重な情報教えて頂きありがとうございます。
また、一歩勉強になりました。

No.90 2018/12/16(Sun) 19:23:34

Re: IEでバックグラウンドでhtmlソースを取得する方法 / せりあ
stuncloud様、回答ありがとうございます。
createoleobj("Msxml2.XMLHTTP")を使ってバッググラウンドでhtmlソース取得できました。
UWSCは、学んでも次々と新しい方法のアプローチがあるのでなかなか終わりが見えませんね。
UWSCを極めていきたいと思います。ありがとうございました。

No.91 2018/12/16(Sun) 19:38:35
WinServer 2016におけるINPUT関数のドラッグ&ドロップ不可について / Bert
WinServer2016でUWSC Proを実行し、INPUT関数で表示されるダイアログにファイルをドラッグ&ドロップした際、WinServer2012まではファイルのパスがテキストボックス内に自動入力されたのですが、2016では自動入力されなくなりました。
恐らくフレームワークやランタイム等の問題かと思ったのですが、何らかの調整で自動入力を実現させることはできませんでしょうか。

No.81 2018/11/26(Mon) 12:28:00

Re: WinServer 2016におけるINPUT関数のドラッグ&ドロップ不可について / stuncloud
UWSCを管理者として実行していた場合はExplorerも管理者として実行していないとドラッグ&ドロップできない、ということはあり得そうですがそのあたりは問題ないでしょうか?
No.82 2018/11/26(Mon) 21:11:09

Re: WinServer 2016におけるINPUT関数のドラッグ&ドロップ不可について / Bert
>stuncloudさん

ご返信誠にありがとうございます。
Windows Serverには管理者アカウントでログインし、UWSC.exeは「管理者として実行」にチェックを入れて動作させております。
念のためUWSC.exeの「管理者として実行」を外した状態でも試してみましたが、症状は改善しませんでした。
引き続き何か情報がございましたらご提供いただけますと幸いです。何とぞ宜しくお願いいたします。

No.83 2018/11/27(Tue) 10:45:38
uwscとpowershellを書くエディターでsublimeの場合 / せりあ
powershellのコード書く場合、sublimeエディターで書こうと思っているのですが、皆様は、powershellのコード書く時、どうされてますか?
sublimeエディターでビルドしてpowershellの結果を表示できたらいいのですが、
powershellをどうビルド登録するのかもわからない状態です。
powershellだとISEで書くのが無難なんですかね。

No.78 2018/11/25(Sun) 21:51:32

Re: uwscとpowershellを書くエディターでsublimeの場合 / stuncloud
PowerShellでしたらVisual Studio Code(VSCode)が一番だと断言していいですね
PowerShell拡張機能を追加するだけで環境が整います、そしてIntelliSenseでゴリゴリ書けます
VSCode内でPowerShellも使えるんですか、それがエディタと連動というか同一空間にあるというか、ちょっとうまく説明できないんですけどまあ便利なわけです

Sublime Textでもそれなりの環境はできますが、VSCodeと比べるとかなり劣ります
REPLもいまいちですしね
UWSCはこっちで書いてるのでエディタは常時VSCodeとST3の両方を開いてます
(VSCode向けUWSC拡張を以前作り始めて頓挫したままなんですが、それができてればVSCodeで統一も可能だったんですけど…時間とやる気が確保できず)

ISEは標準インストールという点以外は論外ですね…僕はあれ苦手です

No.79 2018/11/26(Mon) 10:47:43

Re: uwscとpowershellを書くエディターでsublimeの場合 / せりあ
stuncloud様、返信ありがとうございます。なんでもかんでも、サブライムエディターでしようと考えてしまってました。

> PowerShellでしたらVisual Studio Code(VSCode)が一番だと断言していいですね

Visual Studio Code(VSCode)ダウンロードしてみようと思います。ありがとうございます。

No.80 2018/11/26(Mon) 11:07:13
pythonとuwscについて / どか
uwscでできることは、pythonでもできるんでしょうか?
なぜ、uwscはメジャーな言語として名前があがってこないのでしょうか?

No.72 2018/11/20(Tue) 22:20:37

Re: pythonとuwscについて / stuncloud
> uwscでできることは、pythonでもできるんでしょうか?
できるかできないかであれば、できます
ただ、やりたいことによってUWSCでは簡単なことがpythonだと手間が掛かったり難しかったりすることもあるでしょうし、逆にUWSCでは難しかったことがpythonでは簡単にこなせるということもあるでしょう
pythonでUWSCと同じことがしたいのであれば、必要なのはpythonで実装しきってやるぞ!というやる気だけです
ちなみに僕ならUWSCでできることにはUWSCを使います

> なぜ、uwscはメジャーな言語として名前があがってこないのでしょうか?
単純に利用者が少ないからじゃないでしょうか
あとちょっとプログラム言語と呼ぶにははばかられる部分があるというか…?
UWSCはあくまで操作の記録・再生ツールでスクリプトを書くことがその手段の一つってだけですからね
仕様的には割となんだって書けちゃうんですけど

No.75 2018/11/21(Wed) 14:29:36

Re: pythonとuwscについて / どか
stuncloud様、返信ありがとうございます。
uwscに出会い、UWSCで色々な自動化ツールを作成してきました。
UWSCってなんでもwindowsの操作ならできるのに、世間はpythonでにぎわっています。pythonは何がそんなに優れているのか分からず、uwscはどういう面でpythonに劣っているのでしょうか?

また、windowsかlinuxどちらがいいのか?って論争も、プログラミングをするならlinuxってけっこう聞きます。
これってバックエンドエンジニアならlinux、フロントエンジニアを目指すならwindowsでいいのかなって思っています。
UWSCはwindowsでしか使えないっていうのもありますので、linuxに移行するのも躊躇してます。

みなさんは、linux派、それともwindows派ですか?

No.76 2018/11/21(Wed) 18:38:50

Re: pythonとuwscについて / satocha
> みなさんは、linux派、それともwindows派ですか?
普段、私物のノートPCで使っているのはLinux(fedora28 mateデスクトップ)です。仕事場はWindows環境なので開発のほとんどはWindowsです。

> UWSCはwindowsでしか使えないっていうのもありますので、linuxに移行するのも躊躇してます。

それはそうですけど、WineではUWSCが普通に動きます。X-Windowアプリの制御はできませんが、linux上のwindows(wine)アプリは制御できます。今はwineの互換性が相当高くなってきて、linux上でWindowsデスクトップアプリを動かすのはそれほど難しくなくなってきました。

一方、少し前までwindowsでlinuxというかunix由来のツールを使うにはサードパーティーによるcygwin(mingw)か、MS製ではあるものの情報の乏しいSFUを使うしかありませんでしたが、現在windows10はMSの正式サポートによりLinux各種ディストリが配布されています。windows標準shellであるpowershellもLinuxで実用的に使えるレベルです。

windowsとlinuxの敷居はわずか数年前より格段に下がっています。普段遣いのOSがどちらであっても、他方を手軽に学べる時代になりました。

> これってバックエンドエンジニアならlinux、フロントエンジニアを目指すならwindowsでいいのかなって思っています。

linuxサーバに手元のwindowsPCでアクセスするみたいなイメージでしょうか。

でも、今どきのフロントエンド、バックエンドは実OSの上で動くサーバサイド、OSはなんであれ、ユーザ端末(PCですらないことも多い)のブラウザで動くクライアントサイドという区分けになるんじゃないでしょうか。

そうなると、サーバサイドでもクライアントサイドでも必要となるjavascriptは押さえておく必要があると思います。

No.77 2018/11/21(Wed) 21:18:03
UWSC.INIをプログラムと同じフォルダに移せませんか? / sen
いつもお世話になっております。

usbメモリーにプログラムをインストールして、別のパソコンでも即座にuwscを使いたい希望があります。
ランチメニューを多用していますが、C:\Users\○○○\AppData\Roaming\UWSC以下のiniファイルをソフトと同じファイルに移動できれば助かります。

いかがでしょうか?

No.65 2018/11/18(Sun) 01:06:08

Re: UWSC.INIをプログラムと同じフォルダに移せませんか? / satocha
開発者さんと連絡が取れなくなって久しいので、自分で何とかするしかありません。

そこで、インストーラーでインストールするような一般的なWindowsアプリを、USBメモリなどから起動できるポータブルアプリに変えてくれるcameyo.exeを試してみました。
https://www.cameyo.com/downloads/

フリーのUWSCはzip配布で、インストーラー方式ではないので、そのままではcameyoでインストールを認識できませんが、次のような手順で、なんちゃってインストールすることでcameyoにポータブルUWSCを作らせることができました。

1)いったん、c:\users\●●●\appdata\roaming\uwscをどこか別の場所に移動(コピーではなく)しておく。

2)cameyoを起動し、「capture an installation」を選んで「OK」

3)右下に最初、インストール前の情報を収集している旨の表示が英語で出るのを確認し、「情報収集が終わったのでインストールしてね」(英語)表示に変わるのを待つ。数分はかかる。

4)UWSC実行ファイルをプログラムフォルダにコピー(要管理者権限)。
※ プログラムフォルダ=c:\Program Files\ 32ビットOS
  c:\Program Files(X86)\ 64ビットOS

5)1)で退避したフォルダを元に戻す。

6)c:\users\●●●\appdata\roaming\microsoft\windows\Start Menuフォルダに、4)でコピーしたUWSC実行ファイルへのショートカットを生成する。

7)cameyo右下のダイヤログに出ている「Install Done」のボタンを押す。

8)数分以上かかって、自分のドキュメントフォルダの下にcameyo appsフォルダが生成され、その中にuwsc.cameyo.exeという実行ファイルができているのでUSBメモリに移す。

9)4)、6)のファイル・フォルダを消す。もともとあった1)のフォルダも不要。

※問題点1
この方法でできたuwsc.cameyo.exeは内部にuwsc.log、uwsc.iniの2ファイルを含んでいます。逆に言えばメモ帳などでその中身を見ることはできません。編集するにはUWSCの機能を使うしかありません。

※問題点2
この方法でできたUSBメモリを配布してしまうと、おそらくライセンス違反になります。1つだけ持ち歩いて使えばたぶん大丈夫です。

No.66 2018/11/18(Sun) 08:19:50

Re: UWSC.INIをプログラムと同じフォルダに移せませんか? / sen
ありがとうございます。
まだ、uwscの事を聞ける熱い掲示板が生きていて、ほんとに嬉しいです。

こんな難しい事を聞いてしまったんですか?
これはこれで助かります。挑戦したいと思います。
ありがとうございます。

言葉足らずで済みません。
使用するパソコンが頻繁に変わる訳ではないのです。
会社のパソコンで仕事にuwscをガッチリ使用しているのですが、
数年に一度リース期間が過ぎると突然パソコンが交換になるのです。
多少、日にちをもらえるのですが、苦痛で不安なんです。
ハードディスクが壊れたときも、UWSC.INIをバックアップしてなくて
散々な目にあいました。すべて自分が悪いのですが。(^_^)

それでuwsc本体をusbメモリーにインストールして、かつ
UWSC.INI等を本体と同じフォルダに置き、それを読み込めれば、
usbメモリーを差し替えるだけで、交換完了できるのにという事です。

無理でしょうか?
ご教授頂けましたら、助かります。

No.67 2018/11/18(Sun) 09:47:17

Re: UWSC.INIをプログラムと同じフォルダに移せませんか? / satocha
> それでuwsc本体をusbメモリーにインストールして、かつ
> UWSC.INI等を本体と同じフォルダに置き、それを読み込めれば、
> usbメモリーを差し替えるだけで、交換完了できるのにという事です。
> 無理でしょうか?

UWSCはユーザーの%apdata%フォルダ\uwsc\以下にiniファイルとログファイルを生成・格納します。うんと古いバージョンでは実行ファイルと同じフォルダだったような気がしますが、今では入手できないと思います。

なので、ご要望のことを実現するには、UWSCの作者にお願いするしかありません。ここで質問されているなら、それが困難であることはお分かりだと思います。UWSCはソースが公開されていないので、誰かほかの人に頼むことはできません。逆アセンブルなどで解析することは技術的には可能(簡単ではない)ですが、ライセンス違反です。

そこでどうするかといえば、uwscの実行ファイル(uwsc.exe)がiniファイルやログファイルにアクセスする際、それぞれのファイルパスをだましてしまえばいいということになります。どうやってだますかというと、アプリケーション仮想化という手法(wikipediaで見てください)を使うのですが、細かいことは置いておいて、先にあげたcameyoというフリーツールを使えばそのようなことができてしまう、ということなのです。

ですので、まずは先の手順を試してみてください。

これとは別のアプローチも考えられます。uwscを起動するたび、usbメモリ上のiniファイルなどをPCの%APPDATA%\uwscに転送し、uwscのプロセスが終了したらusbメモリに書き戻す方法です。具体的には、バッチやpowershellスクリプト、wshなどで機能するプログラムを作ることになります。ただこの場合、一時的にPC側に履歴が残ること、それに伴いハングアップなどで不整合が起きる可能性があるなどの問題があります。

No.68 2018/11/18(Sun) 11:22:49

Re: UWSC.INIをプログラムと同じフォルダに移せませんか? / satocha
以下に補足。
>うんと古いバージョンでは実行ファイルと同じフォルダだったような気がしますが、今では入手できないと思います。

公式サイトのhttp://www.uwsc.info/history.htmlを確認したところ、「2014/05/12 ver5.0.0」の項に「INI/LOGファイルの場所を %APPDATA%下に固定した」とあります。ですので、それ以前のものをinternetアーカイブなどから拾ってくれば使えるかもしれません。

No.69 2018/11/18(Sun) 11:28:55

Re: UWSC.INIをプログラムと同じフォルダに移せませんか? / satocha
持ち歩かず、iniファイルをUSBにバックアップするだけなら次のスクリプトをusb上のuwsc.exeと同じフォルダに保存(仮にIniBackUp.uwsとします)。次に、uwscの設定から「スケジュール設定」でそのスクリプトを指定し、タイマーに「起動時」を設定してください。
以降、uwscを起動するたび、usbメモリのuwscフォルダの下「iniHistory」フォルダにappdataのuwsc.iniを調べ、もしそれがusbのiniファイルより新しければ、ファイル名にタイムスタンプを付加した「uwscyyyymmdd_hhnn.ini」ファイルとしてバックアップします。(最新のものはタイムスタンプなしの「uwsc.ini」)

---------------------IniBackUp.uws
//定数・変数
public  fso  =createoleobj( "Scripting.FileSystemObject" )
const  iniHistory="iniHistory"
public  iniHistory_Path=fso.buildpath( get_uwsc_dir, iniHistory )
const  usbIni  =fso.buildpath( iniHistory_Path, "uwsc.ini" )
const  appIni  =fso.buildpath( fso.buildpath( get_appdata_dir, "uwsc") , "uwsc.ini" )
//フォルダ準備
found=false
for dir in getdir(get_uwsc_dir, "\")
  if dir = iniHistory
    found  =true
    break
  endif
next
if !found
  fso.createFolder( iniHistory_Path )
endif

if !fso.fileExists( usbIni )
  fso.CopyFIle( appIni, usbIni )
endif

if getFileTime( appIni ) > getFileTime( usbIni )
  save( usbIni )
  fso.CopyFIle( appIni, usbIni )
endif

function  getFileTime( path )
  result=fso.getfile( path ).datelastmodified
fend
procedure  save( path )
  timestr  =getFileTime( path )
  timestr  =replace( timestr, " ", "_" )
  timestr  =replace( timestr, ":", "" )
  timestr  =replace( timestr, "/", "" )
  backup  =fso.BuildPath( iniHistory, timestr + ".ini" )
  fso.CopyFIle( path, backup )
fend

No.70 2018/11/18(Sun) 13:07:49

Re: UWSC.INIをプログラムと同じフォルダに移せませんか? / sen
丁寧な説明、ありがとうございます。
どちらのパターンも私の使い方にピッタリです。

みなさんがいる限り、バージョンはそのままでもUWSCは発展すると思います。
これで、安心して仕事に使い続けれます。

No.71 2018/11/18(Sun) 22:19:12
UWSCでWebDriverを扱うモジュール書き始めました / stuncloud
Selenium等を介さないでブラウザを操作したいという欲求をようやく形にし始められました
UWSCでのブラウザ操作はこれさえあればいい、くらいにはしていきたいです
今はまだ機能が貧弱ですが、おいおい機能追加していきます

https://github.com/stuncloud/UwscWebDriver

No.36 2018/10/25(Thu) 18:04:28

Re: UWSCでWebDriverを扱うモジュール書き始めました / yanyan
IE以外のブラウザ操作では苦労しており、テキスト取り出し等を一部UWSC以外を併用しています。大変でしょうが、是非ともIE並みの操作機能強化の実現に期待しています。よろしくお願いします。
No.37 2018/10/25(Thu) 20:25:47

Re: UWSCでWebDriverを扱うモジュール書き始めました / satocha
素晴らしい。
300行足らずでこんなことができるとは。
ソースを眺めただけですが、ぜひ実際に使ってみます。

No.41 2018/10/28(Sun) 10:45:05

Re: UWSCでWebDriverを扱うモジュール書き始めました / stuncloud
driverやelementがオブジェクトになっててそれらのメソッドで操作できたら便利だよなーと思い立って、webdriverobjectというブランチでそれっぽいのを作ってみました
こんな感じで実行できます

call UwscWebDriver.uws

// webdriverオブジェクトを得る
driver = WebDriver.Start(WebDriver.Chrome)

// この掲示板を開く
driver.Navigate("http://www3.rocketbbs.com/601/siromasa.html")

// Colorのラジオボタン群を得る
radios = driver.FindElements("input[name=<#DBL>color<#DBL>]")

// 選択されているラジオボタンの値を得る
for radio in radios
 if radio.IsSelected()
  value = radio.GetValue()
  break
 endif
next
msgbox("選択されてる色は" + value + "です")

// ブラウザを閉じて終了
driver.Close()


実装の大半がJScriptになってしまうのが難点ですが、使い勝手は向上してる感じがするのでこっちの方向でやっていこうかな

No.51 2018/11/07(Wed) 18:19:08

Re: UWSCでWebDriverを扱うモジュール書き始めました / yanyan
作成ありがとうございます。
使い方の例示がありましたので、早速Chomeで試しました。しかし、driver.Navigateで
COM Error:Could not convert varient of type(OleStr)into type(Dispatch)
が発生しました。また、edgeでも確認しましたが、同様にブラウザは起動しますが、指定ページにnavigateできませんでした。ご教授をお願いします、
ブラウザ、webdriverは最新のものを使用しています。

No.52 2018/11/08(Thu) 08:23:27

Re: UWSCでWebDriverを扱うモジュール書き始めました / stuncloud
yanyanさん、そのとき指定したURLを教えてください
No.53 2018/11/08(Thu) 09:28:12

Re: UWSCでWebDriverを扱うモジュール書き始めました / yanyan
> yanyanさん、そのとき指定したURLを教えてください
例示にあったこの掲示板です。
直接指定では、開けることを確認しています。よろしくお願いします。
なお、UWSCはデバッガで実行しています。

// この掲示板を開く
driver.Navigate("http://www3.rocketbbs.com/601/siromasa.html")

No.54 2018/11/08(Thu) 14:31:39

Re: UWSCでWebDriverを扱うモジュール書き始めました / stuncloud
> COM Error:Could not convert varient of type(OleStr)into type(Dispatch)
なので driver に文字列が入ってるんじゃないかと思います
print driver
でなんと表示されるか教えてください

こちらではChromeは問題なく動きます (Windows10 1809)
EdgeはWebDriver.Startの時点でMicrosoftWebDriver.exeが落ちるという現象が発生していて頭を悩ませてます
ただ、そちらとは別現象だと思われるので解決すべき問題が増えたということに…

No.55 2018/11/08(Thu) 17:44:15

Re: UWSCでWebDriverを扱うモジュール書き始めました / yanyan
お手数をお掛けし申し訳ありません。こちらは win10pro 1809です。

print "1:"+ driver など挿入しても何も出力されない(実行もしていない模様)ため、それ以前のcall UwscWebDriver.uwsでのエラーのようです。
JAVAの内容を理解できていませんが、コマンド窓に[17248:11736:1108/201624.636:ERROR:network_change_notifier_win.cc(157)] WSALookupServiceBegin failed with: 8 が表示されています。
WebDriver,jsonパーサは、同じホルダにいれてありますが、他に設定、注意点があるのでしょうか? よろしくお願い致します。

No.56 2018/11/08(Thu) 20:44:50

Re: UWSCでWebDriverを扱うモジュール書き始めました / stuncloud
> 他に設定、注意点があるのでしょうか?
そういう感じではないですね
Msxml2.XMLHTTPが意味不明なエラーを返してきてちょっと対処できないです
別のOSで試してだめなようならしばらく諦めてください…

No.57 2018/11/09(Fri) 11:50:17

Re: UWSCでWebDriverを扱うモジュール書き始めました / stuncloud
EdgeのWebDriverの導入方法を変更し、OS標準のものを使うようにしました
一応これで動くようにはなったのですが、ChromeのWebDriverとは命令の書き方が違うようでエレメントの取得ができません
現時点で情報が見つかってないのでこれは動かないままです
つまりEdgeでは実質使えません
Edge対応はかなり手を入れないといけなさそうです
Firefoxに関しては一度も触ってないので未知数です
個人敵にはChromeで動けばいいので先ずChromeに対応していく方針です

あと、今後UwscWebDriverに関する質問やバグががあった場合は
https://github.com/stuncloud/UwscWebDriver/issues
に投稿してください

// URLがリンクにならないの不便ですね…

No.58 2018/11/09(Fri) 16:24:48

Re: UWSCでWebDriverを扱うモジュール書き始めました / しろまさ
> // URLがリンクにならないの不便ですね…
設定あったので変更しました。

> あと、今後UwscWebDriverに関する質問やバグががあった場合は
個人的にはここでいいと思います。とても勉強になりますし。

No.59 2018/11/10(Sat) 21:58:21

Re: UWSCでWebDriverを扱うモジュール書き始めました / stuncloud
> 設定あったので変更しました。
ありがとうございます!

> 個人的にはここでいいと思います。とても勉強になりますし。
わかりました

No.60 2018/11/12(Mon) 09:49:08

Re: UWSCでWebDriverを扱うモジュール書き始めました / stuncloud
PowerShellからSeleniumを使って、その際WebDriverがどんなリクエストを受けてるか調べる方法がわかったのでどうにかEdgeにも対応できそうです
No.61 2018/11/12(Mon) 19:30:37

Re: UWSCでWebDriverを扱うモジュール書き始めました / stuncloud
動くようになりました
webdriverobjectブランチはmasterにマージしました
今後はmasterを追っていただいたので大丈夫です

yanyanさん
もともとChromeも動かないという話だったんですが、ちょっとそっちは原因がわからないので対応できてません
最新版を試していただきそれでも現象が発生しているようであれば、以下を実行してprint結果を教えていただけますでしょうか

try
 driver = WebDriver.Start(WebDriver.Chrome)
 driver.Navigate(URL)
finally
 print WebDriver.GetError()
 for log in WebDriver.GetLog()
  with log
   print "api: " + .api
   print "body: " + .body
   print "status: " + .status
   print "statusText: " + .statusText
   print "response: " + .response
   print
  endwith
 next
endtry

No.63 2018/11/14(Wed) 11:49:17

Re: UWSCでWebDriverを扱うモジュール書き始めました / yanyan
webdriverを最新版(master)に更新したら、chromeが動くようになりました。
感謝、感謝です。少しずつ貴方式に移植していきます。ありがとうございました。

No.64 2018/11/15(Thu) 13:25:23
UWSCを使用したDocuWorksのAPI操作について / みつ
UWSC掲示板に投稿しようとしたところ、閲覧専用とっていた為、調べていたらじゅんさんのブログから仮掲示板に辿り着くことができました。
しろまささんありがとうございます。

早速ですが、DocuWorksをDocuWorks APIを使用しで動かしたいのですが、以下のVBAのコードをUWSCで置換えとか可能でしょうか?

DEF_DLLを使用すると思うのですが、自分がDLL呼び出しが分かっていない為、また、DEF_DLL DocuWorksで検索しても何もヒットしなかった為、質問させて頂きました。

そもそもDocuWorks API をUWSCで使用できるのでしょうか?

先生方よろしくお願い致します。



以下NETで拾いました。

Dドライブ直下にある、test001.xdwの1ページ目に、幅20cm、高さ1cmの付箋を貼り付けます。

その付箋を親として、子のテキストアノテーションを貼り付け、内容文字列を「漢字ひらがなabc」とし、フォントサイズを21.6pt、フォントカラーを赤、背景色を無しに設定します。

もちろん、親子関係を固定しないといけないので、XDW_StarchAnnotation関数で、固定します。




VBA内容
文字が入力された付箋アノテーションを作成するサンプルスクリプト

Option Explicit

'動作環境 WindowsXP Excel2002 DocuWorks6.2

'2.34 XDW_GetDocumentInformation DocuWorksファイル全体に関わる情報を得る。
Private Declare Function XDW_GetDocumentInformation Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByRef pDocumentInfo As XDW_DOCUMENT_INFO) As Long
Private Type XDW_DOCUMENT_INFO
nSize As Long '構造体XDW_DOCUMENT_INFOのバイト数を設定する。
nPages As Long '総ページ数。
nVersion As Long 'DocuWorksファイルのファイルフォーマットのバージョン。
nOriginalData As Long 'オリジナルデータの数。
nDocType As Long 'ファイルの種類。
nPermission As Long '認可情報。
nShowAnnotations As Long 'アノテーションの表示状態。
nDocuments As Long 'nDocTypeがバインダーである場合はバインダーの内部DocuWorks文書数を示す。
nBinderColor As Long 'nDocTypeがバインダーである場合はバインダーの色を示す。
nBinderSize As Long 'nDocTypeがバインダーである場合はバインダーのサイズを示す。
End Type

'2.6 XDW_CloseDocumentHandle DocuWorksファイルにアクセスするためのハンドルを解放する。
Private Declare Function XDW_CloseDocumentHandle Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByVal reserved As String) As Long

'2.64 XDW_OpenDocumentHandle DocuWorksファイルにアクセスするためのハンドルを得る。この場合だけ、pHandleはByRefで定義
Private Declare Function XDW_OpenDocumentHandle Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal lpszFilePath As String, ByRef pHandle As Long, ByRef pMode As XDW_OPEN_MODE) As Long
Private Type XDW_OPEN_MODE
nSize As Long
nOption As Long
End Type

'2.73 XDW_SaveDocument 変更を DocuWorks ファイルに反映させる。
Private Declare Function XDW_SaveDocument Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByVal reserved As String) As Long

'2.1 XDW_AddAnnotation アノテーションを貼り付ける
Private Declare Function XDW_AddAnnotation Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" _
(ByVal handle As Long, ByVal nAnnotationType As Long, ByVal nPage As Long, ByVal nHorPos As Long, ByVal nVerPos As Long, ByRef pInitialData As XDW_AA_FUSEN_INITIAL_DATA, ByRef phNewAnnotation As Long, ByVal reserved As String) As Long

'2.2 XDW_AddAnnotationOnParentAnnotation '親アノテーションにアノテーションを貼り付ける
'テキスト、リンク、日付印アノテーションの場合
Private Declare Function XDW_T_AddAnnotationOnParentAnnotation Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" Alias "XDW_AddAnnotationOnParentAnnotation" _
(ByVal handle As Long, ByVal hAnnotation As Long, ByVal nAnnotationType As Long, ByVal nHorPos As Long, ByVal nVerPos As Long, ByVal pInitialData As String, ByRef phNewAnnotation As Long, ByVal reserved As String) As Long

'XDW_AddAnnotation用の構造体定義
Private Type XDW_AA_INITIAL_DATA
nSize As Long '構造体のバイト数。
nAnnotationType As Long 'アノテーションの種類。
nReserved1 As Long '予約メンバ。0でなければならない。
nReserved2 As Long '予約メンバ。0でなければならない。
End Type

Private Type XDW_AA_FUSEN_INITIAL_DATA
' common As Long '共通情報。構造体のバイト数とアノテーションの種類を指定する。
common As XDW_AA_INITIAL_DATA '共通情報。構造体のバイト数とアノテーションの種類を指定する。
nWidth As Long '付箋アノテーションの幅。単位は1/100mm。
nHeight As Long '付箋アノテーションの高さ。単位は1/100mm。
End Type

'2.74 XDW_SetAnnotationAttribute 指定したアノテーションの属性を設定する。
'テキスト、リンク、日付印アノテーションの場合
Private Declare Function XDW_S_SetAnnotationAttribute Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" Alias "XDW_SetAnnotationAttribute" _
(ByVal handle As Long, ByVal hAnnotation As Long, ByVal lpszAttributeName As String, ByVal nAttributeType As Long, ByVal pAttributeValue As String, ByVal nReserved As Long, ByVal pReserved As String) As Long
'上記以外のアノテーションの場合
Private Declare Function XDW_L_SetAnnotationAttribute Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" Alias "XDW_SetAnnotationAttribute" _
(ByVal handle As Long, ByVal hAnnotation As Long, ByVal lpszAttributeName As String, ByVal nAttributeType As Long, ByRef pAttributeValue As Long, ByVal nReserved As Long, ByVal pReserved As String) As Long

'2.86 XDW_StarchAnnotation 指定されたアノテーションを固定する、もしくは解除する
Private Declare Function XDW_StarchAnnotation Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByVal hAnnotation As Long, ByVal nStarch As Long, ByVal reserved As String) As Long

Private Enum XDW_AID 'アノテーションの種類
XDW_AID_TEXT = 32785
XDW_AID_FUSEN = 32794
XDW_AID_STRAIGHTLINE = 32828
XDW_AID_RECTANGLE = 32829
XDW_AID_ARC = 32830
XDW_AID_LINK = 49199
XDW_AID_BITMAP = 32831
XDW_AID_STAMP = 32819
XDW_AID_MARKER = 32795
XDW_AID_POLYGON = 32834
End Enum

Private Enum XDW_Color 'カラーの種類(16進数を10進数に変換)
XDW_COLOR_NONE = CLng("&H" & "010101")
XDW_COLOR_BLACK = CLng("&H" & "000000")
XDW_COLOR_MAROON = CLng("&H" & "000080")
XDW_COLOR_GREEN = CLng("&H" & "008000")
XDW_COLOR_OLIVE = CLng("&H" & "008080")
XDW_COLOR_NAVY = CLng("&H" & "800000")
XDW_COLOR_PURPLE = CLng("&H" & "800080")
XDW_COLOR_TEAL = CLng("&H" & "808000")
XDW_COLOR_GRAY = CLng("&H" & "808080")
XDW_COLOR_SILVER = CLng("&H" & "C0C0C0")
XDW_COLOR_RED = CLng("&H" & "0000FF")
XDW_COLOR_LIME = CLng("&H" & "00FF00")
XDW_COLOR_YELLOW = CLng("&H" & "00FFFF")
XDW_COLOR_BLUE = CLng("&H" & "FF0000")
XDW_COLOR_FUCHIA = CLng("&H" & "FF00FF")
XDW_COLOR_WHITE = CLng("&H" & "FFFFFF")
XDW_COLOR_FUSEN_RED = CLng("&H" & "FFC2FF")
XDW_COLOR_FUSEN_BLUE = CLng("&H" & "FFBF9D")
XDW_COLOR_FUSEN_YELLOW = CLng("&H" & "64FFFF")
XDW_COLOR_FUSEN_LIME = CLng("&H" & "C2FF9D")
End Enum

Private Enum XDW_STARCH_def 'アノテーションの固定もしくは解除を指定
XDW_STARCH = 1
XDW_STARCH_OFF = 0
End Enum

Private Const XDW_ATN_Text = "%Text"
Private Const XDW_ATN_FontName = "%FontName"
Private Const XDW_ATN_FontSize = "%FontSize"
Private Const XDW_ATN_FontStyle = "%FontStyle"
Private Const XDW_ATN_FontPitchAndFamily = "%FontPitchAndFamily"
Private Const XDW_ATN_ForeColor = "%ForeColor"
Private Const XDW_ATN_BackColor = "%BackColor"

Sub AddAnnotation_Fusen()
'ふせんを作成し、そのふせんを親にしてテキストアノテーションを貼り付ける。2011/4/6作成
Dim strFileName1 As String 'ファイル名

'Docworksを使うための前処理(ここから)
Dim lngHandle, lngHandleAnnotation, lngHandleChildAnnotation As Long
Dim myMode As XDW_OPEN_MODE
Dim myInfo As XDW_DOCUMENT_INFO

With myMode 'XDW_OpenDocumentHandleを実行する際のmyModeに値を設定
.nOption = 1
' #define XDW_OPEN_READONLY 0
' #define XDW_OPEN_UPDATE 1

.nSize = LenB(myMode)
End With

With myInfo 'XDW_GetDocumentInformationを実行する際のmyInfoに値を設定
.nSize = LenB(myInfo)
End With

'Docworksを使うための前処理(ここまで)

strFileName1 = "D:\test001.xdw"

'DocuWorksファイルにアクセスするためのハンドルを得る。関数が正常に終了したら0を返す。異常終了したときは、エラーコードを返す。
XDW_OpenDocumentHandle strFileName1, lngHandle, myMode

'DocuWorksファイル全体に関わる情報を得る。
XDW_GetDocumentInformation lngHandle, myInfo

'===1.アノテーションを貼り付ける。===
Dim myXDW_AID As XDW_AID '貼り付けるアノテーションの種類
Dim myXDW_ATN As String 'アノテーションの属性名
Dim lngPage, lngHorPos, lngVerPos As Long 'アノテーションを貼るページ、アノテーションのx座標、y座標(単位は1/100mm)
Dim myAaInitialData As XDW_AA_INITIAL_DATA
Dim myAaFusenInitialData As XDW_AA_FUSEN_INITIAL_DATA

myXDW_AID = XDW_AID_FUSEN '貼り付けるアノテーションの種類を指定。
lngPage = 1 '1ページ目に貼り付ける
lngHorPos = 1000 '10cm
lngVerPos = 1000 '10cm

With myAaInitialData
.nAnnotationType = 32794 'アノテーションの種類。
.nReserved1 = 0 '予約メンバ。0でなければならない。
.nReserved2 = 0 '予約メンバ。0でなければならない。
End With

With myAaFusenInitialData '付箋用の構造体XDW_AA_FUSEN_INITIAL_DATAに値を設定
.common = myAaInitialData '共通情報。構造体のバイト数とアノテーションの種類を指定する。
.nWidth = 20000 '付箋アノテーションの幅。単位は1/100mm。最小値: 500(=5mm)、最大値: 50000(=50cm)
.nHeight = 1000 '付箋アノテーションの高さ。単位は1/100mm。最小値: 500(=5mm)、最大値: 50000(=50cm)
End With

myAaFusenInitialData.common.nSize = LenB(myAaFusenInitialData) '構造体のバイト数。

'ふせんアノテーションを貼り付ける
XDW_AddAnnotation lngHandle, myXDW_AID, lngPage, lngHorPos, lngVerPos, myAaFusenInitialData, lngHandleAnnotation, vbNullString

'===2.親アノテーションにテキストアノテーションを貼り付ける===
myXDW_AID = XDW_AID_TEXT
lngHorPos = 500 '横位置5cm
lngVerPos = 20 '縦位置0.2cm
'ふせんアノテーションにテキストアノテーションを貼り付ける
XDW_T_AddAnnotationOnParentAnnotation lngHandle, lngHandleAnnotation, myXDW_AID, lngHorPos, lngVerPos, vbNullString, lngHandleChildAnnotation, vbNullString

'===3.アノテーションを固定する===
Dim mySTARCH As XDW_STARCH_def
mySTARCH = XDW_STARCH '固定
'ふせんアノテーションに貼り付けたテキストアノテーションを固定する。
XDW_StarchAnnotation lngHandle, lngHandleChildAnnotation, mySTARCH, vbNullString

'===4.アノテーションの属性を設定する。===
Dim myXDW_ATN_Color As XDW_Color
Dim strTxt, strAttributeName As String
Dim lngFValue As Long

'ふせんに貼り付けたテキストアノテーションの属性を設定する。
myXDW_ATN = XDW_ATN_Text
strTxt = "漢字ひらがなabc" '内容文字列の設定
XDW_S_SetAnnotationAttribute lngHandle, lngHandleChildAnnotation, myXDW_ATN, 1, strTxt, 0, vbNullString

myXDW_ATN = XDW_ATN_FontSize 'フォントサイズを設定
lngFValue = 216 '21.6pt
XDW_L_SetAnnotationAttribute lngHandle, lngHandleChildAnnotation, myXDW_ATN, 0, lngFValue, 0, vbNullString

myXDW_ATN = XDW_ATN_ForeColor 'フォントカラーを設定
lngFValue = 255 'red
XDW_L_SetAnnotationAttribute lngHandle, lngHandleChildAnnotation, myXDW_ATN, 0, lngFValue, 0, vbNullString

myXDW_ATN = XDW_ATN_FontStyle 'フォントスタイルを設定
lngFValue = 2 'XDW_FS_BOLD_FLAG
XDW_L_SetAnnotationAttribute lngHandle, lngHandleChildAnnotation, myXDW_ATN, 0, lngFValue, 0, vbNullString

myXDW_ATN = XDW_ATN_FontName 'フォントフェイス名を設定
strTxt = "MS P明朝"
XDW_S_SetAnnotationAttribute lngHandle, lngHandleChildAnnotation, myXDW_ATN, 1, strTxt, 0, vbNullString

myXDW_ATN = XDW_ATN_BackColor '背景色を設定
myXDW_ATN_Color = XDW_COLOR_NONE
XDW_L_SetAnnotationAttribute lngHandle, lngHandleChildAnnotation, myXDW_ATN, 0, myXDW_ATN_Color, 0, vbNullString

'変更を DocuWorks ファイルに反映させる。関数が正常に終了したら0を返す。異常終了したときは、エラーコードを返す。
XDW_SaveDocument lngHandle, vbNullString

'DocuWorksファイルにアクセスするためのハンドルを解放する。関数が正常に終了したら0を返す。異常終了したときは、エラーコードを返す。
XDW_CloseDocumentHandle lngHandle, vbNullString

End Sub



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

No.38 2018/10/27(Sat) 21:26:54

Re: UWSCを使用したDocuWorksのAPI操作について / stuncloud
VBA→UWSCは実はめちゃくちゃ簡単、というのもほぼ同じような感じに書けるので、コツを覚えるといろいろなVBAコードがUWSC用のサンプルとして使えるようになるのでやってみるのに損はないですよ
ちなみにDeclareって書いてる部分がUWSCでいうdef_dllになります

>Private Declare Function XDW_GetDocumentInformation Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByRef pDocumentInfo As XDW_DOCUMENT_INFO) As Long
なら
def_dll XDW_GetDocumentInformation(long, var long[]):Long:D:xdwapi.dll
となります
※ xdwapi.dllがスクリプトと同じフォルダにある場合
構造体は本来{}で書くんですが、より簡潔に書くために配列にしています
構造体を{}ではなく配列で定義することの詳細やメリットについてはしゅんさんのブログを参照してください

dll関数の呼び出しは
dim XDW_DOCUMENT_INFO[8] //構造体
XDW_DOCUMENT_INFO[0] = 36

XDW_GetDocumentInformation(handle, XDW_DOCUMENT_INFO)

みたいな感じです
このコードは大部分がdll関数、構造体や定数の定義で実際の処理部分はそんなにないですし、難しい部分もなさそうです
VBAの関数の呼び出し方がUWSCと違って()がないところ以外はほぼそのままですから、元のコードをよく見ながら移植してみてください

# いやぁ、スマホから書き込むの大変ですね…

No.39 2018/10/28(Sun) 02:17:30

Re: UWSCを使用したDocuWorksのAPI操作について / みつ
stuncloud 様

返信ありがとうございます。

この数日間、VBAと教えて頂いた内容とを見比べながら
DocuWorks API を調べて何とか動かそうと考えていましたが、
コツが分からず上手く動かすことができませんでした。

例えば、dllを C:\Windows\system\xdwapi.dll に入れて、C:\DOCU\TEST.xdw のファイルを操作する場合に、

@ C:\DOCU\TEST.xdw をオープンし、
A TEST.xdw に付箋で ABC と記入し
B ABC を赤色に変更し
C 保存して閉じる

といった場合の書き方が分かりません。

無理を言って恐縮ですが、部分部分でも良いので何とかご教授頂けないでしょうか。

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

No.44 2018/11/01(Thu) 21:52:58

Re: UWSCを使用したDocuWorksのAPI操作について / stuncloud
そう言われましても僕も分かりません
それを教えるには僕も一から学んで実際に動作させ、理解をする必要があります
申し訳ないですがさすがにそこまでのやる気が出せないです

dllの関数とはいえ関数を呼び出して使うだけなので、あとはその関数のリファレンスやらを探して学んでいただくしかないです
例えばUWSCのmsgboxの使い方はヘルプを見て使い方を調べられますよね?
関数についての公式な情報がどこかにあるのではないかと思うのですが

No.45 2018/11/03(Sat) 00:44:25

Re: UWSCを使用したDocuWorksのAPI操作について / みつ
stuncloud 様

DOCUWORKSをAPIでどうしても動かしたかったので質問してしまいました。
UWSCの枠を超えての無理な質問すみませんでした。


>dllの関数とはいえ関数を呼び出して使うだけなので、あとはその関数のリファレンスやらを探して学んでいただくしかないです

了解しました。
関数の公式情報を見つけたので勉強します。


最後に下記のVBAからUWSCの dll 変換が合っているかご教授頂けないでしょうか?

<VBA>
'2.64 XDW_OpenDocumentHandle DocuWorksファイルにアクセスするためのハンドルを得る。この場合だけ、pHandleはByRefで定義
Private Declare Function XDW_OpenDocumentHandle Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal lpszFilePath As String, ByRef pHandle As Long, ByRef pMode As XDW_OPEN_MODE) As Long

Private Type XDW_OPEN_MODE
nSize As Long
nOption As Long
End Type


<UWSC>
def_dll XDW_OpenDocumentHandle(string,Long,var long[]):Long:D:\dwsdk625\XDWAPI\DLL\xdwapi.dll

VBAの Private Type 以下4行の宣言はUWSCでは不要。


これで XDW_OpenDocumentHandle の呼び出し成功していますでしょうか?

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

No.46 2018/11/04(Sun) 20:40:24

Re: UWSCを使用したDocuWorksのAPI操作について / stuncloud
>これで XDW_OpenDocumentHandle の呼び出し成功していますでしょうか?
二つ目の引数がハンドルを返すようなので参照渡し(var)になります

def_dll XDW_OpenDocumentHandle(string,var Long,var long[]):Long:D:\dwsdk625\XDWAPI\DLL\xdwapi.dll

呼び出し方は

dim file = "C:\DOCU\TEST.xdw"
dim pMode[1] // 構造体 {long,long}
dim handle
const XDW_OPEN_READONLY = 0 // 名前からして読み取りのみ
const XDW_OPEN_UPDATE = 1 // 名前からして読み書き可能にする

// pMode構造体に必要な値を入れておく
pMode[0] = 8 // longが2つなのでサイズは8
pMode[0] = XDW_OPEN_UPDATE


ret = XDW_OpenDocumentHandle(file, handle, pMode)
if ret = 0 then
 //成功、handleにドキュメントのハンドルが返る
else
 //失敗、戻り値retがエラーコードのようなのでそこから原因を調べる
endif


pMode構造体はメンバが2つしかないので
def_dll XDW_OpenDocumentHandle(string,var Long,{long, long}):Long:D:\dwsdk625\XDWAPI\DLL\xdwapi.dll
と展開した表記でも良いでしょう
その場合は呼び出し方は以下になります

dim nSize = 8
dim nOption = XDW_OPEN_UPDATE

ret = XDW_OpenDocumentHandle(file, handle, nSize, nOption)

構造体に予め値を入れて関数に渡すといった情報はすべて最初のVBAコードから読み取れます

No.47 2018/11/05(Mon) 08:43:45

Re: UWSCを使用したDocuWorksのAPI操作について / みつ
stuncloud 様

お礼が遅くなりすみません。

教えて頂いた方法で動きましたので何とか行けそうです。
感謝致します。

関数をもっと調べて最後までやり遂げたいと思います。

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

No.62 2018/11/12(Mon) 21:51:45
(No Subject) / にゃんこ
UWSCのボタンを隠れないように最前列にするにはどうすればいいでしょうか?
No.48 2018/11/05(Mon) 12:18:37

Re: / Tmshinza
UWSC.INI の [SET] セクション
 StayOnTop = 1  UWSC本体のウィンドウを最前面に固定

の事でしょうか。

初期値 StayOnTop = 0 を 1 に変更して、UWSCを再起動すれば、常に最前面表示になる筈です。

No.49 2018/11/05(Mon) 17:43:08

Re: / にゃんこ
目的を達成できました

ありがとうございました

No.50 2018/11/06(Tue) 20:37:45
以下のフォームに記事No.と投稿時のパスワードを入力すれば
投稿後に記事の編集や削除が行えます。
15/200件 [ ページ : 1 2 >> ]

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

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

Rocket Board Type-X (Free) Rocket BBS