[ 掲示板に戻る ]

過去ログ閲覧モード

配列の中を並び替えしたいです / mike
※掲示板の管理者さまへ
 この投稿の下に、同じ投稿があるので、削除をお願いします。




よろしくお願いします。

以下のようなアンケート結果があります。

15499票 ルフィ
8990票 ロロノア・ゾロ
11301票 ナミ
501票 ウソップ
9528票 サンジ
7786票 トニートニー・チョッパー
5624票 ニコ・ロビン
4325票 フランキー
1317票 ブルック

これを、票の多い順に並び替えがしたいです。


自分では配列に入れるところまではできました。

dim rank[]="15499票 ルフィ","8990票 ロロノア・ゾロ","11301票 ナミ","501票 ウソップ","9528票 サンジ","7786票 トニートニー・チョッパー","5624票 ニコ・ロビン","4325票 フランキー","1317票 ブルック"


この配列を、先頭から票の多い順に並べ替えたいのですがどうすればよいでしょうか?

↓このようにしたいです。
dim rank[]="15499票 ルフィ","11301票 ナミ","9528票 サンジ","8990票 ロロノア・ゾロ","7786票 トニートニー・チョッパー","5624票 ニコ・ロビン","4325票 フランキー","1317票 ブルック","501票 ウソップ"


QSORTで並べ替えができるようなのですが、説明を見てもよくわかりません。
varについても調べたのですが、これも説明を見てもピンときません。

表計算ソフトでもできるのですが、やりたいことは並び替えだけではないので、UWSCでやりたいです。


実際は、これよりもずっとキャラの数が多くて、手作業だときついです。

お知恵をお貸しください。
よろしくお願いします。

No.2609 2016/07/08(Fri) 09:11:08

Re: 配列の中を並び替えしたいです / stuncloud
> QSORTで並べ替えができるようなのですが
msgbox("QSORT前<#CR>" + join(rank, "<#CR>"))
qsort(rank, QSRT_NATURALD) // 並べ替える
msgbox("QSORT後<#CR>" + join(rank, "<#CR>"))

> この投稿の下に、同じ投稿があるので、削除をお願いします
掲示板の一番下のフォームからご自分で記事削除できますよ

No.2610 2016/07/08(Fri) 09:39:08

Re: 配列の中を並び替えしたいです / mike
stuncloudさん、ありがとうございます。

教えていただいたものですが、どうしてこうなるのか、全く理解できないという知識レベルです。すみません。


そのままやってみました。

dim rank[]="15499票 ルフィ","8990票 ロロノア・ゾロ","11301票 ナミ","501票 ウソップ","9528票 サンジ","7786票 トニートニー・チョッパー","5624票 ニコ・ロビン","4325票 フランキー","1317票 ブルック"

msgbox("QSORT前<#CR>" + join(rank, "<#CR>"))
qsort(rank, QSRT_NATURALD) // 並べ替える
msgbox("QSORT後<#CR>" + join(rank, "<#CR>"))


そうすると、「変数: QSRT_NATURALD が定義されていません」と表示されてしまいます。

どのようにすれば、並べ替えた配列にすることができますか。
コード自体が理解できないため、教えていただいたものに手を加えることができません。。


> 掲示板の一番下のフォームからご自分で記事削除できますよ

一応パスワードを設定したのですが、投稿時に再読み込みを何回かしたためか、投稿の編集・削除ができなくなってしまいました。
ですので、管理者さまに削除をお願いしています。

No.2611 2016/07/08(Fri) 12:51:12

Re: 配列の中を並び替えしたいです / stuncloud
>「変数: QSRT_NATURALD が定義されていません」
UWSC 5.1.1 で追加された定数です
それより前のバージョンでは使えません
最新版をダウンロードして試してみてくだい

No.2612 2016/07/08(Fri) 14:32:31

Re: 配列の中を並び替えしたいです / mike
知人と相談して考えてみました。

その間に返信までいただいて申し訳ないです。


stuncloudさんは、今回の場合の配列の並び替えではなく、QSORTの一般的な使い方を教えてくださったのですね。

やっと理解できました。


やっぱり、今回の場合の配列だと、簡単にできるものではないのですね。

No.2613 2016/07/08(Fri) 15:16:32

Re: 配列の中を並び替えしたいです / mike
stuncloudさん、ありがとうございました。
No.2614 2016/07/08(Fri) 15:19:24

Re: 配列の中を並び替えしたいです / stuncloud
> やっぱり、今回の場合の配列だと、簡単にできるものではないのですね。
いえ、今回の場合の話ですけど…?
QSRT_NATURALDによっておそらくご希望の通り数値が大きなものから順に並べ替えられるのを確認していますが、うまくいきませんでしたか?

No.2615 2016/07/08(Fri) 16:26:13

Re: 配列の中を並び替えしたいです / mike
お手数をおかけして大変申し訳ありません!

できました! あれだけ手間がかかっていた作業が一瞬でした・・・(涙)


最初、早くに返信くださっていたのに、レベルが低くてすみません。

stuncloudさんの技術がすごくて、いまだに、どうしてこれでうまくいくのか理解できませんが、
こんなド素人に何回も返信くださって、ご親切に感謝です。


stuncloudさんと、UWSCに感動しました。いや、まじです。

No.2616 2016/07/08(Fri) 17:12:15
最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / すすむ
これで最大化ボタンを押す設定をすると
なぜかニコニコにトップ(http://www.nicovideo.jp/?header )に
飛ばされます。なぜなんでしようか?
どのように修正すればいいのか教えて下さい

ddddd.uws
----- はじまり -----------

//最大化ボタン画像を設定する ---------------

fol1 = "D:\cap\"

saidai = "最大化ボタン画像"

bmp = ".bmp"

saidaiP = fol1 + saidai + bmp

// -----------------------------


// グーグルクロームの起動
EXEC("D:\GoogleChromePortable\GoogleChromePortable.exe" )
cid = GETID("Google Chrome","Chrome_WidgetWin_1",-1)

SLEEP(0.1)

ACW(cid,710,275,980,720,500) // ブラウザの位置サイズ固定


// ソリテアのURLを開く(※ニコニコには事前にログインしたままの状態にしておく)
// SCKEY(gid,VK_F6)
SENDSTR(cid,"http://app.nicovideo.jp/watch/ap349",1,True)
SCKEY(cid,VK_RETURN)

SLEEP(5)

MOUSEORG(cid,MORG_DIRECT,MORG_FORE) // ブラウザをターゲットして相対位置

CTRLWIN( cid, ACTIVATE ) // ブラウザをアクティブ

//最大化ボタンを押す
repeat
Sai = CHKIMG(saidaiP,,ST_X,ST_Y,,,1)
SLEEP(0.5)
until Sai
BTN(LEFT,CLICK,G_IMG_X+10,G_IMG_Y+10,25) // 最大化ボタンを押す

SLEEP(0.5)
sai = CHKIMG(saidaiP,,ST_X,ST_Y,,,1)
while sai
BTN(LEFT,CLICK,G_IMG_X+10,G_IMG_Y+10,25) // 最大化ボタンを押す
SLEEP(0.5)
CTRLWIN( cid, ACTIVATE ) // ブラウザをアクティブ
sai = CHKIMG(saidaiP,,ST_X,ST_Y,,,1)
wend

---------- end ---------

No.2592 2016/07/03(Sun) 11:19:46

Re: 最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / すすむ
補足 最大化ボタンは、ニコニコアプリ内の最大化ボタンです
ソリテアのゲームサービスを開始すると、右上の方に出てきます。
(サービス開始しないと出てきません)

No.2593 2016/07/03(Sun) 11:50:14

Re: 最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / ある
原因はCHKIMGで使用する画像に問題があるように思います。画像と画面を見てないので推測ですが。

最大化はCtrlwin(cid,max)ではダメなんでしょうか?
あとブラウザ操作系はIEでCOM操作の方が確実な事が多いと思います。
どうしてもクロームで!という拘りがあるのでなければ…

No.2595 2016/07/03(Sun) 17:56:12

Re: 最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / すすむ
返信ありがとうございます
>最大化はCtrlwin(cid,max)ではダメなんでしょうか?
ブラウザ全体の最大化はしたくいないのです

>画像と画面を見てないので推測ですが。
ちゃんと見てから返信して下さい。
何も見ないで適当に語られても、こちらは困ります

>どうしてもクロームで
どうしてもクロームでやりたいのです

No.2596 2016/07/03(Sun) 18:06:42

バグ、不具合の報告として補足します。 / すすむ
とりあえず、不具合、バグの報告として追記します。


最大化ボタン画像.bmp
www.fastpic.jp/images.php?file=8634927115.bmp

ブラウザのソリテア画面のキャプ
i.imgur.com/fpKTQg8.png



ddddd.uws
----- はじまり -----------

//最大化ボタン画像を設定する ---------------

fol1 = "D:\cap\"

saidai = "最大化ボタン画像"

bmp = ".bmp"

saidaiP = fol1 + saidai + bmp

// -----------------------------


// グーグルクロームの起動
EXEC("D:\GoogleChromePortable\GoogleChromePortable.exe" )
cid = GETID("Google Chrome","Chrome_WidgetWin_1",-1)

SLEEP(0.1)

ACW(cid,710,275,980,720,500) // ブラウザの位置サイズ固定


// ソリテアのURLを開く(※ニコニコには事前にログインしたままの状態にしておく)

SENDSTR(cid,"http://app.nicovideo.jp/watch/ap349",1,True)
SCKEY(cid,VK_RETURN)

SLEEP(5)

MOUSEORG(cid,MORG_DIRECT,MORG_FORE) // ブラウザをターゲットして相対位置

CTRLWIN( cid, ACTIVATE ) // ブラウザをアクティブ

//最大化ボタンを押す
repeat
Sai = CHKIMG(saidaiP,,ST_X,ST_Y,,,1)
SLEEP(0.5)
until Sai
BTN(LEFT,CLICK,G_IMG_X+10,G_IMG_Y+10,25) // 最大化ボタンを押す

---------- 終わり ---------



MOUSEORG(cid,MORG_DIRECT,MORG_FORE) の所を

MOUSEORG(cid,MORG_CLIENT,MORG_FORE) にすると安定したりする。


MORG_DIRECTにすると、なぜかChromeブラウザの一番左上の四角い画像の方を

クリックしてしまって、ニコニコのトップURL

( www.nicovideo.jp/?header )に飛ばされます

飛ばされたり飛ばされなかったり、PCの負荷や環境によって不安定です。

マウスカーソルがブラウザのどこかの画面クリックの位置にあったりすると

100% ニコニコのトップに飛ばされます。

No.2597 2016/07/04(Mon) 00:25:03

Re: 最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / miles
下記のようにすれば、最大化がクリックできるかと...
(一応確認はしましたよ)

repeat
// Sai = CHKIMG(saidaiP,,ST_X,ST_Y,,,1)
 Sai = CHKIMG(saidaiP)
 SLEEP(0.5)
until Sai
// BTN(LEFT,CLICK,G_IMG_X+10,G_IMG_Y+10,25) // 最大化ボタンを押す
MOUSEORG(0) // スクリーン座標に戻す
BTN(LEFT,CLICK,G_IMG_X+10+STATUS(cid,ST_X),G_IMG_Y+10+STATUS(cid,ST_Y),25)

No.2599 2016/07/04(Mon) 11:50:58

Re: 最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / ある
いえいえ、chkimgに使った画像がどんなものか確認のしようがないということですよ。
貼られてない以上、こちらで確認をすることは出来ませんでしたよね。伝わると思ったのですが、、、

No.2601 2016/07/04(Mon) 21:00:40

Re: 最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / すすむ


> 最大化ボタン画像.bmp
> www.fastpic.jp/images.php?file=8634927115.bmp


返信遅れましたが、
ここに貼ってありますよ。
ちゃんと見て下さいね

No.2604 2016/07/08(Fri) 01:13:49

Re: 最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / すすむ
>下記のようにすれば、最大化がクリックできるかと...
>(一応確認はしましたよ)
>repeat
>// Sai = CHKIMG(saidaiP,,ST_X,ST_Y,,,1)
> Sai = CHKIMG(saidaiP)
> SLEEP(0.5)
>until Sai
>// BTN(LEFT,CLICK,G_IMG_X+10,G_IMG_Y+10,25) // 最大化ボタンを押す
>MOUSEORG(0) // スクリーン座標に戻す
>BTN(LEFT,CLICK,G_IMG_X+10+STATUS(cid,ST_X),G_IMG_Y+10+STATUS(cid,ST_Y),25)


スクリーン座標に戻すのにMOUSEORG(0)という表現は初めて見ました
ありがとうございます。
なるべくならスクリーン座標という広大な範囲は使いたくないのですが
画像サムネイルを表示しただけで、誤検知する恐れもありますので
G_IMG_X+10+STATUS(cid,ST_X)という書き方も、参考になりました。ありがとうございます。
他の機会で使ってみようかと思います。

No.2605 2016/07/08(Fri) 01:19:43
uwscの基本的な使い方がわかった後の次のステップについて / シスイ
UWSCに出会ってパソコンでできることの可能性がかなり拡がりました。
UWSCの基本は理解できた後の次のステップとして、どの分野を勉強すればいいのでしょうか?
私のしたいことが、サイト作成やスクレイピングの精度向上等です。
よく、PowerShell(コマンドプロンプトの進化版)やvbscriptという単語を見かけるのですが、こちらを勉強すればいいのでしょうか?
質問ばかりで申し訳ないですが、回答頂ければありがたいです。

No.2587 2016/07/02(Sat) 09:36:00

Re: uwscの基本的な使い方がわかった後の次のステップについて / ある
気持ちわかります。僕もUWSCに出会ってすぐは発見の連続でした。
サイト作成、スクレイピングをということですが、これはどの程度の代物を目指すのかによるかと。
例えばスクレイピングで言えば、僕もしょっちゅうやっているけれど、今までUWSCの基本機能
(COM操作含む)だけで困ったことがありません。強いて言うなら正規表現は相性良いと思います。
必須とは思いませんが。
コマンドプロンプトも状況によって知っていると便利だなというものはいくつもありますね。
あとPro版の機能ですが、createformは無限の可能性を持っていると感じます。

勉強の仕方としてお勧めなのは、
1.自分の欲しい機能をリストアップしてそれらを全部自作する
2.周囲の人が求めている機能を聞いて、それらを作っていく
僕は1に関して一段落したので、今はだいたい2です。人の要望を聞くと、案外こっちの想定と
違う要望が多くて、普段自分がやり慣れている領域から離れたところで頭が使えて、良い刺激に
なると思います。自動化は大概の場合、結構重宝されますよね。

No.2588 2016/07/02(Sat) 10:04:23

Re: uwscの基本的な使い方がわかった後の次のステップについて / シスイ
あるさん、サイト作成、スクレイピングですが、wp(ワードプレス)での100ページぐらいの中規模サイト作成を想定しています。正規表現はたしかに、ほしい情報検索、情報タグ加工の際に役にたちそうですね。
CREATEFORMですが、私の中では使いみちがイメージできません。どういう使い方がありますでしょうか?

戻値 = CREATEFORM( HTMLファイル, タイトル, [平行処理フラグ, オプション指定, 幅, 高さ, X, Y] )

No.2589 2016/07/02(Sat) 12:02:27

Re: uwscの基本的な使い方がわかった後の次のステップについて / ある
まずは「uwsc_createform」で検索してみると良いと思いますよ。
参考になるところはいくつかあるので。

No.2594 2016/07/03(Sun) 17:47:48

Re: uwscの基本的な使い方がわかった後の次のステップについて / stuncloud
>サイト作成やスクレイピング
スクレイピングしたいならDOMの勉強ですかねぇ、ついでにHTMLやJavaScriptも覚えられますよ!
UWSCでサイト作成はちょっとなんのこっちゃという気もしますが、そっち方面でも役に立つ知識だと思います

>CREATEFORMですが、私の中では使いみちがイメージできません
createformは作業を行う際に自前のUIが欲しい、という場合に重宝します
HTMLベースなので上で書いた技術がそのまま役に立ちますよ!
※ 古いIEの仕様に縛られるのがちょいと厄介ですが

No.2598 2016/07/04(Mon) 10:46:58
元データの整形について / シスイ
CHGMOJの置き換えですが下記の文字列のaaaaa、bbbbbを取得方法ないでしょうか?正規表現とか調べてみたのですが、UWSCで正規表現を使う方法がいまいち分かりません。

[元データ]
[ID1]
id=aaaaa
[ID2]
id=bbbbb

[最終的にしたい形]
aaaaa
bbbbb

No.2590 2016/07/02(Sat) 13:38:41

Re: 元データの整形について / シスイ
解決しました、おさがわせしました!
No.2591 2016/07/03(Sun) 01:10:28
CHGMOJで整形がうまくできない。 / シスイ
下記のメモ帳に入力してある文字列をCHGMOJで置き換えして、最終的にはメールアドレスとパスワードを除いた空行のなくしたものにしたいのですが下記のコードではできません。どこが間違っているのでしょうか?

[前]
メールアドレス:aaaaaaaaa.wp-x.jp
パスワード  :bbbbbbbbbb

メールアドレス:ddddddddddd.wp-x.jp
パスワード  :eeeeeeeeee


[最終的にしたい形]

aaaaaaaaa.wp-x.jp
bbbbbbbbbb
ddddddddddd.wp-x.jp
eeeeeeeeee


[コード]

id = GETID("無題 - メモ帳","Notepad")
SCKEY(id,VK_ctrl,VK_a)
SCKEY(id,VK_ctrl,VK_c)
mozi = GETSTR(0)
CHGMOJ( mozi, "メールアドレス", " " )
CHGMOJ( mozi, "パスワード", " " )

No.2580 2016/07/01(Fri) 21:10:46

Re: CHGMOJで整形がうまくできない。 / リキュール
以下ではどうですか。
mozi = CHGMOJ( mozi, "メールアドレス:", "" )
mozi = CHGMOJ( mozi, "パスワード  :", "" )
mozi = CHGMOJ( mozi,"<#CR><#CR>","<#CR>")

No.2581 2016/07/01(Fri) 21:35:45

Re: CHGMOJで整形がうまくできない。 / シスイ
リキュールさん、できません、CHGMOJの置き換えがまったく機能しなくて、全選択とコピーだけがなる状態です。
No.2583 2016/07/01(Fri) 23:40:31

Re: CHGMOJで整形がうまくできない。 / ある
リキュールさんのコードでいけるはずですよ。こちらでは問題なかったです。
シスイさんのコードはCHGMOJの前に「mozi=」が入っていないことが原因ではないでしょうか。
あとメモ帳からの文字取得はSCKEYよりGETSTRをお勧めします。
このままコピペしてみて下さい。

id=GETID("無題 - メモ帳","Notepad")
mozi=GETSTR(id)
mozi = CHGMOJ( mozi, "メールアドレス:", "" )
mozi = CHGMOJ( mozi, "パスワード  :", "" )
mozi = CHGMOJ( mozi,"<#CR><#CR>","<#CR>")
print mozi

No.2584 2016/07/02(Sat) 01:08:01

Re: CHGMOJで整形がうまくできない。 / シスイ
リキュールさん、できました、私が初歩的なミスをしてました、mozi = CHGMOJが原因でした。
ありがとうございました。

No.2585 2016/07/02(Sat) 07:05:58

Re: CHGMOJで整形がうまくできない。 / シスイ
あるさん、コードをコピペさして頂きできました。mozi=GETSTR(id)という使い方ができるんですね。
SCKEYでコピーをしてそれを、GETSTR(0)にしないとできないと思ってました。また、CHGMOJの前に「mozi=」が原因だったんですね。丁寧な解説ありがとうございました、助かりました。

No.2586 2016/07/02(Sat) 07:09:26
C#とuwscでの共有メモリとプロセス間通信 / skyhand
C#からuwscへ共有メモリを用いて数値(や文字列)を
送信するプロセス間通信についての質問です
(途中にC++の話も出てきますが、最終目標は上記の通りです)
以下において、送信側をサーバー、受信側をクライアントと表記します。

しろまささんのHPにある
「共有メモリを使用しプロセス間通信 (文字列のみ) ⇒ Class_SharedMemory.uws」
を参考にクライアントを作成し
C#でサーバー側を作成して
おそらく、共有メモリの作成・アクセスは成功しているのですが
文字化けが発生してしまい、正しく通信が出来ていません
言語間における型の取り扱いが原因だと推測していますが
サーバー・クライアントのどちらをどのように改良すれば
いいのか分からず困っています

・やってみたこと
【C# → uwsc】
MemoryMappedViewAccessorのwrite(引数1,引数2)で
引数2を色々なパターンで書き込みして
uwsc側はlstrcpyで受け取りましたが、文字化けが解消できず

・試しにやったこと
【C++ → uwsc】
reinterpret_cast<char*>で変換した文字列をstrncpyで
書き込み、lstrcpyで受け取りしたら、文字化けせず成功

【C# → C++】
C# → uwscと同じような文字化け発生

以上より、C++ → uwscで成功した手順と同じようなものを
C#側で作ればいいと思うのですが、分からず困っています
色々調べる中で、単純に同じ手順を踏む方法は存在せず
バイト列等に変換して受け渡す必要があるのかとも思っています

プログラミングやwinAPIについては初心者レベルで
わかりにくい質問文となってしまい申し訳ありませんが
急ぎませんので、どなたかアドバイスお願い致します
必要であれば、参考にしたサイトのURL等提示できます

No.2553 2016/06/28(Tue) 11:28:36

Re: C#とuwscでの共有メモリとプロセス間通信 / しろまさ
C#は全く触れたことありませんが^^

多分日本語がNGなので、文字列を直接Base64変換してやり取りすればいけるんじゃないですかね?
C#   http://www.atmarkit.co.jp/fdotnet/dotnettips/799base64/base64.html
UWSC http://siromasa.html.xdomain.jp/uwsc/u_term/32_SyorinoKousokuka.html


ps バイト配列にしてBase64で送ればファイルも転送できるんだろうなぁ・・(他力本願^^

No.2554 2016/06/28(Tue) 11:40:21

Re: C#とuwscでの共有メモリとプロセス間通信 / しゅん
確認するのが面倒なので、未確認ですみません。
以下のいずれかで大丈夫かと思います。
・lstrcpyはAを使ってますよね?Wでwstring定義でやってみてください
・もしくは、C#側でShift-JISコードで出力してください

ただ、C#使うならUWSCがPowerShell関数使って、.net remotingの方が良い気もします。

No.2555 2016/06/28(Tue) 19:33:35

Re: C#とuwscでの共有メモリとプロセス間通信 / skyhand
返信ありがとうございます

しろまささん
しろまささんは落し物部屋のご本人様でしょうか?
あのサイトにいつも助けられています

しゅんさん
代替案ありがとうございます。
ただ完全に初見の方法なのでまず調べてからでないと手が出せない状況です
もし、そちらの方針の方が良さそうであれば方向転換も検討します

お二人にアドバイスを頂いた上で以下の部分で詰まっています

C#側のサーバープログラムは
http://devlights.hatenablog.com/entry/20101123/p1
上記サイトを「まず書き込み側。」でページ内検索して直下に記載されているソースを
利用しています

Base64あるいはShift-JISコードに変換した後
MemoryMappedViewAccessor クラスのメソッド(下記URL参考)はどれを用いて書き込めば
よいのでしょうか?
https://msdn.microsoft.com/ja-jp/library/system.io.memorymappedfiles.memorymappedviewaccessor(v=vs.110).aspx


また、クライアント側のUWSCソースは以下を用いています
このソースでC++からは(半角英数、日本語とも)文字化け無く受信出来ています
C#からだと、(半角英数、日本語とも)文字化けを起こします

// 共有メモリ用
Const PAGE_READWRITE = 4
Const FILE_MAP_READ = 4 // 読取専用
Const FILE_MAP_WRITE = 2 // 読書両用
DEF_DLL CreateFileMappingA(Long, Long, Dword, Dword, Dword, String): Hwnd: Kernel32.dll
DEF_DLL MapViewOfFile(Hwnd, Dword, Dword, Dword, Long): Long: Kernel32.dll
DEF_DLL UnmapViewOfFile(String): Bool: Kernel32.dll
DEF_DLL CloseHandle(Hwnd): Bool: Kernel32.dll
DEF_DLL lstrcpyA(Long, String): String: Kernel32.dll
DEF_DLL lstrcpy(var String, Long): Long: Kernel32.dll

Dim Hnd_FileMap, read_FileMap
Dim MapName = "my_shared"//共有メモリ名

Hnd_FileMap = CreateFileMappingA(-1, 0, PAGE_READWRITE, 0, 64, MapName)
read_FileMap = MapViewOfFile(Hnd_FileMap, FILE_MAP_WRITE, 0, 0, 0)

Str = Format(Chr(0), 10)
lstrcpy(Str, read_FileMap)// 文字列読取
print "受信:" + str

UnmapViewOfFile(read_FileMap)
CloseHandle(read_FileMap)

No.2557 2016/06/28(Tue) 21:16:54

Re: C#とuwscでの共有メモリとプロセス間通信 / skyhand
追記
上で記載したC#のサイトとUWSCのソースで共有ファイル名が異なっていますが
その部分は同じ名前になるよう書き換えています

No.2558 2016/06/28(Tue) 21:23:16

Re: C#とuwscでの共有メモリとプロセス間通信 / しろまさ
C#側のサーバープログラム(http://devlights.hatenablog.com/entry/20101123/p1)の中ほどに、
> 文字列の場合は、バイト配列に変換してWriteArrayで書き込みます。
と書いてありまして、コードも記載されてます。

UWSC側は、DECODE の CODE_BYTEARRAY // バイト配列から戻す
で行けるかな? 未検証です^^

ps
 この掲示板で しろまさ と名乗るのは多分私一人です。
 長々やっておりますが、常に多くの方々から勉強させて頂いている日々です。
 私もまだまだ初心者ですので色々教えて下さいませ^^

No.2561 2016/06/29(Wed) 08:48:48

Re: C#とuwscでの共有メモリとプロセス間通信 / skyhand
受け取り側のUWSCでlstrcpyのAやWを使ってみたのですがうまくいきませんでした

その後、ネットを徘徊して下記ソースを見つけました
http://ameblo.jp/pink-green-onion/entry-10375278948.html
使用するAPIをC#用にマーシャリングする方法を取っており
実行してみたところ、
一応、文字化けはなくなりましたが新たな問題が発生しました
UWSC側のクライアントは3つ上のレス内ソースを利用しています
(見つけたのが今日の早朝で自分自身まだ十分に検証実験出来てませんが、
進展の助けになりそうなので、書き込んでいます)

【問題1】
半角英数の文字列を送信した場合、UWSC側で最初の1文字だけしか受信できない
例 「12345」や「abcde」を送信すると「1」「a」となる

【問題2】
日本語文字列を送信した場合、全文字数分受信はできているが
UWSC側でShift-JISコードが表示される
これに関しては、問題と言うより当然の動作で
今、UWSC側で受信後デコードする方法を探しています

なぜ、日本語文字列は全数受信出来るのに、半角英数だと1文字になってしまうのか・・・謎です
テキストファイルを媒介にしたやりとりから、共有メモリに変更しようとして
かれこれ10日間ぐらい足踏みしてます

PS
やはりご本人様でしたか!
ネット上の情報を頼りに独学で勉強しているので
丸々コピペで動くサンプルソースを沢山公開していただけるのはホントにありがたいです
目的の動作と多少違っても、大きな手がかりになります
あと、丁寧なコメントが付いているのも理解の助けになります
本当にありがとうございます

No.2562 2016/06/29(Wed) 10:16:54

Re: C#とuwscでの共有メモリとプロセス間通信 / skyhand
まだ完全に理解出来たわけではありませんが
とりあえず目的の動作は達成出来ました

>>UWSC側は、DECODE の CODE_BYTEARRAY // バイト配列から戻す
>>で行けるかな? 未検証です^^

というヒントを頼りに

・「UTF8」でバイト配列に変換後、accessor.WriteArrayで書き込み
・lstrcpy(var String, Long)で受信後、decode

という方法で、半角英数文字列・日本語文字列のやり取りを達成出来ました

それから、ここが一番よく分からないのですが
しろまささんHPにある「Class_SharedMemory.uws」でまず1回送受信を行い
「UWSC側」から共有メモリを作っておく?のもポイントの様です
(未検証ですが、要はUWSC側から一度共有メモリ作成をすればいいと思われます)
これがなぜ必要なのか不明ですが、色々試す中で分かったことであり
つまずいた最大の原因でもあります

最期にヒントになったサイトのURLを貼っておきます
http://devlights.hatenablog.com/entry/20101123/p1
http://stackoverflow.com/questions/10806518/write-string-data-to-memorymappedfile
http://siromasa.html.xdomain.jp/uwsc/u_sample/DLL/Class_SharedMemory.uws

返信していただいたお二方、また他にも考えて頂いた方がいらっしゃいましたら
本当にありがとうございました

No.2568 2016/06/29(Wed) 19:31:12

Re: C#とuwscでの共有メモリとプロセス間通信 / しゅん
おっと、解決済みでしたか。
では、参考まで。

http://d.hatena.ne.jp/junjun777/20160630/powershell_and_uwsc

No.2572 2016/06/30(Thu) 08:52:01

Re: C#とuwscでの共有メモリとプロセス間通信 / しろまさ
skyhandさん、目的動作達成おめでとうございます^^

私も後学のためにコードを読みたいです!(特にC#側)
見せられる範囲だけでも siromasa@ の gmail.com に送って頂けたら幸いです。


しゅんさん、PowerShell版ありがとうございます。
これも宝物として個人倉庫に保存しておきます。

> 他PCとの通信
やっぱsoketですよね。いまかなり嵌ってます^^

No.2573 2016/06/30(Thu) 09:15:05

Re: C#とuwscでの共有メモリとプロセス間通信 / skyhand
しゅんさん
しゅんさんはじゅんじゅんさんなんですか!
こちらのサイトもめちゃめちゃ参考にさせてもらってます
というより、
http://d.hatena.ne.jp/junjun777/20110808/uwsc_morse_code
このページの解決策の中で
メモリ共有、名前付きパイプ、DLL
RAMDISK?でもOS64bitになってから使ってないし・・・
(よりによってモールスやってるー泣)
あたりが自分の中で候補になって、
ブログコメントでおすすめを聞こうか迷ったのですが
なんとなく聞けず、適当に共有メモリを選択した経緯があります
人見知りせず方針だけでも聞けばよかった
PowerShellについては完全初見なので、ネット徘徊して調べてみます
わざわざ作って頂いてありがとうございます


しろまささん
色々試行錯誤したせいでコードがぐちゃぐちゃになってると思うので
ちょっと整理してから、近日中に遅らせていただきます
少々お待ちくださいませ


次は、どういうフォーマットで通信しようか
JSONなのか独自でなにか実装するのか
悩みは尽きませんが、おかげ様でなんとか前進出来ました

No.2574 2016/06/30(Thu) 10:27:21

Re: C#とuwscでの共有メモリとプロセス間通信 / skyhand
コードを整理している間に、冷静に考えて
しろまささん作のプログラムを最初に1回実行しなければいけないのは
絶対におかしいと思い、試しているうちに色々バグを見つけました

まず、自分が提示したUWSC側クライアントソースの
誤:CloseHandle(read_FileMap)は
正:CloseHandle(Hnd_FileMap)じゃなきゃダメですね
これで戻り値は成功の0以外の値(というかtrueの1?)が返るはずです
https://msdn.microsoft.com/ja-jp/library/cc429605.aspx
これは、おそらくしろまささんソースから引用する際に
私が間違えました

そして、UnmapViewOfFileもDLL定義の引数型が原因で
成功していなかったと思われます
以下の訂正で成功の0以外が返るはずです
https://msdn.microsoft.com/ja-jp/library/cc430200.aspx
こちらはしろまささんのプログラム中でも
バグの原因になっているっぽい?

誤:DEF_DLL UnmapViewOfFile(String): Bool: Kernel32.dll
正:DEF_DLL UnmapViewOfFile(Long): Bool: Kernel32.dll

さらに、開放した共有メモリが消えるタイミングについてずっと疑問だったのですが
http://d.hatena.ne.jp/junjun777/20160630/powershell_and_uwsc
>>入力待ちの間に実行しないと、誰も参照していないMemoryMappedFileはOSが解放するので、
>>なくなってしまいます。

とある通り、例えばしろまささん作のClass_SharedMemory.uwsを実行したとして
書き込みと読み込みを一通り終えて、プロセスが終了したら
共有メモリファイルは消えるはずだと思うのですが多分消えてません
再度読み込みのみ実行しても、前に書き込んだ値を取得出来てしまいます

これは、上記の間違い等によるものだと思いますが
プログラムを正しく使えているのか自信が無く
ソースも完全に理解しているわけではないので
確信は無いですが、読み込み終了後
UnmapViewOfFile、CloseHandleは0が返り失敗しているのでは?と思います
(もし私の勘違い・間違いだとしたらあらぬ疑いをかけてしまい申し訳ないです)

そして最初の疑問に戻るのですが
しろまささんのプログラムを1回実行しておくとうまくいくのは
作成した共有メモリが消えずに残っていて
それをC#側サーバーやUWSCクライアントが利用することで
偶然うまく通信ができていたのではないかと思いました

まとめると、しろまささんのプログラムには共有メモリ解放にバグがあり
私が作ったC#側やUWSCプログラムにはメモリ作成にバグがあり
その双方がたまたま良い方に働いて通信できていたのではという仮説です
(バグがあるのに、じゃあなぜ通信出来ているのかは依然疑問ですが・・・)

仮説が正しければ、とりあえず通信は出来たとしても
共有メモリが消去されずメモリリークの原因になると思われます

PS
しろまささんにお願いなのですが、急ぎませんのでお時間があるときに
Class_SharedMemory.uws
が正しく動作しているかチェックしていただけないでしょうか?
また、ちゃんとコードを整理してからお送りしようとしたのですが
もしかしたら解決の助けになるかもしれないので
(おそらくバグ持ちですが)私が作ったコードをできるだけ早めにメールさせていただきます

しゅうさん作PowerShell版への誘惑もありますが
もうちょい色々やってみるつもりです

No.2575 2016/06/30(Thu) 17:25:41

Re: C#とuwscでの共有メモリとプロセス間通信 / しゅん
はい、あのブログの管理者で、技術力の無駄遣いが好きな人間です。
(リンク先にもあるように、技術的に興味がないと答えない、ひどい人でもあります)

確かに、UWSCスクリプトに誤りがありましたね。
ブログ修正しました。(DEF_DLL UnmapViewOfFileとCloseHandleの引数)
修正前は、PowerShellスクリプトが終了しても、UWSCから読めてましたが、修正後はPowerShellスクリプトが終了すると、読めなくなりました。
ちなみに、PowerShellをC#に変更して使われる、と思ってたのですが、、、違うんですね。


なお、おすすめは、同PC内限定ならMemoryMappedFileです。
やはり早いし、比較的単純に組めます。
他PCも視野に入れUWSCが絡むなら、名前付きパイプかソケット(TCP/UDP)になります。

ソケットを使うなら、
http://d.hatena.ne.jp/junjun777/20131110/uwsc_winsock
が参考になるかと思います。

でも、同PC内では非表示の受け渡し用ウインドウに書く、というのもよく使う手です。
http://d.hatena.ne.jp/junjun777/20141114/uwsc_notifyIcon

No.2576 2016/06/30(Thu) 18:26:56

Re: C#とuwscでの共有メモリとプロセス間通信 / しろまさ
skyhandさん、ご指摘ありがとうございます。
重い腰を上げ、9年ぶりに見直しました^^(自分で使用してないのがバレバレ)

型違いもそうでしたが、関数引数の順番を間違えてることに気が付きました!
必要ないかもしれませんが、修正版を上げておきました。

お騒がせしました〜^^

No.2577 2016/06/30(Thu) 18:36:48

Re: C#とuwscでの共有メモリとプロセス間通信 / skyhand
しろまささんが一度メモリを作っておくとうまくいく謎を解明してくれました
感謝感謝です

直接的な原因は、私が作ったC#側のプログラムにおいて
メモリ解放を待つためにプロセスを待機させるタイミングにミスがありました
具体的には、書き込み後解放前に待機動作を入れなければいけないのに
解放後に待機させるという謎実装をしてました

そのため、自分の作ったサーバー・クライアントプログラムのみを実行すると
C#で書き込み直後にメモリ解放を行ってしまい
UWSCでは無くなったメモリを再度作成後、空の状態(正確には状態不明?)のメモリを読む
という動作になってました

だから、メモリ解放をしないプログラムを事前に実行しておくと
たまたまメモリが残ってくれて、読み取れてしまうと
そういうお話でした

しゅんさんの
>>入力待ちの間に実行しないと、誰も参照していないMemoryMappedFileはOSが解放するので、
>>なくなってしまいます。

大ヒントでした

以上とは別にUWSCが固まるときがあるようなので
要検証ですがとりあえずすっきりしました

開放するタイミングの実装についてちょっと考えたのですが
難しいですね
繰り返し通信する場合は毎回メモリ作りなおすのが普通なのでしょうか?
このあたりはプロセス間同期の領域になるんですかね

No.2582 2016/07/01(Fri) 22:14:26
IFBでfukidasiを個々の画面に応じて切替。 / ぽんきち
fukidasiテロップを個々の画面に応じて切り替えるにはどのようにしたらいいでしょうか?GETIDから画面情報を取得しそれを判別するのでしょうか?UWSC初心者なので詳しく教えて下さい。
No.2559 2016/06/28(Tue) 23:35:43

Re: IFBでfukidasiを個々の画面に応じて切替。 / ある
状況が想定しにくいのでもう少し具体的に書かれた方が答えやすいかもです。
例えばyahooからgoogleに切り替わった時にfukidasi文字を「yahooです」を「googleだよ」としたいのであればgetidとstatus、あるいはgetactiveoleobjなど使えばいけます。画面を監視し続ける場合はwhile trueが一般的です。

No.2560 2016/06/29(Wed) 07:21:58

Re: IFBでfukidasiを個々の画面に応じて切替。 / ぽんきち
済みません、例えば携帯などのデータ移行ツール(アプリ)の操作をを自動化。
UWSC起動 → アプリ起動 → xxキーを押して下さい(仮想キー) →  次の画面へ → 自動作業 MMV(座標)BTN(left、click、xx)等々・・・ → 次の携帯に取り換えますか?→ 接続 → 繰り返し/スペース選択 → 繰り返し/終了処理。
などの操作補助的な説明を個々の画面と同時に切り替えたいと思っております。因みに通電(USB)しているかの判断、判別などUWSCではできませんよね?
サンプルコードもあるのですが、中を確認するにダイアログボックスの値で判断しているのではないかなっと思うのですが。それとwhile文とIFB文はかなり使用しているコードです。分かりにくい説明で本当に失礼なのですが、ご教示頂きたく思います。><;

No.2567 2016/06/29(Wed) 19:28:29

Re: IFBでfukidasiを個々の画面に応じて切替。 / ある
コードもアプリもわからない以上何とも言えないですが、
ウインドウタイトルやウインドウ中の文字取得はできると思いますよ(サンプル#N30とか)。
どこで困っているかもイメージがつかず、お力になれず申し訳ないです。

No.2569 2016/06/29(Wed) 21:02:50

Re: IFBでfukidasiを個々の画面に応じて切替。 / ぽんきち
因みに、SENSOR関数に詳しいでしょうか?電流を感知したら起動するということはできるでしょうか?
一部コードを記載します。現在は下記の様にmsgboxにて起動判断をしEXECでリンク先から立ち上げて操作を開始するような形になっています。私もすべて把握しているわけではないので、下記のコードを見てここから先がどうなってるか分からないとどうしようもない、っという箇所があれば言ってください、記載します。宜しくお願いします。

PUBLIC msgx = 100
PUBLIC msgy = 100

m_px=200
m_py=200
f_at=0
f_size=30
f_kind=20
ok_f_color=0
ok_b_color=$00FF00
n_b_color=0

err_m_px=200
err_m_py=200
f_color=0
ng_f_color=$0000FF

// アプリ起動

ifb MsgBox("起動しますか?", BTN_YES or BTN_NO) = BTN_YES


s="電源をONし設定できる状態にして下さい。"+"<#cr>"
// Fukidasi(s, 100, 100, 0, 20)
Fukidasi(s, m_px, m_py, f_at, f_size, f_kind, ok_f_color, n_b_color)
endif
  while true

  ifb GETKEYSTATE(VK_SPACE) then
break
endif

wend

s="起動中。しばらくお待ちください。"+"<#cr>"
// Fukidasi(s, 100, 100, 0, 20)
Fukidasi(s, m_px, m_py, f_at, f_size, f_kind, ok_f_color, n_b_color)

//endif // test

// アプリ 起動
ICE_ID = GETID("xxxxxxxxxxxxxxxxxxxxxxxxxx")
ifb ICE_ID < 0 // 存在してなければ起動
ICE_ID = EXEC("xxxxxxxxxxxxxxxxxxxxxxxxx")

// 検知
ACW(GETID("xxxxxxxxxxxxxxxxxxxxxxxx"),-4,-4,1374,746,0)

No.2570 2016/06/29(Wed) 22:46:54

Re: IFBでfukidasiを個々の画面に応じて切替。 / ある
残念ながらSENSORは一度も触ったことがなく、また試せる環境もないです。
No.2571 2016/06/30(Thu) 06:04:30
再生(またはストリーミング放送)していないVLCを消す方法を教えて下さい / すすむ
VLCメディアプレイヤーで、再生していないまたは、ストリーミング放送してない
終了しているVLCメディアプレイヤー全部を消す方法を教えて下さい

自分である程度、知恵をしぼってクラス名取得などをしたんですが
うまく組み合わせができませんでした。

再生時のクラス名 : VLC video output 0195FA28
停止時のクラス名 : QWidget

FOR SSS=1 TO 50
VID = GETID("VLCメディアプレイヤー","QWidget",0.1)
IF VID < 0 THEN Break
CTRLWIN( VID , CLOSE)
NEXT

これで、QWidgetを終了させると再生している物まで消去していしまいます
QWidgetは再生していてもしてなくても、窓枠のタイトルのクラス名がQWidgetであるために
判別ができずに一緒に消去されてしまうのです。

どうやって分別つけて振り分けて消せば良いのか、良いお知恵を下さい。m(__)m

No.2565 2016/06/29(Wed) 16:31:01

Re: 再生(またはストリーミング放送)していないVLCを消す方法を教えて下さい / すすむ
すいません。自己解決しました
GETALLWIN関数を見つけて試行錯誤したらいけました。

n = GETALLWIN()
IFB n > 0
FOR i = 0 TO (n - 1)
AL2= STATUS(ALL_WIN_ID[i], ST_TITLE)
IF AL2="VLCメディアプレイヤー" Then CTRLWIN(ALL_WIN_ID[i],CLOSE)

NEXT
ENDIF

No.2566 2016/06/29(Wed) 18:09:37
IEで確認ダイアログを表示せずに画面を閉じる / rin
初心者です。

スクリプトの終了時に「ウィンドウは、表示中のWebページにより閉じられようとしています。
このウィンドウを閉じますか?」と表示されます。

この確認ダイアログを表示させずに終了する方法はありますか。

宜しくお願い致します。

No.2552 2016/06/27(Mon) 10:30:20

Re: IEで確認ダイアログを表示せずに画面を閉じる / しゅん
再現する最小のスクリプトを提示すれば、アドバイスがつくかもしれませんよ!
ただ単にUWSCからIE開いて閉じても、ダイアログは出ませんからね。
(どういう条件で出るか忘れました)

No.2556 2016/06/28(Tue) 19:35:14

Re: IEで確認ダイアログを表示せずに画面を閉じる / stuncloud
window.close() が呼ばれた場合に
>「ウィンドウは、表示中のWebページにより閉じられようとしています。
>このウィンドウを閉じますか?」

のプロンプトが表示されます

ただ、それをUWSCでやるとしたら例えば
ie.document.parentWindow.close()
なんてことをしなければならないのですが、わざわざこんな書き方しないですよね…?

あるとすれば window.close() を呼ぶボタンやリンクをクリックした場合?
そうであれば、それらのボタンまたはリンクを押さずに ie.Quit() すれば良いと思います

No.2563 2016/06/29(Wed) 10:25:18

Re: IEで確認ダイアログを表示せずに画面を閉じる / rin
しゅん様、stuncloud様ご返信ありがとうございます。

stuncloud様に教えて頂いた方法でダイアログを表示せずに
画面を閉じることが出来ました。

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

No.2564 2016/06/29(Wed) 14:05:03
8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / シスイ
8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット)を作成したいのですが、下記のスクリプトでは先頭が数字になる場合があります。

先頭はアルファベットで数字とアルファベットの組み合わせの文字列の作成する方法ないでしょうか?
宜しくお願いします。

IDPASS = “” //文字列10個出力 FOR A = 1 TO 10 //文字数は8文字 FOR B = 1 TO 8 IDPASS = IDPASS + RETURNCHAR() NEXT IDPASS = IDPASS + “” NEXT SENDSTR(EXEC(“NOTEPAD”),IDPASS) FUNCTION RETURNCHAR() LETTER = CHR(97 + RANDOM(26)) //アルファベットの小文字、大文字、数字を出す SELECT RANDOM(3) CASE 0 //小文字はそのまま RESULT = LETTER CASE 1 //大文字を出す場合は変換 RESULT = STRCONV(LETTER,SC_UPPERCASE) CASE 2 //数字の場合は0〜9をランダムに出す RESULT = RANDOM(10) DEFAULT RESULT = LETTER SELEND FEND

No.2538 2016/06/24(Fri) 03:56:33

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / stuncloud
// RETURNCHAR()をちょっと手直しして引数でTRUEを渡すと数値を返さないようにする

IDPASS = RETURNCHAR(TRUE) // 1文字目は数値なしを受ける
for i = 2 to 8
 IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む
next
msgbox(IDPASS)

FUNCTION RETURNCHAR(exludeNumber = FALSE)
 LETTER = CHR(97 + RANDOM(26)) //アルファベットの小文字、大文字、数字を出す
 if exludeNumber then n = 2 else n = 3 // exludeNumberがTRUEの場合はcase 2に行かないようにする
 SELECT RANDOM(n)
  CASE 0 //小文字はそのまま
   RESULT = LETTER
  CASE 1 //大文字を出す場合は変換
   RESULT = STRCONV(LETTER,SC_UPPERCASE)
  CASE 2 //数字の場合は0〜9をランダムに出す
   RESULT = RANDOM(10)
  DEFAULT
   RESULT = LETTER
 SELEND
FEND

No.2539 2016/06/24(Fri) 09:54:33

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / シスイ
stuncloudさん  返信ありがとうございます。さっそく試してみたのですが、確かに8桁のランダムなアルファベットを1つ作成できました。これを10個、1つのメモ帳に入力したいのですが、色々やってみてみメモ帳が10個開き、メモ帳1つ1つに1つの8桁が入力になってしまいます。
何か、良い方法はありませんでしょうか?


// RETURNCHAR()をちょっと手直しして引数でTRUEを渡すと数値を返さないようにする

IDPASS = ""
//文字列10個出力
FOR A = 1 TO 10
IDPASS = RETURNCHAR(TRUE) // 1文字目は数値なしを受ける
for i = 2 to 8
 IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む
next


 IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む

SENDSTR(EXEC("NOTEPAD"),IDPASS)
next
FUNCTION RETURNCHAR(exludeNumber = FALSE)
 LETTER = CHR(97 + RANDOM(26)) //アルファベットの小文字、大文字、数字を出す
 if exludeNumber then n = 2 else n = 3 // exludeNumberがTRUEの場合はcase 2に行かないようにする
 SELECT RANDOM(n)
  CASE 0 //小文字はそのまま
   RESULT = LETTER
  CASE 1 //大文字を出す場合は変換
   RESULT = STRCONV(LETTER,SC_UPPERCASE)
  CASE 2 //数字の場合は0〜9をランダムに出す
   RESULT = RANDOM(10)
  DEFAULT
   RESULT = LETTER
 SELEND
FEND

No.2542 2016/06/24(Fri) 12:22:50

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / stuncloud
exec("notepad") を10回やっているからです
メモ帳を開くのは一回だけにすればいいです

id = exec("notepad") // 予め開いとく
for A = 1 to 10
 // 省略
 SENDSTR(id, IDPASS + "<#CR>") // 書き込むときに改行を付け加えると10個それぞれ別の行になる
next

単純にテキストファイルに書き出したいだけならメモ帳に書くのではなくfopen, fput, fcloseを使ったほうが良いです

No.2543 2016/06/24(Fri) 13:41:47

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / リキュール
これではどうでしょうか。

// RETURNCHAR()をちょっと手直しして引数でTRUEを渡すと数値を返さないように

する
IDPASS = ""
//文字列10個出力
FOR A = 1 TO 10
IDPASS = IDPASS + RETURNCHAR(TRUE) // 1文字目は数値なしを受ける
for i = 2 to 8
  IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む
next
 IDPASS = IDPASS + "<#CR>" // 連続したい場合はこの行を削除
next
SENDSTR(EXEC("NOTEPAD"),IDPASS)
//以下同じ

No.2544 2016/06/24(Fri) 14:39:03

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / シスイ
stuncloudさん ありがとうございます、できました。

最終的にしたいことがエクセルのA1からA10にランダムに作成した数字文字列を入力したいのですが、色々試してみた所、A1からA10に同じランダムな数字文字列が入力になってしまいます。
何か、良い方法ありませんでしょうか?


Excel = XLOPEN("hoge.xlsx")

id = exec("notepad") // 予め開いとく
IDPASS = ""
//文字列10個出力
FOR A = 1 TO 10
IDPASS = RETURNCHAR(TRUE) // 1文字目は数値なしを受ける
for i = 2 to 8
 IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む
next


 IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む
XLSETDATA( Excel, IDPASS + "<#CR>", "a1:a10")

next
FUNCTION RETURNCHAR(exludeNumber = FALSE)
 LETTER = CHR(97 + RANDOM(26)) //アルファベットの小文字、大文字、数字を出す
 if exludeNumber then n = 2 else n = 3 // exludeNumberがTRUEの場合はcase 2に行かないようにする
 SELECT RANDOM(n)
  CASE 0 //小文字はそのまま
   RESULT = LETTER
  CASE 1 //大文字を出す場合は変換
   RESULT = STRCONV(LETTER,SC_UPPERCASE)
  CASE 2 //数字の場合は0〜9をランダムに出す
   RESULT = RANDOM(10)
  DEFAULT
   RESULT = LETTER
 SELEND
FEND

No.2545 2016/06/24(Fri) 18:44:52

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / シスイ
リキュールさんの方法でできました、ありがとうございます。

最終的にしたいことがエクセルのA1からA10にランダムに作成した数字文字列を入力したいのですが、色々試してみた所、A1からA10に同じランダムな数字文字列が入力になってしまいます。
何か、良い方法ありませんでしょうか?


Excel = XLOPEN("hoge.xlsx")

id = exec("notepad") // 予め開いとく
IDPASS = ""
//文字列10個出力
FOR A = 1 TO 10
IDPASS = RETURNCHAR(TRUE) // 1文字目は数値なしを受ける
for i = 2 to 8
 IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む
next


 IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む
XLSETDATA( Excel, IDPASS + "<#CR>", "a1:a10")

next
FUNCTION RETURNCHAR(exludeNumber = FALSE)
 LETTER = CHR(97 + RANDOM(26)) //アルファベットの小文字、大文字、数字を出す
 if exludeNumber then n = 2 else n = 3 // exludeNumberがTRUEの場合はcase 2に行かないようにする
 SELECT RANDOM(n)
  CASE 0 //小文字はそのまま
   RESULT = LETTER
  CASE 1 //大文字を出す場合は変換
   RESULT = STRCONV(LETTER,SC_UPPERCASE)
  CASE 2 //数字の場合は0〜9をランダムに出す
   RESULT = RANDOM(10)
  DEFAULT
   RESULT = LETTER
 SELEND
FEND

No.2546 2016/06/24(Fri) 18:46:41

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / リキュール
id = exec("notepad") // この行は不要
XLSETDATA( Excel, IDPASS + "<#CR>", "a1:a10")
これを
Excel.sheets("Sheet1").cells(A,1).Value = IDPASS //"Sheet1"は実際の名前を使用
に変更ではどうですか。

No.2547 2016/06/24(Fri) 19:25:14

Re:別の方法(参考までに) / Liners
Excel = GETACTIVEOLEOBJ("Excel.Application") // 起動中のExcel

For i = 1 to 10
  Excel.Cells(i, 1).Value = IDPASS()
Next

Function IDPASS()
  Result = ""
  For i = 1 to 8
    Result = Result + Copy("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", random(62) + 1 -(i = 1)*10, 1)
  Next
Fend

No.2549 2016/06/25(Sat) 11:15:38

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / シスイ
リキュールさん、できました、ありがとうございます。
No.2550 2016/06/25(Sat) 22:05:15

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / シスイ
Linersさん、できました、この簡潔なソースでしたい処理を考えれるなんて素晴らしいです。
No.2551 2016/06/25(Sat) 22:07:08
全692件 [ ページ : << 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 70 >> ]