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

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

UwscWebDriver :Chromeで自分のプロファイルを使うとCOMエラー / マルパ
Chrome操作でUwscWebDriverにいつもお世話になっています、ご提供ありがとうございます

現在、自分のプロファイルを使ってChromeを操作しようとする場合にうまくいきません(プロファイルを使わなければ問題なく使用できます)
同じ自分のプロファイルをCREATEOLEOBJ("Selenium.WebDriver")を使った方法では問題なく動きます


UwscWebDriverの使用には
stuncloud様のgithubのページ
https://github.com/stuncloud/UwscWebDriver/wiki/Chrome%E3%81%A7%E8%87%AA%E5%88%86%E3%81%AE%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%BF%E3%81%86
を参考にしました

作成し実行したコードは次の通りです


opt = WebDriver.Option("chrome")
opt.args.add("--user-data-dir=C:\\Users\\" + ユーザーネーム + "\\AppData\\Local\\Google\\Chrome\\User Data")
opt.args.add("--profile-directory=プロファイル名")

driver = WebDriver.Chrome(9515, opt)
driver.Navigate(URL) // URLは任意のURLアドレス


このコードを実行するとプロンプトの画面が表示されます
画面の内容は

Starting ChromeDriver 104.0.5112.79 (3cf3e8c8a07d104b9e1260c910efb8f383285dc5-refs/branch-heads/5112@{#1307}) on port 9515
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.

DevTools listening on ws://127.0.0.1:51282/devtools/browser/7ea2d773-3e8e-45ce-9be3-c9c8f812b371

です



そしてChromeのウィンドウが表示されます(指定したプロファイルでウィンドウが表示されています)
直後にUWSCのエラーメッセージが表示されます
メッセージは

COM_Error:Could not convert variant of type (Null) into type (Dispatch)
XXX行目:IE.Navigate(URL)

です


UwscWebDriverの開発は終了したと存じておりますが、アドバイスいただけますでしょうか?

No.1589 2023/06/16(Fri) 07:47:09

Re: UwscWebDriver :Chromeで自分のプロファイルを使うとCOMエラー / stuncloud
原因はエラーメッセージの通りです
> COM_Error:Could not convert variant of type (Null) into type (Dispatch)
> XXX行目:IE.Navigate(URL)

変数IEがNULLだからです

No.1590 2023/06/16(Fri) 09:31:11

Re: UwscWebDriver :Chromeで自分のプロファイルを使うとCOMエラー / マルパ
返答ありがとうございます

com エラーの表記間違っていました

XXX行目:IE.Navigate(URL) ではなく

XXX行目:driver.Navigate(URL) でした



driver = WebDriver.Chrome(9515, opt)
この部分がなぜかうまくいっていないということでしょうか

No.1591 2023/06/16(Fri) 19:12:22

Re: UwscWebDriver :Chromeで自分のプロファイルを使うとCOMエラー / stuncloud
> driver = WebDriver.Chrome(9515, opt)
> この部分がなぜかうまくいっていないということでしょうか

そうですね、関数失敗時はNULLを返します
ただその場合は警告を表示するようになってるはずなので、まずはUwscWebDriverを最新版にしてください
その上で警告の表示に従い原因の切り分けを行ってください

No.1592 2023/06/16(Fri) 20:28:11

Re: UwscWebDriver :Chromeで自分のプロファイルを使うとCOMエラー / マルパ
アドバイスありがとうございます

UWSCWebDriverを最新にして使ったところ警告が出るようになりました

表示に従った結果

すでにChromeが起動している場合(別のプロファイルのもの)にはエラーがでますが
Chromeを起動していない状態で実行するとエラーはでなくなりました!、
ありがとうございます


プロファイルを使用しない場合にはすでにChromeが起動していてもエラーは出ないのですが、プロファイルを使う場合にはChromeは起動していないことが条件なのかもしれませんね

No.1593 2023/06/16(Fri) 22:29:11
EXCELでSQLを使うには / みつ
お世話になります。

EXCEL2019のテーブルをデータベースにして、SQL接続を行おうとしたところ、
COM Error が出てしまいますので、どこがいけないか指摘をお願い致します。

EXCEL2019のマクロで動かすと問題なく動きます。


////////////////////////

Dim cn //コネクション
Dim rs //レコードセット

cn = CREATEOLEOBJ("ADODB.Connection")
rs = CREATEOLEOBJ("ADODB.Recordset")

EXCEL = XLOPEN(GET_CUR_DIR + "\SQL.xlsm", 0)

cn.Provider = "Microsoft.ACE.OLEDB.12.0"
cn.Properties("Extended Properties") = "Excel 12.0" //← ここでCOM Error が出ます
cn.Open(GET_CUR_DIR + "\SQL.xlsm")


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

No.1584 2023/05/16(Tue) 11:58:58

Re: EXCELでSQLを使うには / stuncloud
Propertiesの各アイテムにValueが生えてるのでそこに代入すれば良さそうです
これで動作するか確認してみてください

cn.Properties.Item("Extended Properties").Value = "Excel 12.0"
print cn.Properties.Item("Extended Properties").Value // Excel 12.0

No.1585 2023/05/16(Tue) 13:55:55

Re: EXCELでSQLを使うには / みつ
教えて頂いたコードで試しましたが同じエラーが出てしまいました。

////////////////////////

Dim cn //コネクション
Dim rs //レコードセット

cn = CREATEOLEOBJ("ADODB.Connection")
rs = CREATEOLEOBJ("ADODB.Recordset")

EXCEL = XLOPEN(GET_CUR_DIR + "\SQL.xlsm", 0)

cn.Provider = "Microsoft.ACE.OLEDB.12.0"
cn.Properties.Item("Extended Properties").Value = "Excel 12.0" //← ここでCOM Error が出ます
print cn.Properties.Item("Extended Properties").Value // Excel 12.0
cn.Open(GET_CUR_DIR + "\SQL.xlsm")

No.1586 2023/05/16(Tue) 14:48:36

Re: EXCELでSQLを使うには / stuncloud
"Excel 12.0 Macro" ではどうですか?

参考: https://www.connectionstrings.com/ace-oledb-12-0/xlsm-files/

そもそもプロバイダ指定は正しいですか?
こちらもぜんぜんわかってないので的確な回答ができないんですよね
以下の記事が参考になったりしませんか?

https://qiita.com/yaju/items/7b0aa9e9f30005f60388

No.1587 2023/05/16(Tue) 17:02:00

Re: EXCELでSQLを使うには / みつ
教えて頂いたサイトを参考に無事動作させることができました。
ありがとうございました。

以下リンクからMicrosoft Access データベース エンジン 2010 再頒布可能コンポーネントをダウンロードし、インストールしたら動きました。

AccessDatabaseEngine.exe
<https://www.microsoft.com/ja-jp/download/details.aspx?id=13255>


////////////////////////

Dim cn //コネクション
Dim rs //レコードセット

cn = CREATEOLEOBJ("ADODB.Connection")
rs = CREATEOLEOBJ("ADODB.Recordset")

EXCEL = XLOPEN(GET_CUR_DIR + "\SQL.xlsm", 0)

cn.Provider = "Microsoft.ACE.OLEDB.12.0"
cn.Properties("Extended Properties") = "Excel 12.0"
cn.Open(GET_CUR_DIR + "\SQL.xlsm")

rs.Open("SELECT * FROM [果物$] WHERE 種類 = 'りんご'", cn, 3 )
rs.RecordCount

EXCEL = XLOPEN(GET_CUR_DIR + "\SQL貼り付け用.xlsx", 0)
EXCEL.ACTIVESHEET.RANGE("A2:XFD1048576").CLEAR
EXCEL.Sheets("Sheet1").RANGE("A2").CopyFromRecordset(rs)

rs.Close
rs = Nothing
cn.Close
cn = Nothing

No.1588 2023/05/18(Thu) 18:49:37
UWSCのReplace関数について。 / ほっしー
以下の文字列の3番目の文字をBBBに変えて
AAAAA=>AAABBBAAAにしたいのですが、VBAと違うのかうまくいきません。
他に良い方法がないかと思案しています。
基本的なこことはおもいますが、ご指南よろしくお願いいたします。

No.1582 2023/05/14(Sun) 01:26:23

Re: UWSCのReplace関数について。 / stuncloud
どのようなコードを書いてどうだめだったかをなるべく書くようにしてください
そこから読み取れることもあるので

> 以下の文字列の3番目の文字をBBBに変えてAAAAA=>AAABBBAAAにしたい
3番目のAをBBBにするとAABBBAAになると思われますが
AAABBBAAAになるとのことなので、要件も正確に書いてもらったほうが良いです

> VBAと違うのかうまくいきません
VBAであればどのように書いていたのかといった情報もあると良かったですね


とりあえずAAAAAをAABBBAAにする場合について考えてみましょう

やりたいことはn番目に出てくる特定の文字を別のものに置き換えるということですね
これはreplace関数だと難しそうなので、いくつかの関数を組み合わせてやることになります

まずそのn番目の文字の位置を特定する必要があります
これはpos関数でできそうです、3番目のAの位置を得るといったことができます

次に、置き換えたい文字の前後の文字列をコピーしておきます
1文字目から先程posで得た位置の前まで(前部分とします)、
そしてpos位置の次から最後まで(後部分とします)をそれぞれコピーします
これらはcopy関数でできますね

最後に 前部分 + 置き換える文字 + 後部分 と文字連結を行えば完了です
これらが正しく出来ていれば "AA" + "BBB" + "AA" となりAABBBAAが得られます
AAABBBAAAにしたい場合でもこの工程に少し変更を加えればできるはずです

No.1583 2023/05/15(Mon) 02:05:53
printウィンドウの表示について / OR
uwscのように、printウィンドウにprint出力(文字列)を表示したいと考えています。

以下のコードをエクスプローラからD&Dで実行しましたが、
灰色のウィンドウ(おそらくprintウィンドウ)が表示されるだけで、
その中に文字列が表示されません。
ログファイルには正しく出力されています。
uwscr -w test.uws で実行しても結果は同じでした。
未実装なのでしょうか?

[環境]
uwscr x64 ver0.10.0 (現在のlatest)
windows10 home

[コード]
logprint(true)
print "test"
sleep(5)

No.1579 2023/04/03(Mon) 11:10:23

Re: printウィンドウの表示について / stuncloud
確認します

追記
確認しました
実装はしてあるのですが何かが壊れているようです

print文を使う場合はコマンドプロンプトやPowerShellから
cmd /c uwscr hoge.uws
とすることでコンソール上に出力されるようになります
ご不便をおかけしますが修正までお待ち下さい

No.1580 2023/04/03(Mon) 11:29:54

Re: printウィンドウの表示について / stuncloud
print表示を修正した0.10.1をリリースしました
https://github.com/stuncloud/UWSCR/releases/tag/0.10.1

No.1581 2023/04/03(Mon) 14:01:12
CSV区切りのファイルを正しく区切って呼び出したい / けいち
お世話になります。
CSV区切りのファイルに

2023,3,1,"新規","20230215-0001",5,"箱No1,No2",1000

が保存されている時(実際は数万件あります)
たまに品名に半角カンマ「,」が含まれており品名は
ダブルクォーテーションで囲まれているのですが
数値などはダブルクォーテーションが付いていません。
SPLITを使うと品名まで分かれてしまいます。
1文字目で処理分けすると分けられるのですが件数が多い為に遅いです。
もう少しスッキリ早く終わるような方法はないでしょうか?
エクセルで開くと正しく読み込んでくれます(凄いですね)
以下コードです。

print "SPLITを使って区切りを,にした場合"
FID = fopen("data.csv",F_READ)
data = fget(FID,1)
FCLOSE(fid)
配列 = SPLIT(data,",")

for i = 0 to length(配列)-1
print 配列[i]
next

print "-------------------------------------"
print "1文字目で処理分けする"
data2 = data
while 0 < POS(",",data2)
//data2の一文字目が"
if "<#DBL>" = copy(data2,1,1) then
DBL = pos("<#DBL>",data2,2) //2個目の"を探す
print copy(data2,2,DBL-2)
data2 = copy(data2,DBL+2) //取得した分を消去

else
CAN = pos(",",data2) //,位置を探す
print copy(data2,1,CAN-1)
data2 = copy(data2,CAN+1) //取得した分を消去
endif
wend
print data2


-----結果-----
SPLITを使って区切りを,にした場合
2023
3
1
"新規"
"20230215-0001"
5
"箱No1
No2"
1000
-------------------------------------
1文字目で処理分けする
2023
3
1
新規
20230215-0001
5
箱No1,No2
1000

No.1576 2023/03/19(Sun) 04:46:19

Re: CSV区切りのファイルを正しく区切って呼び出したい / stuncloud
fgetがcsvに対応しているのでそれを使うのが一番簡単なのではないでしょうか

fid = fopen("data.csv", F_READ)
for i = 1 to fget(fid, F_LINECOUNT)
 col = 0
 while TRUE
  col = col + 1
  value = fget(fid, i, col) // 第三引数で列を指定
  if length(value) = 0 then
   // 値が空であればループを抜ける
   // このサンプルでは空の列があることを考慮していません
   break
  else
   print value
  endif
 wend
next
fclose(fid)

// 出力
2023
3
1
新規
20230215-0001
5
箱No1,No2
1000


ちなみにUWSCRであればsplit()でCSV分割ができるようになっているので以下のように書けます

fid = fopen("data.csv", F_READ)
for i = 1 to fget(fid, F_LINECOUNT)
 row = fget(fid, i)
 // 第5引数TRUEでCSV扱い、この場合第3第4引数は無視される
 csv = split(row, ",",,, TRUE)
 for value in csv
  print value
 next
next
fclose(fid)

// 出力
2023
3
1
新規
20230215-0001
5
箱No1,No2
1000

No.1577 2023/03/19(Sun) 11:46:15

Re: CSV区切りのファイルを正しく区切って呼び出したい / けいち
(解決)
stuncloud様
速く処理したいと1行まとめて読み込んだ結果
より遠回りをしてかえって遅くなっていたようです。
列読み込みをする方が速くなる事もあるんですね
何日も悩んであれこれ思いついた方法があっさりと覆され改善しました。
UWSCRもより拡張され使いやすくなっているのを知りました。
ありがとうございました。

No.1578 2023/03/19(Sun) 13:00:25
別ファイルのExcelのマクロをもう一つのファイルで使いたい / sen
excel_M = XLOPEN("マクロ.xlsm")
sleep(2)
excel= XLOPEN("転記先.xlsx")
sleep(2)
Excel.Run ("マクロ集!Macro1") //エラー

お世話になっております。
別ファイルのExcelのマクロをもう一つのファイルで使いたいのですが、
Runの部分でエラーになります。
()の書き方が違うのだと思いますが、分かりません。
ご教授頂けませんでしょぅか?

No.1574 2023/03/18(Sat) 15:22:40

Re: 別ファイルのExcelのマクロをもう一つのファイルで使いたい / sen
解決しました。
Excel.Run ("マクロ.xlsm!Macro1")
が正解でした。

やっぱり、uwsc最高です。
今後ともよろしくお願い申し上げます。

No.1575 2023/03/18(Sat) 15:37:04
XLGETDATAでアクティブセルの値を収得したい / sen
お世話になっております。

KBDを使用せずにXLGETDATAを使用したいのですが、
うまくいきません。
ヘルプには「省略された場合は現在の選択セル領域」と
書かれているので大丈夫そうなのですが、エラーがでます。
GETACTIVEOLEOBJを使用するのも考えたのですが、
どうしてもCOMエラーが走ります。
ご教授頂けましたら助かります。

DIM 受注番号
EXCEL = GETID("Nrb0000.CSV","XLMAIN",-1)
CTRLWIN(EXCEL,activate)
SLEEP(0.5)
受注番号=XLGETDATA(Excel)
//KBD(VK_CTRL,DOWN,10)
//KBD(VK_C,CLICK)
//KBD(VK_CTRL,UP)
SLEEP(0.5)
受注番号=GETSTR(0)
受注番号 = replace(受注番号,"<#CR>","")
print "受注番号="+受注番号+"■"

No.1560 2023/03/05(Sun) 21:41:06

Re: XLGETDATAでアクティブセルの値を収得したい / stuncloud
> EXCEL = GETID("Nrb0000.CSV","XLMAIN",-1)
> 受注番号=XLGETDATA(Excel)

ここが誤りです
XLGETDATAの引数はウィンドウIDではなくExcelオブジェクトです

No.1562 2023/03/06(Mon) 17:48:52

Re: XLGETDATAでアクティブセルの値を収得したい / sen
ご返事ありがとうございます。
下記のように書き換えたとき、
起動済みのエクセルを捕獲して欲しいのですが、
新しくエクセルを2重にファイルを開いてしまいます。
これは、どこが間違っているのでしょうか?

DIM 受注番号
id = GETID("Nrb0000.CSV","XLMAIN",-1)
CTRLWIN(id,activate)
SLEEP(0.5)
Excel = XLOPEN("Nrb0000.CSV")
受注番号=XLGETDATA(Excel)
SLEEP(0.5)
print "受注番号="+受注番号+"■"

No.1564 2023/03/07(Tue) 22:52:41

Re: XLGETDATAでアクティブセルの値を収得したい / stuncloud
> Excel = XLOPEN("Nrb0000.CSV")
で新しく開いているからです

すでに開いているものを操作する場合はgetactiveoleobjを使う必要があります
(COMエラーが出ると書かれていましたがそれについては詳細がわからないのでお答えできることはありません、ヘルプをよく見て正しく使ってください)
どうしてもだめそうなら、xlopenでファイルを開いて操作するという設計に変更することをおすすめします

No.1565 2023/03/08(Wed) 01:06:52

Re: XLGETDATAでアクティブセルの値を収得したい / sen
ありがとうございます。
会社のパソコンではうまく捕獲できました。
ただ、自宅のパソコンでは駄目で、下記のような過去のレスを参照してみたのですが、
うまくいきません。uwscは管理者と通常の両方でやってみましたが、うまくいきません。
comエラーは、「操作を利用できません」とでます。
家で作って、会社で活用するので何とかできるようになりたいのですが、
他のヒントはないでしょうか?
ご教授頂けましたら助かります。

//
//Excel.exeを管理者として実行していて、UWSCが通常実行だと同じエラーが表示されました
//Excelの実行方法とUWSCの実行方法に差異はないでしょうか?
//      UWSC管理者 UWSC通常
//Excel管理者   ○     ×
//Excel通常    ×     ○
//https://www3.rocketbbs.com/13/bbs.cgi?id=umiumi&page=2


DIM 受注番号
Excel = GETACTIVEOLEOBJ("Excel.Application")
id = GETID("Nrb0000.CSV","XLMAIN",-1)
CTRLWIN(id,activate)
SLEEP(0.5)
受注番号=XLGETDATA(Excel)
SLEEP(0.5)
print "受注番号="+受注番号+"■"

No.1566 2023/03/12(Sun) 13:08:47

Re: XLGETDATAでアクティブセルの値を収得したい / stuncloud
Excelの修復インストールを行うか、アンインストールして再インストールで改善されるか試してみてください
No.1567 2023/03/12(Sun) 17:57:42

Re: XLGETDATAでアクティブセルの値を収得したい / sen
ご返事ありがとうございます。
実は今日間違ってアンインストールをしてしまって、
慌てて、Excel2021を購入してみました。
しかし、comエラーは、「操作を利用できません」とでます。

No.1568 2023/03/12(Sun) 20:57:35

Re: XLGETDATAでアクティブセルの値を収得したい / stuncloud
Excelは64ビット版ですか?32ビット版ですか?
64ビットだとUWSCから使えない、ということがあるかもしれません
(UWSCが32ビットなので)

No.1569 2023/03/12(Sun) 23:46:43

Re: XLGETDATAでアクティブセルの値を収得したい / sen
64 ビットです。
No.1570 2023/03/13(Mon) 00:53:21

Re: XLGETDATAでアクティブセルの値を収得したい / sen
お世話になっております。

GETACTIVEOLEOBJを使用せずに、Excelオブジェクトを収得はできないものでしょう??

No.1571 2023/03/18(Sat) 10:55:54

Re: XLGETDATAでアクティブセルの値を収得したい / stuncloud
getactiveoleobjではなくcreateoleobjは成功しますか?
それも失敗するようであればそもそも32ビット版Excelでないと操作できないのでは?という話になります
32ビット版を試せるようならそちらでやってみてください

No.1572 2023/03/18(Sat) 11:31:12

Re: XLGETDATAでアクティブセルの値を収得したい / sen
ご返事ありがとうございます。

32ビット版は難しいのですが、XLOPENだとうまくいきます。

No.1573 2023/03/18(Sat) 13:45:43
VSCODEの環境 / taro
VSCODEでのUWSCの開発をしたいのですが、拡張機能がない旨のエラーメッセージがでて困っています。

https://marketplace.visualstudio.com/items?itemName=nalulabo.uwsc-support
上記のリンクも今一インストールの方法がわからず頓挫しております。

現在、詳細なインストール方法が掲載されているサイトをさがています。

ご存じの方がおられましたら、リンクをよろしくお願いします。

No.1561 2023/03/06(Mon) 14:02:45

Re: VSCODEの環境 / stuncloud
VSCodeの拡張機能のパネルを開いて、パネル上の検索バーで「UWSC」と入力して表示された拡張機能を選択し、インストールボタンを押すだけです
デフォルトのキーバインドであればCtrl+Shift+Xで拡張機能のパネルが開けます

ただしこの拡張機能はシンタックスハイライトしか提供されていないことに注意してください
(補完機能などはありません)

No.1563 2023/03/06(Mon) 17:54:37
処理が歯抜けになる / 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

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