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

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

driverとブラウザバージョンは一致してるのですが / chu
Edgeのバージョンが120.0.2210.61 になってからmsedgedriverのバージョンをEdge(ブラウザ)と一致させても、uwscwebdriver側でバージョン不一致のエラーが出て操作できなくなりました。OSの再起動も何度も試してみました。
同症状の方おられますか?

uwscwebdriverの開発は終了されていますし、所謂「おま環」の可能性大なのでここへの書き込みも恐縮なのですが・・・何か情報頂けましたら幸いです。

No.1687 2023/12/10(Sun) 08:57:29

Re: driverとブラウザバージョンは一致してるのですが / 妖怪

msedgedriverのバージョン119.0.2151.97で動きます。

No.1688 2023/12/11(Mon) 21:51:09

Re: driverとブラウザバージョンは一致してるのですが / chu
情報ありがとうございます。
私も119までは、問題なく動いていたのですが、120に更新してから2台とも動かなくなりました。Edgeのロールバックで対処できますが、ずっとEdgeバージョンをそのままにしておくのもよろしくないので、原因を探ってみます。

ちなみにedgeは自動更新設定にしていて
powershell("(get-item ("調べたいファイル")).VersionInfo.FileVersion")
 
で、edgeとmsedgedriveのバージョンをチェックして異なればdriverを新しく持ってくるようにしていました。これまでの更新ではずっと問題なかったので、原因解明に困難しています。121でまた動くようになればいいのですが。

No.1689 2023/12/12(Tue) 09:49:32

Re: driverとブラウザバージョンは一致してるのですが / stuncloud
これで最後です
連絡先等の情報を消す必要があったので、そのついでに不具合修正等を行っています

https://github.com/stuncloud/UwscWebDriver/releases/tag/0.11.1

ここでも何度も申し上げていますが、今後なにかしらの不具合で動作しなくなった場合に自身で対処できないようであれば利用を中止してください

No.1690 2023/12/12(Tue) 12:18:47

Re: driverとブラウザバージョンは一致してるのですが / stuncloud
chuさんとこは動くようになったんかな?もう大丈夫?
No.1696 2023/12/15(Fri) 01:06:18

Re: driverとブラウザバージョンは一致してるのですが / chu
お気にかけていただきありがとうございます。

「今ネットの状態悪いけど私だけ?」的な気持ちで書き込んだつもりで、決して開発終了の作品に対してUPDATEを要求するものではなかったのですが、作者様をはじめ多くの方のお時間を取らせてしまったことに反省しております。

私の場合、「Driverオブジェクトの取得に失敗しました」のエラーが出る要因が複数あったようで具体的には、

Opt.args.add( "--disable-features=RendererCodeIntegrity")
Opt.args.add( "--user-data-dir=C:\Users\chume\AppData\Local\Microsoft\Edge\User Data")
Opt.args.add( "--profile-directory=profile 1") //プロファイル

をコメントアウトしご更新頂いた0.11.1 に変更し
Opt.setOption("binary","C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe")
を追加することで無事起動が出来ました。すぐに、ご教示いただきました方法を試してみたのですが、上の3行もエラー原因であることに昨夜まで気づかず、ご報告が遅れました。

現状は、意味を理解していないまま上の3行をOpt.args.add( "binary","-- xxxxxx")とし、何とかエラー出ずに起動できていますが、保存したつもりのプロファイル設定の読み込みに失敗し、いつも起動の度webエクスペリエンスのポップアップが出てしまいます(笑)。

私も「自分で対処できなければ利用を中止する」ということに賛同できますので、スキル的にも時間的にも早かれ遅かれ使えなくなる日が来ると思いますが、出来るだけ長く利用できるよう頑張ってみる次第です。
また今後、不用意な書き込みをしないよう留意します。


driverアップデートへのお礼のつもりが長々と掲示板を汚してしまったこと重ねてお詫びいたします。

No.1698 2023/12/15(Fri) 12:56:00
CSVファイルの行の途中の改行コードを除きたい / sen
お世話になっております。
エクセルファイルからCSVファイルに変換するしているのですが、
セル内で改行しているデータがあり、うまく変換できません。
そのセルのみダブルクォーテーションで括られていて、
ダブルクォーテーションはうまく削除できました。
ただ、リターンコードはうまく取り除けません。
ご教授願えますでしょうか?

dim 変換前
fid = fopen(保存ファイル名,F_READ or F_WRITE)
変換前 = fget(fid,F_ALLTEXT,TRUE)
変換前 = chgmoj(変換前,"<#DBL>","")
//変換前 = chgmoj(変換前,"<#CR>","")
fput(fid,変換前)
fclose(fid)
fid = fopen(保存ファイル名,F_READ or F_WRITE)
For i = 2 to fget(fid,-1)-1
変換前 = fget(fid,i)
変換前 = chgmoj(変換前,"<#CR>","")
fput(fid,変換前,i)
next
fclose(fid)

//エクセル.CSV

名前,コメント,住所
高田,連絡,静岡県
臼田,連絡,長野県
吉田,"連絡<改行コード>
前日",東京都

エクセルファイルでは

連絡
前日

のように表示されています。

No.1684 2023/12/03(Sun) 11:59:11

Re: CSVファイルの行の途中の改行コードを除きたい / stuncloud
> エクセル.CSV

は変換前のファイルですか?であるならば実際は

> 名前,コメント,住所<改行コード>
> 高田,連絡,静岡県<改行コード>
> 臼田,連絡,長野県<改行コード>
> 吉田,"連絡<改行コード>
> 前日",東京都<改行コード>


となっているはずですから単に置換しただけではうまくいきません
1行ずつ読み出し、その行のカンマの数が少なければ改行しているとみなし次の行も読む、といった工夫が必要でしょう

または、Excelからセルごとに値を読み取り改行を置換してからfputしていくことでExcelから直接csvファイルを書き出していくという方法でも良いのではないでしょうか

No.1685 2023/12/03(Sun) 16:59:51

Re: CSVファイルの行の途中の改行コードを除きたい / sen
ありがとうございます。
教えてもらったのを元に、下記のように修正しました。
合っていますでしょうか?
(csvファイルは分かり易く変更しました。)

fid = fopen("テスト.CSV",F_READ or F_WRITE)
For i = 2 to fget(fid,-1)
変換前 = fget(fid,i)
ifb pos(",",変換前,3) = 0 then
変換前 = 変換前+","+fget(fid,i+1)
fput(fid,変換前,i)
fdelline(fid,i+1)
break
endif
next
fclose(fid)

//テスト.CSV
//A,B,C,D
//9,9,9,9
//1,2-1
//2-2,3,4
//↓正解
//A,B,C,D
//9,9,9,9
//1,2-1,2-2,3,4

No.1686 2023/12/03(Sun) 21:59:54
UwscWebDriver バージョン0.11.0 における不具合 / TS
すでに開発終了されているUwscWebDriverについての質問で恐縮です。

バージョン0.11.0においてdriver.Navigate(url, "_blank")を実行するとuelと"_blank"を結合したアドレスと認識され、そのページを開く(エラー)挙動となっています。
バージョン0.10.1までは正常に動作します。

可能であれば、修正していただけますと幸いです。

No.1681 2023/11/18(Sat) 23:16:09

Re: UwscWebDriver バージョン0.11.0 における不具合 / stuncloud
ExecuteScriptの引数を可変長にしたことに起因するバグです

https://github.com/stuncloud/UwscWebDriver/blob/master/UwscWebDriver.uws#L1694-L1694
の部分
> return this.ExecuteScript(js, [url, target]);

> return this.ExecuteScript(js, url, target);

に修正してください
多分これで直ります

UwscWebDriverは開発終了してるので僕がこれに手をいれることはもうありません
ですが、もとのリポジトリをフォークしてこの修正を入れた新バージョンを利用者のどなたかが公開する、というのは全然アリです
そのためにゆるいライセンスにしていますし
ですので修正版があったほうが良いというのであれば、TSさんに修正版を公開していただければ助かりますね

ちなみに今回は原因特定が簡単にできたので修正方法をお伝えしましたが、今後はUwscWebDriverのサポートも縮小…というかよほどのことがない限りやらない方針です
なぜならそこに時間を使うくらいならUWSCR開発に注力したいからです
UWSCRのブラウザ操作機能はUwscWebDriverより使いやすくて便利ですよ

No.1682 2023/11/19(Sun) 00:47:36

Re: UwscWebDriver バージョン0.11.0 における不具合 / TS
> 多分これで直ります

治りました、的確なアドバイスありがとうございました

> 修正版があったほうが良いというのであれば、TSさんに修正版を公開していただければ助かりますね

いつも使わせていただくだけで、修正版を公開とかしたことないので、調べてみてできそうならやってみます

> UWSCRのブラウザ操作機能はUwscWebDriverより使いやすくて便利ですよ

UWSCRについては開発が進んでいて使ってみたいと思っています

一点お伺いしたいのですが、動作保証OSがWindows 10以上となっています
これは、例えばWindows7の場合、必要なコンポーネント等がないなど、動作に支障をきたすということでしょうか?それとも、基本的には動作するけど、サポートの都合上Windows 10以上とされているということでしょうか?

後者であれば、当方のメインPCがWindows7ですが、原則ノーサポートであることを理解した上で使用させていただきたいと考えています
分かる範囲で教えていただけたら幸いです

No.1683 2023/11/19(Sun) 12:16:26
特殊文字が含まれているレジストリキーを読み込みたい / YMK
お世話になります。

題名の件、例えばレジストリキー
HKEY_CURRENT_USER\test01、に値「 hogeⓐ 」が書き込まれている場合
文字化けさせずに取得する方法がありましたら、ご教授ください。

以下の2通りの方法を試しましたが、
いずれも「hoge?」と出力されてしまいました、、

//パターン1
re = Doscmd("reg query HKEY_CURRENT_USER /v test01")

//パターン2
Ws = CreateOleObj("Wscript.Shell")
re = ws.Regread("HKEY_CURRENT_USER\test01")

因みに、該当キーをレジストリエディタで確認したところ、
文字化けせずに正常に設定されていました。

No.1678 2023/11/09(Thu) 03:15:41

Re: 特殊文字が含まれているレジストリキーを読み込みたい / stuncloud
WMIならうまくいきました

const HKEY_CLASSES_ROOT = 2147483648
const HKEY_CURRENT_USER = 2147483649
const HKEY_LOCAL_MACHINE = 2147483650
const HKEY_USERS = 2147483651
const HKEY_CURRENT_CONFIG = 2147483653

locator = CreateOleObj("Wbemscripting.SWbemLocator")
service = locator.ConnectServer("", "root\default")
stdRegProv = service.Get("StdRegProv")

dim value // この変数で値を受ける

// 引数は ルートキーを示す定数, サブキー, エントリ名, 値を受ける変数
stdRegProv.GetStringValue(HKEY_CURRENT_USER, "", "test01", var value)

msgbox(value) // hogeⓐ


値の型によって使うメソッドが異なります
例: 数値ならGetDWORDValue
https://learn.microsoft.com/ja-jp/previous-versions/windows/desktop/regprov/stdregprov

No.1679 2023/11/09(Thu) 09:39:52

Re: 特殊文字が含まれているレジストリキーを読み込みたい / YMK
有り難うございます、無事に文字化けせずに値を取得出来ました。

> 値の型によって使うメソッドが異なります
参照先を調べて、SetStringValueで文字化けさせずに書き込むことも出来ましたm(__)m

No.1680 2023/11/09(Thu) 13:03:13
elementが取得ができないのかな? / 妖怪
UwscWebDriverをありがたく使わせて頂いています。
ありがとうございます。
UwscWebDriverの開発は終了していることは承知しておりますが
助言を頂けると助かります。

昨日からEdgeのバージョンが119.0.2151.44にアップしましたが
エレメントが取得されていないかと思われるエラーが発生しました。

サンプル
-UwscWebDriverのsample2.uws--------------------------------

with driver.FindElement("#datePick")
.Clear()
.SetValue(G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2)
endwith

エラー
COM Error:Cound not convert of type(Null) into type(Dispatch)
**行目:.Clear()

No.1672 2023/11/05(Sun) 04:51:38

Re: elementが取得ができないのかな? / stuncloud
助言というのはなにについて求められているのでしょうか
(なんでみなさん要求を具体的に書いてくれないんですかね!不思議ですね!)

エラーの原因についてでしたら、おっしゃる通りですね
> driver.FindElement("#datePick")
がNULLを返しているためClear()を呼ぶ際にエラーになっています
UWSCはドット呼び出しの際に左辺をIDispatchに変換しようとします
この場合ドットの左辺はFindElementの戻り値ですね
そしてNULLはIDispatchに変換できないのでCOMエラーとなります

エラーを発生させずに動作させるにはどうしたらいいか?
という話であればもう以下の二点しかありません

- ブラウザのバージョンとwebdriverのバージョンを合わせる
双方のバージョンが異なる場合は正常に動作しないことがあります
これはありがちなケースなので必ず確認してください

- ブラウザの仕様またはwebdriverの仕様変更に伴う動作不良
仕様変更に合わせてご自身でUwscWebDriverを直接修正してください
最悪のケースはこれですが、開発終了について承知しておられるとのことですので
ここまでやっていただくほかないということも理解いただけると思います

No.1673 2023/11/05(Sun) 10:59:18

Re: elementが取得ができないのかな? / 妖怪
ブラウザのバージョンとwebdriverのバージョンを合わせたいのですが
UwscWebDriverのサンプル(sample.uws)によるWebDriverダウンロードでは
バージョンの入力ボックスに「空欄にした場合は最新版をダウンロードします」と
記載あるも、一つ前の118.0.2088.76が、何回トライしてもダウンロードされます。

直接DLするには下記のurlでよろしいでしょうか?
https://developer.microsoft.com/ja-jp/microsoft-edge/tools/webdriver/

No.1674 2023/11/05(Sun) 14:15:36

Re: elementが取得ができないのかな? / stuncloud
> ブラウザのバージョンとwebdriverのバージョンを合わせたいのですが
> UwscWebDriverのサンプル(sample.uws)によるWebDriverダウンロードでは
> バージョンの入力ボックスに「空欄にした場合は最新版をダウンロードします」と
> 記載あるも、一つ前の118.0.2088.76が、何回トライしてもダウンロードされます。

最新版バージョンはLATEST_STABLEを参照するので、stableではないバージョンはダウンロードされません
詳しい仕組みについては実装を見てください

それはそれとして、119と入力してダウンロードは試されてないんですか?
LATEST_RELEASE_119_WINDOWSが119.0.2151.44を返してるのでそれでダウンロードできるはずですけどね?

> 直接DLするには下記のurlでよろしいでしょうか?
> https://developer.microsoft.com/ja-jp/microsoft-edge/tools/webdriver/

実際にダウンロードして試してみればよろしいでしょう?
そのくらいのことはできるでしょうに、なぜまずやってみないんですか?


それでですね、もしwebdriverのバージョンを合わせてもダメだった場合の話ですけどね
「開発終了していることを承知」されているのであればご自身で解決してもらうほかないんですよ
そうでないなら速やかに利用を止めてください

No.1675 2023/11/05(Sun) 15:19:34

Re: elementが取得ができないのかな? / 妖怪
いいえ、119と入力して試しました。
エラーもなく実行されました。

Stable チャネルの
119.0.2151.44(x64)も試しエラーのないことも確認済です。

>最新版バージョンはLATEST_STABLEを参照するので、stableではないバージョンはダウンロードされません
Stableチャネルから119.0.2151.44(x64)がダウンロードできるのに
バージョンの入力ボックスの空欄で一つ前の118.0.2088.76がダウンロードされるのが不思議かなと思っての投稿でした。

>それでですね、もしwebdriverのバージョンを合わせてもダメだった場合の話ですけどね
今回は、WebDriverバージョンアップで解決しましたが、
ダメたったら、コードを読み解き解決したいと思います。

有意義な助言ありがとうございました。

No.1676 2023/11/05(Sun) 16:17:58

Re: elementが取得ができないのかな? / stuncloud
> いいえ、119と入力して試しました。
> エラーもなく実行されました。
>
> Stable チャネルの
> 119.0.2151.44(x64)も試しエラーのないことも確認済です。

それを先のポストから読み取るのは無理ですよ

> >最新版バージョンはLATEST_STABLEを参照するので、stableではないバージョンはダウンロードされません
> Stableチャネルから119.0.2151.44(x64)がダウンロードできるのに
> バージョンの入力ボックスの空欄で一つ前の118.0.2088.76がダウンロードされるのが不思議かなと思っての投稿でした。

であればそれだけ質問されればよかったのでは?蛇足が多すぎです
ちなみにそうなる理由は
https://msedgewebdriverstorage.blob.core.windows.net/edgewebdriver/LATEST_STABLE
が現時点では118.0.2088.76を返すからです
実装を見ればわかるというのはそういう話です
これも遠くない未来には119になるでしょう

> >それでですね、もしwebdriverのバージョンを合わせてもダメだった場合の話ですけどね
> 今回は、WebDriverバージョンアップで解決しましたが、
> ダメたったら、コードを読み解き解決したいと思います。
>
> 有意義な助言ありがとうございました。

がんばってね

No.1677 2023/11/05(Sun) 18:05:54
(No Subject) / seen
お世話になります。
以下のテキストがあるのですが、日付の"23/10/02"と約定価格の"1,428"、"1,423"を取得するのに数日頭を悩ましています。
日時は、BETWEENSTRとCOPYを無理やり駆使してなんとか取得できたのですが、
日付=COPY(BETWEENSTR(証券,"条件","約定結果"),1,8)
約定の"1,428"、"1,423"を取得する場合、日付が変わる、行数や前後の文字が変わるといったことがあり、どのような関数であれば取得できるのか、あるいはこういった場合、もっと何かしら方法があるのでしょうか。

textblock 証券
日付 時刻 市場 取引 状況 未約定株数 約定株数 執行条件 単価 条件
23/10/02 07:10:44 東証 現物売 注文 100 -- 指値 1,476 --
09:24:05 東証 現物売 訂正 100 -- -- (1,428) --
09:24:05 東証 現物売 約定 300 -- -- 1,428 --
09:25:01 東証 現物売 訂正 100 -- -- (1,423) --
09:25:01 東証 現物売 訂正完了 100 -- -- 1,423 --
09:25:01 東証 現物売 約定 0 100 -- 1,423 --
約定結果

No.1666 2023/11/01(Wed) 18:10:49

Re: / stuncloud
元データはtsvですかね?であれば各行splitで良いのでは?

rows = split(証券, "<#CR>")
for row in rows
 data = split(row, "<#TAB>")
 if data[0] <> EMPTY then
  print data[0] // 日付を表示
 endif
 if data[4] = "約定" then // 状況が約定なら
  print data[8] // 単価を表示
 endif
next

No.1667 2023/11/01(Wed) 18:58:53

Re: / seen
splitとinというものを使うのですね、無事data[7]で取得できました、ありがとうございます。
同じマニュアルを読んでいるにもかかわらず諸先輩は、理解が深いのでいつも感心させられます、splitとinを使う以外にも別な方法をご存じの方はいらっしゃるのでしょうか。

No.1668 2023/11/02(Thu) 15:57:24

Re: / seen
別のやり方を1つ考えてみたのですが、以下では、data[0][8]にデータを格納するのは難しいでしょうか。
DIM data[0][8]
DIM i
for i=0 to 7
if data[i][3] = "約定"
print data[i]][7]
endif
next

No.1669 2023/11/03(Fri) 12:36:29

Re: / stuncloud
data[0][8]であれば不可能です、理由はご自分で考えてください

とはいえ二次元配列にすることは可能です

先に示したサンプルにおけるrowsは配列です
rowsの各要素をsplit()して再代入することで二次元配列になります

あとはちょっと気になったことを書かせてください

先に提示した方法でも希望の動作を実現できるとは思うのですけれど、どうして別の方法とやらにこだわるのかがわかりません
ひとまずやれそうな方法でやってみる、というのではダメなのでしょうか

いくつかの方法を聞いてみたとして、採用するのはそのうちの一つでしょう
すると、採用されなかった方法はまず覚えないでしょうし身にならんと思うんですよね
なので質問する姿勢としてそれはどうかな?と考えてしまいます

とりあえずこの件に関してはヒントは出したので、僕はここで手を引きます

No.1670 2023/11/03(Fri) 15:34:21

Re: / seen
気になったことに回答させていただきます。
まず、悩んでいたものが的確な方法で取得できたことに感謝しています。
その上で、今回の内容は、課題をクリアするのが目的でなく、こういった課題が出た場合、1つの方法でなく、配列を使わない方法などもあるのではないのかと単純に思って提案した次第です、お気を悪くしたのなら申し訳ありませんでした。

No.1671 2023/11/03(Fri) 21:34:43
特定の要素を疑似的にマウスオーバーさせる方法 / さと
UwscWebDriverを使用しています。
開発が終了しているのは承知していますがどうにも行き詰ってしまい質問させてください。

特定の要素をマウスオーバーしている最中のみクリックが作動する
マウスオーバーしていない時にクリックしても無効

というページがあります。

Selenium + PythonだとActionChainsというものでマウスオーバーを疑似的に実現できるようですが、
それがUwscとUwscWebDriverでどうすればわからず…。

一応、

1.対象要素をFindElementで取得
2.ExecuteScript経由で対象要素の座標を取得
3.MMV関数でマウスカーソルを強制的に移動
4.対象要素をクリック

とすれば動きはしますが安定性は良くないと考えています。
無理ならあきらめてこれを実装する他ないのですが、何か方法やアイデアはありますでしょうか?

No.1662 2023/10/25(Wed) 15:59:36

Re: 特定の要素を疑似的にマウスオーバーさせる方法 / stuncloud
dispatchEventでmouseoverイベントを発生させる例がありました
https://stackoverflow.com/a/50206746

まあ、せっかくUWSCを使っているのだからmmvでも良い気がしますけど
lockhardexでその瞬間だけ物理マウスを無効にするなどで安定性も増すのでは

いやしかし
> 特定の要素をマウスオーバーしている最中のみクリックが作動する
なんてのがあるんですね

No.1663 2023/10/25(Wed) 18:30:43

Re: 特定の要素を疑似的にマウスオーバーさせる方法 / さと
ご回答、ヒント、ありがとうございました。

dispatchEvent を試してみましたが期待した挙動にはならず断念します。

ツールの概要としてはslctboxでボタンをクリックすると
選択した処理が実行されるという入力オペレーションの補助ツールだったので
スクレイピングとは多少方向性が違う事もあってカーソル遷移はあまりしたくはなかったのですが

1.元のカーソル座標を取得
2.JSで取得した要素位置へ移動
3.クリックが確認されたら元のカーソル位置へ戻す

とし、アドバイス頂いた通り lockhardex で安定させる方向で実装します。


> いやしかし
> > 特定の要素をマウスオーバーしている最中のみクリックが作動する
> なんてのがあるんですね


これに関しては私の解析力不足もあるとは思います。
マウスオーバーするとdata属性が付与されるのですが、
リロードしなくてもマウスオーバーをする都度data属性に与えられる値が変化してしまいます。

それをキーにしてAPIを叩いているっぽいのですがそれ以上の理解には力が及びませんでした。

ともあれご回答ありがとうございました。

No.1664 2023/10/26(Thu) 16:53:09

Re: 特定の要素を疑似的にマウスオーバーさせる方法 / さと
すみません、間違えてピンク文字にしてしました。
他意はありません・・・。

No.1665 2023/10/26(Thu) 16:54:19
UWSCをUSBメモリーから使えませんか? / sen
いつもUWSCにお世話になっております。
会社のインストールが厳しくなりそうで、パソコンが更新したあと、
インストールできないかもしれません。
USBメモリーから使えませんでしょうか?

No.1654 2023/10/22(Sun) 22:10:53

Re: UWSCをUSBメモリーから使えませんか? / stuncloud
フリー版ならuwsc.exeをUSBメモリにコピーしておくだけで使えます

Pro版であるなら単純にコピーするだけでは動かないかもしれません
レジストリの情報なども含めてさもUSBメモリにインストールされたかのように扱えるようにするソフトというものがあって、かつてそれを使いUSBメモリのコピーから実行させることを検討してました
複数のPCに対して特定の自動化作業が必要になった際に都度インストールするより楽かな?ということで導入してみましたが結局exe化したものを叩いたほうが楽だったのでお蔵入りでした
なんてソフトだったかは忘れました…

# ポリシーが厳しくなる割にはUSBメモリが許されてるの不思議に感じます

No.1657 2023/10/23(Mon) 10:59:00

Re: UWSCをUSBメモリーから使えませんか? / sen
ご返事ありがとうございます。

私はPro版を使用しています。
ですので、駄目なんだと思います。
そのようなソフトはまだ販売しているのでしょうか?

No.1659 2023/10/23(Mon) 23:57:06

Re: UWSCをUSBメモリーから使えませんか? / stuncloud
まるで記憶に残ってないので窓の杜とVectorを探してたらそれっぽいのがありました
僕が当時使っていたものと同じかどうかも定かではありませんが、機能的には同等のように見えます
https://www.vector.co.jp/soft/winnt/util/se416473.html
かなり古いソフトなので動くかどうかわかりません
使い方はzip内にあるテキストファイルを見てください
このソフトについての質問は受けられません
またご利用に関しては自己責任でお願いします

No.1660 2023/10/24(Tue) 01:29:43

Re: UWSCをUSBメモリーから使えませんか? / sen
ご返事ありがとうございます。

がんばります。

No.1661 2023/10/24(Tue) 21:56:46
global.関数名に使い方について / nanai
global.関数名に使い方がいまいち分かりません。

[RegularExpress.uws]にある、RowsPassOpenMatchValue関数内の「utuwa1 = STRINGCONTROL.DuplicateDelete_Str(utuwa)」を「「utuwa1 = global.DuplicateDelete_Str(utuwa)」として使うかな?と思ったのですが、エラーになりました。
global.関数名とは、UWSCで定めている関数、例えばFOPENとかをクラス名内でglobal.FOPENというように使うのでしょうか?

global.関数名の意味を調べてみると、モジュール内からモジュール外関数を使うとまでは調べました。


[abc.uws]:呼び出し側
call C:\Users\mac\Desktop\uwsc\test\Test_global\RegularExpress.uws

r_fp = "C:\Users\mac\Desktop\uwsc\UwscClassParts\Test\RegularExpress\RowsPassOpenMatchValue.txt"

Pattern = "^.{1,5}"

arr = ArrayCreate(r_fp)

a = REGULAREXPRESS.RowsPassOpenMatchValue(arr,r_fp,Pattern)

print a

Function ArrayCreate(r_fp) // ファイル内テキストを各行をCRで区切り新配列作成fp_Array_6
fid = FOpen(r_fp)
str = FGet(fid, F_ALLTEXT)
Result = split(str, "<#CR>")
fclose(fid)
fend


[StringControl.uws]
CLASS STRINGCONTROL

Function DuplicateDelete_Str(str) // 重複行削除str_StringControl_23

HASHTBL hash = HASH_CASECARE

w_fp = GET_CUR_DIR + "\" + "tmp.txt"

fid = FOpen(w_fp, F_READ or F_WRITE8 or F_NOCR)
FPut(fid, str, F_ALLTEXT)
FClose(fid)
fid = fopen(w_fp,F_READ)


for i = 1 to fget(fid,-1)
hash[fget(fid,i)] = 1 //1はダミー
next

fclose(fid)

dim utuwa

for i = 0 to length(hash) -1
utuwa = utuwa + hash[i, HASH_KEY] + "<#CR>"
next
result = utuwa
fclose(fid)
fend


Function BlankRowDelete_Str(str) // 空白行削除:str_StringControl_8
pattern = "^(\s| )*(\r\n|\r|\n)"
Dim o_Reg = CreateOLEObj("VBScript.Regexp")
o_Reg.Global = TRUE
o_Reg.Multiline = TRUE
o_Reg.pattern = pattern
result = o_Reg.Replace(str,"")
fend

endclass


[RegularExpress.uws]
call C:\Users\mac\Desktop\uwsc\test\Test_global\StringControl.uws

CLASS REGULAREXPRESS

Function RowsPassOpenMatchValue(var arr[],r_fp,Pattern) // ファイル内の各行フルパスを開き、パターン一致でvalue取得_RegularExpress_12
dim utuwa
for i = 0 to Length(arr) - 1
Dim fid = FOpen(arr[i])
str = FGet(fid, F_ALLTEXT)
global.FClose(fid)
utuwa = utuwa + THIS.RegValue(str,Pattern) + "<#CR>"
next
utuwa1 = STRINGCONTROL.DuplicateDelete_Str(utuwa)
// STRINGCONTROL
utuwa1 = STRINGCONTROL.BlankRowDelete_Str(utuwa1)
result = utuwa1
fend


Function RegValue(str, Pattern, IgnoreCase=TRUE, Global=true) // Matches.Item(i).Value(マッチしたもの全てを結果に。)_RegularExpress_13
dim utuwa
o_Reg = CREATEOLEOBJ("VBScript.RegExp")
o_Reg.IgnoreCase = IgnoreCase
o_Reg.Global = Global
o_Reg.Pattern = Pattern
o_Reg.Multiline = TRUE
Matches = o_Reg.Execute(str)
for i = 0 to Matches.count-1
utuwa = utuwa + Matches.Item(i).Value + "<#CR>"
next
Result = utuwa
Fend

endclass

No.1655 2023/10/23(Mon) 10:17:09

Re: global.関数名に使い方について / stuncloud
globalを付けることでmodule(class)外で定義された関数を明示して呼び出せます
外部の関数と同名の関数をmodule(class)内で定義している場合に区別することができます
ので通常はあまり使うことはありません

Mod.test()

module Mod
 procedure test()
  global.msgbox("組み込み関数を呼ぶ")
  msgbox("モジュール内で定義したmsgboxを呼ぶ")
 fend
 function msgbox(msg)
  with createoleobj("WScript.Shell")
   result = .Popup(msg)
  endwith
 fend
endmodule

> [RegularExpress.uws]にある、RowsPassOpenMatchValue関数内の「utuwa1 = STRINGCONTROL.DuplicateDelete_Str(utuwa)」を「「utuwa1 = global.DuplicateDelete_Str(utuwa)」として使うかな?と思ったのですが、エラーになりました。
globalを付けられるのは通常の関数に対してです
module(class)メンバ関数はそれぞれ「module(class)名.関数名」で区別できるのでglobalのようなものがが必要ないですからね

No.1656 2023/10/23(Mon) 10:47:40

Re: global.関数名に使い方について / nanai
stuncloudさん、いつも簡潔で分かりやすい説明ありがとうございます。
globalの意味、理解できました。

No.1658 2023/10/23(Mon) 13:22:23
クラスファイルの管理、呼び出しについて / nanai
下記のスクリプトですが、callで4つのファイルを呼び出さないと「ArrCopy」関数が使えない状態です。
クラスファイルは、各カテゴリごとに作成しています、配列関係の関数は、「Array.uws」に格納みたいに。
クラスファイルの管理の仕方や呼び出しについて、先輩方はどのようにされていますでしょうか?

1. カテゴリーごとに分けずに、1つのクラスファイルを作成してそれを呼び出す、この場合に関数呼び出し時に何の関数かは関数名だけで判断しないといけない。
ex)
COMMON.KANSUU1

2. カテゴリーごとクラスファイルを分けて、クラスファイルに関数作成するときは他のクラスファイルの呼び出しをなるだけせずに関数の中身のコードを直に書く。


[abc.uws] 配列コピーする関数:ARRAYクラスファイルの「ArrCopy」関数利用

call GET_UWSC_DIR + "\Test_UwscClassParts\Array.uws"
call GET_UWSC_DIR + "\Test_UwscClassParts\FileControl.uws"
call GET_UWSC_DIR + "\Test_UwscClassParts\RegularExpress.uws"
call GET_UWSC_DIR + "\Test_UwscClassParts\StringControl.uws"

dim arr[] = "a", "b", "c"
dim arr1[-1]

ARRAY.ArrCopy(arr,arr1)

for aa in arr1
print aa
next
---------------------
[Array.uws] 試したことーエラーになった、関数の中に関数を使うことは多重エラー
Procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[]) // ファイル内行ごと「:」区切って配列を2つ,dim arr1[-1],arr2[-1]
str = ReadAlltext(r_fp)
dim i = 0
d = GetRowNum_File(r_fp)
fid = fopen(r_fp,F_READ)
resize(arr1, d - 1)
resize(arr2, d - 1)
for y = 1 to d
str = fget(fid,y)
arr1[i] = token(Delimiter,str)
arr2[i] = token(Delimiter,str)
i = i + 1
next
fclose(fid)

Function ReadAlltext(r_fp) // テキストを全て読込_FileControl_5
Dim fid = FOpen(r_fp)
Result = FGet(fid, F_ALLTEXT)
FClose(fid)
FEnd

Function GetRowNum_File(r_fp) // ファイルの行数取得_FileControl_6
fid = fopen(r_fp,F_READ)
row_total_number = fget(fid,-1)
Result = row_total_number
fclose(fid)
Fend

fend


↓↓↓↓ 解決案? クラスファイルの関数作成時、他のクラスファイルの関数呼び出しはなるだけ避けて直にコードを書く

Procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[]) // ファイル内行ごと「:」区切って配列を2つ,dim arr1[-1],arr2[-1]

Dim fid = FOpen(r_fp)
str = FGet(fid, F_ALLTEXT)
FClose(fid)

dim i = 0

fid = fopen(r_fp,F_READ)
row_total_number = fget(fid,-1)
d = row_total_number
fclose(fid)

fid = fopen(r_fp,F_READ)
resize(arr1, d - 1)
resize(arr2, d - 1)
for y = 1 to d
str = fget(fid,y)
arr1[i] = token(Delimiter,str)
arr2[i] = token(Delimiter,str)
i = i + 1
next
fclose(fid)
fend

---------------------
[Array.uws] 現在の状態
Procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[]) // ファイル内行ごと「:」区切って配列を2つ,dim arr1[-1],arr2[-1]で利用可能_Array_17
str = FILECONTROL.ReadAlltext(r_fp)
dim i = 0
d = FILECONTROL.GetRowNum_File(r_fp)
fid = fopen(r_fp,F_READ)
resize(arr1, d - 1)
resize(arr2, d - 1)
for y = 1 to d
str = fget(fid,y)
arr1[i] = token(Delimiter,str)
arr2[i] = token(Delimiter,str)
i = i + 1
next
fclose(fid)
fend
---------------------
[FileControl.uws] 現在の状態
Function ReadAlltext(r_fp) // テキストを全て読込_FileControl_5
Dim fid = FOpen(r_fp)
Result = FGet(fid, F_ALLTEXT)
FClose(fid)
FEnd


Function Getdpfn(r_fp,Parent = 0,ext = TRUE) // 親フォルダー取得と切替でファイル名拡張子取得_FileControl_4
Dim ptn_ext ; If ext Then ptn_ext = "" Else ptn_ext = "|\.[^\.]*?$"
Result = REGULAREXPRESS.RegReplace(r_fp, "^.*\\(([^\t\r\n]+?\\){" + Parent + "}[^\t\r\n]+?)(?=\\$|$" + ptn_ext + ").*?$", "$1")
FEnd


Function GetRowNum_File(r_fp) // ファイルの行数取得_FileControl_6
fid = fopen(r_fp,F_READ)
row_total_number = fget(fid,-1)
Result = row_total_number
fclose(fid)
Fend
---------------------
[RegularExpress.uws] 現在の状態
Function RegReplace(str,pat,replacestr=null) // 第3引数指定有:置き換え,第3引数指定無:testでパターン有無チェック、Global=true(デフォルト)_RegularExpress_15
Dim o_Reg = CreateOLEObj("VBScript.Regexp")
o_Reg.Global = TRUE
o_Reg.Multiline = TRUE
o_Reg.pattern = pat
Ifb replacestr = null
If o_Reg.Test(str) = 0 Then
result = FALSE
Else
result = TRUE
endif
Else
result = o_Reg.Replace(str,replacestr)
EndIf
FEnd


Function RowsPassOpenMatchSubMatch1(r_fp,Pattern) // ファイル内の各行フルパスを開き、パターン一致でsubmatchvalue取得_RegularExpress_11
Dim arr = ARRAY.ArrayCreate(r_fp)
dim utuwa
for i = 0 to Length(arr) - 1
str = FILECONTROL.ReadAllText(arr[i])
utuwa = utuwa + THIS.RegSubmatch(str,Pattern) + "<#CR>"
next
utuwa1 = STRINGCONTROL.DuplicateDelete_Str(utuwa) //重複削除
utuwa1 = STRINGCONTROL.BlankRowDelete_Str(utuwa1) //空行削除
result = utuwa1
fend
---------------------

No.1643 2023/10/19(Thu) 13:54:08

Re: クラスファイルの管理、呼び出しについて / しろまさ
必須ならARRAYクラスファイルの行頭に相対Call書くと
ARRAYクラスファイルを一つのみcallすれば良くなる。
相対Callは重複してもクラス多重定義にはならないですし。

call GET_UWSC_DIR + "\Test_UwscClassParts\Array.uws"
ちなみにこれ、
call Test_UwscClassParts\Array.uws
で通ると思いますが、いかがでしょう?

No.1644 2023/10/19(Thu) 15:18:32

Re: クラスファイルの管理、呼び出しについて / しろまさ
相対でフォルダ上がるときはこんな感じ。
call ../Test_UwscClassParts\Array.uws

No.1645 2023/10/19(Thu) 15:21:21

Re: クラスファイルの管理、呼び出しについて / nanai
しろまささん、うまくできましたありがとうございます。
Callのパス、相対パスでできるとは知らなかったです。
クラスファイルに関数作成するときに別のクラスの関数呼び出し使っていこうと思います。

[abc.uws]
call "..\Test_UwscClassParts\Array.uws"

dim arr[] = "a", "b", "c"
dim arr1[-1]

ARRAY.ArrCopy(arr,arr1)

for aa in arr1
print aa
next

[Array.uws]
call .\FileControl.uws
call .\RegularExpress.uws
call .\StringControl.uws

CLASS ARRAY

Procedure Filter(var arr[], expression)
~
fend

No.1646 2023/10/19(Thu) 17:20:37

Re: クラスファイルの管理、呼び出しについて / nanai
各クラスファイルの先頭に、そのクラスファイルの関数で使う別クラスのファイルパスを相対パスでしたのですが、エラーが出ました。これの原因とは、abc.uwsから FILECONTROLクラスを呼び出して、FILECONTROLクラスにある、関数からREGULAREXPRESSクラスファイルの関数を呼び出していることが原因でしょうか?

つまり、2階層の呼び出しはできないということでしょうか?
すみません、先輩方ご教授願いませんでしょうか?


[エラー内容]
23/10/20 11:33 型が合っていない or オーバーフロー C:\USERS\MAC\DESKTOP\UWSC\TEST_UWSCCLASSPARTS\ARRAY.UWS: 0行目: PROCEDURE C:\USERS\MAC\DESKTOP\UWSC\TEST_UWSCCLASSPARTS\ARRAY.UWS()


[abc.uws] 呼び出す側
OPTION LOGFILE = 4

call ..\Test_UwscClassParts\Array.uws

dim arr1[-1],arr2[-1]
r_fp = "C:\Users\mac\Desktop\uwsc\UwscClassParts\Test\Array\RowDelimiterArr2Create.txt"
Delimiter = ":"
ARRAY.RowDelimiterArr2Create(r_fp,Delimiter,arr1,arr2)

for a in arr1
print a
next


[Array.uws]
call .\FileControl.uws

CLASS ARRAY

Procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[]) // ファイル内行ごと「:」区切って配列を2つ,dim arr1[-1],arr2[-1]で利用可能_Array_17
str = FILECONTROL.ReadAlltext(r_fp)
dim i = 0
d = FILECONTROL.GetRowNum_File(r_fp)
fid = fopen(r_fp,F_READ)
resize(arr1, d - 1)
resize(arr2, d - 1)

for y = 1 to d
str = fget(fid,y)
arr1[i] = token(Delimiter,str)
arr2[i] = token(Delimiter,str)
i = i + 1
next

fclose(fid)

fend


Procedure ArrCopy(arr[], var copyarr[]) // 配列をコピーする_Array_8
ifb length(arr) > length(copyarr)
resize(copyarr, length(arr) - 1)
endif
for i = 0 to length(arr) - 1
copyarr[i] = arr[i]
next
fend


Function ArrayCreate(r_fp) // ファイル内テキストを各行をCRで区切り新配列作成fp_Array_6
fid = FOpen(r_fp)
str = FGet(fid, F_ALLTEXT)
Result = split(str, "<#CR>")
fclose(fid)
fend

endclass


[FileControl.uws]
call .\Array.uws
call .\RegularExpress.uws

CLASS FILECONTROL


Function FilesAlltextReplaceSeparate(fpFileList,replacePreviousNext,dp) // ファイル内の各行にあるフルパスを開き、置き換えファイルで指定した文字列で一括置き換え_FileControl_28
OPTION SPECIALCHAR

Dim arr = ARRAY.ArrayCreate(fpFileList) //フルパスの配列

Delimiter = "#" //「#」で区切る

dim arr1[-1], arr2[-1] //arr1:置き換えされる文字列,arr2:置き換え後文字列

ARRAY.RowDelimiterArr2Create(replacePreviousNext,Delimiter,arr1,arr2)


for i = 0 to LENGTH(arr) - 1 //全行数分
str = THIS.ReadAllText(arr[i])
for y = 0 to Length(arr1) - 1 //置き換え一覧
str = chgmoj(str, arr1[y], arr2[y])
next

fn = THIS.Getdpfn(arr[i])
fn = replace(fn, "origin", "replace")
print "fn:" + fn //test1_replace.txt
w_fp = dp + fn //別ファイルとして新規作成
THIS.WriteAllText(w_fp,str)
//COMMON.WriteAllText(arr[i],str) //既存ファイルに書換
next

result = true
fend


Function Getdpfn(r_fp,Parent = 0,ext = TRUE) // 親フォルダー取得と切替でファイル名拡張子取得_FileControl_4
Dim ptn_ext ; If ext Then ptn_ext = "" Else ptn_ext = "|\.[^\.]*?$"
Result = REGULAREXPRESS.RegReplace(r_fp, "^.*\\(([^\t\r\n]+?\\){" + Parent + "}[^\t\r\n]+?)(?=\\$|$" + ptn_ext + ").*?$", "$1")
FEnd


Procedure WriteAlltext(w_fp,str) // テキストを全て書込(上書き)_FileControl_5
fid = FOpen(w_fp, F_READ or F_WRITE8 or F_NOCR)
FPut(fid, str, F_ALLTEXT)
FClose(fid)
FEnd


Function ReadAlltext(r_fp) // テキストを全て読込_FileControl_5
Dim fid = FOpen(r_fp)
Result = FGet(fid, F_ALLTEXT)
FClose(fid)
FEnd


Function GetRowNum_File(r_fp) // ファイルの行数取得_FileControl_6
fid = fopen(r_fp,F_READ)
row_total_number = fget(fid,-1)
Result = row_total_number
fclose(fid)
Fend

endclass


[RegularExpress.uws]
CLASS REGULAREXPRESS

Function RegExe(str, Pattern, IgnoreCase=TRUE, Global=TRUE) // Matches基本_RegularExpress_9
Public o_Reg = CREATEOLEOBJ("VBScript.RegExp")
o_Reg.IgnoreCase = IgnoreCase
o_Reg.Global = Global
o_Reg.Pattern = Pattern
Matches = o_Reg.Execute(str)
Result = Matches
Fend

Function RegReplace(str,pat,replacestr=null) // 第3引数指定有:置き換え,第3引数指定無:testでパターン有無チェック、Global=true(デフォルト)_RegularExpress_15
Dim o_Reg = CreateOLEObj("VBScript.Regexp")
o_Reg.Global = TRUE
o_Reg.Multiline = TRUE
o_Reg.pattern = pat
Ifb replacestr = null
If o_Reg.Test(str) = 0 Then
result = FALSE
Else
result = TRUE
endif
Else
result = o_Reg.Replace(str,replacestr)
EndIf
FEnd

endclass



[StringControl.uws]
call .\RegularExpress.uws

CLASS STRINGCONTROL

Function BlankRowDelete_Str(str) // 空白行削除:str_StringControl_4
pattern = "^(\s| )*(\r\n|\r|\n)"
RESULT = REGULAREXPRESS.RegReplace(str,pattern,"")
fend

endclass

No.1647 2023/10/20(Fri) 11:43:03

Re: クラスファイルの管理、呼び出しについて / nanai
呼び出し側からArray.uwsを呼び出して、Array.uwsファイルの先頭に、「call .\FileControl.uws」を記述があり、FileControl.uwsに、「call .\Array.uws」の記述があったことが原因でした。
2重に、「Array.uws」を呼び出していたようです。

No.1648 2023/10/20(Fri) 12:11:29

Re: クラスファイルの管理、呼び出しについて / nanai
これだと「FileControl.uws」の先頭に、「call .\Array.uws」と記述ができず「「FileControl.uws」」内の関数に、Array.uwsのクラスに記述している関数が使えないです。これを改善する方法ありますでしょうか?
No.1649 2023/10/20(Fri) 12:25:43

Re: クラスファイルの管理、呼び出しについて / stuncloud
callするときに相対パスを記述する場合注意しなければならないのは、起点となるのはあくまで呼び出したメインスクリプトのパスであるということです
以下のような構成にした場合、lib.uws内でlib.uwsからの相対パスを記述した場合、main.uwsを呼び出すとエラーになる

- main.uws
 ```
 call libs\libs.uws

 Foo.p()
 Bar.p()
 Baz.p()
 ```
- libs
 - lib.uws
  ```
  // main.uwsからlib.uwsを呼ぶ場合は、main.uwsからの相対パスを指定する必要がある
  call libs\foo.uws
  call libs\bar.uws
  call libs\baz.uws
  // 以下のように書いた場合、main.uwsから見ると自分と同じフォルダを探してしまう
  // call foo.uws
  // call bar.uws
  // call baz.uws
  ```
 - foo.uws
  ```
  module Foo
   procedure p
   fend
  endmodule
  ```
 - bar.uws
  ```
  module Bar
   procedure p
   fend
  endmodule
  ```
 - baz.uws
  ```
  module Baz
   procedure p
   fend
  endmodule
  ```

循環参照による多重定義エラーに関してですが、相互に呼び合う必要があるのなら上記のlib.uwsのように他のすべてのファイルをcallするファイルをメインで呼ぶくらいしかないです
その方法であれば上記例ではlib.uwsさえcallすればすべての機能が使えることが保証されます
でなければメインから愚直に全部callするしかないです

もっと言うと、互いに互いのモジュール関数を呼び合ってるのが良くないので引数を工夫するとかですね
例えばARRAY.RowDelimiterArr2Createであれば、r_fpを受けてその中でFILECONTROL.ReadAlltext(r_fp)を呼んでいますが、FILECONTROL.ReadAlltext(r_fp)の戻り値を受けるようにします
> Procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[])
> str = FILECONTROL.ReadAlltext(r_fp)
> dim i = 0
> d = FILECONTROL.GetRowNum_File(r_fp)

これを
> Procedure RowDelimiterArr2Create(all_text, rows, ,Delimiter,var arr1[],var arr2[])
> str = all_text
> dim i = 0
> d = rows

のように書き換えて、呼び出すときは
> all_text = FILECONTROL.ReadAlltext(r_fp)
> rows = FILECONTROL.GetRowNum_File(r_fp)
> ARRAY.RowDelimiterArr2Create(all_text, rows, delimiter, arr1, arr2)

とする
みたいな話です、こうやって他のモジュールへの依存をなくす方が筋がいいです

No.1650 2023/10/20(Fri) 14:55:23

Re: クラスファイルの管理、呼び出しについて / しろまさ
基本操作を管理するをlv1クラス群
lv1をcallし組み立てるlv2クラス群
などで循環参照にならないように管理するとか。

No.1651 2023/10/21(Sat) 03:54:32

Re: クラスファイルの管理、呼び出しについて / nanai
stuncloudさんありがとうございます、納得できました。

> callするときに相対パスを記述する場合注意しなければならないのは、起点となるのはあくまで呼び出したメインスクリプトのパスであるということです

この場合、呼び出される側のクラスファイルの先頭に呼び出す側を起点とした相対パスを書かないといけないので、呼び出す側のパスの位置が固定されるということですね、これは不便なので引数を工夫するのが良いと思いました。

ふと思ったのですけど関数の引数にファイルパスを指定するよりも、strなどの文字列を適用した方がいいかな?と、この考え方間違っているかもですけど!

No.1652 2023/10/21(Sat) 10:43:10

Re: クラスファイルの管理、呼び出しについて / nanai
しろまささん、ありがとうございます。
>基本操作を管理するをlv1クラス群
>lv1をcallし組み立てるlv2クラス群
>などで循環参照にならないように管理するとか。


上記だと設計を考える必要があるということですね、考慮してみます。

No.1653 2023/10/21(Sat) 10:45:23

以下のフォームに記事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