2019-09-20
なでしこでナンプレを解いてみようと「配列複製」のこと
なでしこ1の最新版がリリースされましたね!ヽ(^o^)ノ
https://nadesi.com/top/index.php?%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9
と、ゆうわけで、久々のなでしこ1。
クジラ飛行机さまの『Pythonでナンプレを解いてみよう』とゆう記事が、ついったーで流れてきたので、通常は、なでしこ以外の記事はスルーすることが多いんだけど、なでしこで同じようにやってみようと思い立った。
https://news.mynavi.jp/article/zeropython-54/
ぱいそんさんは分からないし、アルファベットは見たくないが、イメージで! なんかまあ、こんなこったろう・・・って感じで、なでしこ1では、わりとすぐに出来たように思います。
一応、ダウンロードしたての最新版で、記事と答えが合うことを確認。
他の問題、解いてみてないけどねー(^▽^;
#ナンプレ(なでしこ1) # 問題データを読む --- (*2) 問題=「 , ,5, ,3, ,6, , 8, , ,4, , ,3, , 4, , , , ,9, ,2, , , , , , ,9, ,6 , , ,1, , , ,8, 7, , , , ,8, , , 3, , ,5, , ,8, , 2, ,1, ,7,3, , , ,9, , ,1,2, , ,」をCSV取得。 9回 x=回数-1。 9回 y=回数-1。 問題[x][y]が数字か判定。 もし、それがいいえならば、問題[x][y]=0。 「--- 問題データ ---」を表示。 問題を表示。 「--- 完成データ ---」を表示。 問題の0をナンプレ解答検索。 # 空白の部分を再帰的に解く --- (*3) ●ナンプレ解答検索(元データのNoを) # 終了判定 --- (*4) もし、No≧81ならば、元データを表示。はいで戻る。 # 空白があるか調べる --- (*5) #(既に数値が入っていたら、次のマス。) 行とは整数=No/9を整数変換。列とは整数=No%9。 もし、元データ[行][列]=0でなければ、元データの(No+1)をナンプレ解答検索。はいで戻る。 # どの数字が利用可能か調べる --- (*6) #(除外して良い数字を検索) 除外数とは配列=空。 9回。 除外数[元データ[回数-1][列]]=はい。 除外数[元データ[行][回数-1]]=はい。 # 3x3のマスの中も数字が重複しないか確認 小行とは整数=行/3を整数変換*3。小列とは整数=列/3を整数変換*3。 3回 x=回数-1。 3回 y=回数-1。 除外数[元データ[小行+x][小列+y]]=はい。 # 利用可能な数値を順に入れて再帰 --- (*7) Cとは整数。 9回 C=回数。 もし、除外数[C]=はいならば、 続ける。 違えば、 仮データとは配列=元データ。 仮データ[行][列]=C。 仮データの(No+1)をナンプレ解答検索。 もし、それが0ならば、続ける。 いいえで戻る。
注:表示されるまで数秒かかります;
ところがですよ!
コレをなでしこ3でも動かそうとしたら、たちまちはまりました(´д`)
いちおう、v3に合わせて必要な「ここまで」を追加し、ローカル変数の宣言もちゃんと変更して、エラーは出ないし内容はv1で動いたそのままなのに、何故だ、何故なんだ~~~と、悩みまくった結果。
v1では、仮データに元データを複製するのは、代入するだけでOKだったのですが、v3では、それでは戻った時に、データが戻らないっぽいとゆうことが分かりました。
再帰で、行き着くとこまで調査して完了~ではなく、うまくいかなかったら戻ってやり直し~、となるので、ちゃんとデータも元に戻ってくれないと、困っちゃうわけです。
なでしこ1には無い命令で(たしか)、何するもんだか分からぬと思ってたんだけど、コレを使ったらできました。一発解決☆
元のぱいそんさんのコードでも、代入ではなく何やらコピーのコマンドが使われているので、なでしこ1のは特有の便利仕様であって、本来はこうゆう物なのかも知れない。
#ナンプレ(なでしこ3) # 問題データを読む --- (*2) 問題=「 , ,5, ,3, ,6, , 8, , ,4, , ,3, , 4, , , , ,9, ,2, , , , , , ,9, ,6 , , ,1, , , ,8, 7, , , , ,8, , , 3, , ,5, , ,8, , 2, ,1, ,7,3, , , ,9, , ,1,2, , ,」をCSV取得。 9回 x=回数-1。 9回 y=回数-1。 問題[x][y]が数字か判定。 もし、それがいいえならば、問題[x][y]=0。 ここまで。 ここまで。 「--- 問題データ ---」を表示。 問題を表CSV変換。それを表示。 「--- 完成データ ---」を表示。 問題の0をナンプレ解答検索。 # 空白の部分を再帰的に解く --- (*3) ●ナンプレ解答検索(元データのNoを) # 終了判定 --- (*4) もし、No≧81ならば、 元データを表CSV変換。それを表示。はいで戻る。 ここまで。 # 空白があるか調べる --- (*5) #(既に数値が入っていたら、次のマス。) 行とは変数=No/9を整数変換。列とは変数=No%9。 もし、元データ[行][列]=0でなければ、 元データの(No+1)をナンプレ解答検索。はいで戻る。 ここまで。 # どの数字が利用可能か調べる --- (*6) #(除外して良い数字を検索) 除外数とは変数=空配列。 9回。 除外数[元データ[回数-1][列]]=はい。 除外数[元データ[行][回数-1]]=はい。 ここまで。 # 3x3のマスの中も数字が重複しないか確認 小行とは変数=(行/3を整数変換)*3。小列とは変数=(列/3を整数変換)*3。 3回 x=回数-1。 3回 y=回数-1。 除外数[元データ[小行+x][小列+y]]=はい。 ここまで。 ここまで。 # 利用可能な数値を順に入れて再帰 --- (*7) Cとは変数。 9回 C=回数。 もし、除外数[C]=はいならば、 続ける。 違えば、 仮データとは変数=元データを配列複製。 //配列複製!! 仮データ[行][列]=C。 仮データの(No+1)をナンプレ解答検索。 もし、それが0ならば、続ける。 ここまで ここまで。 いいえで戻る。 ここまで。
簡易エディタでお試し出来ます。
2018-03-22
NDLからまとめてデータを取得する&ISBNチェックディジット
なでしこ1 |
その後たいしたコトはしてませんが、連続して書籍データを取得するのは、10件ほどのデータで1秒間隔くらいでお試ししたところ、案外すんなりと快調に取得することが出来ました☆
・・・っと思っていたら、なんか突然モノスゴク遅くなることもあるみたい~。
こっ、コレは、こんなにクエリ送ってくんなと怒られてるんですかね><
そんなに無茶な送りっぷりでは無いつもりだったんですがね・・・
それとも単に向こうさんが何らかの事情で遅くなってる?
まあ、応答なしとかになって焦っても、最終的には正常終了してデータも取れてるので、パソコンやインターネットなんて遅いモノだと思っていれば、何の問題もありません(違;)
どっちにしても、タイトルがびみょーだったり、ISBNで検索しても、点字の資料とか何とかで2個以上上がってきちゃうとかあるし(mediatypeの設定で解決するかと思ったらしなかった)で、結局は修正が必要そうだし、バーコードでも読めるんならいいですが、ISBNの入力するだけでも結構めんどーで、一度にそんな大量に処理する予定は無いんですけどね。
でっ、こんな感じ?
書籍データ=空。取得データ=空。 ファイル名=今日の「/」を空に置換&「-」&今の「:」を空に置換&「.csv」 ISBNデータ=「9784591153062 9784041047675 9784416311165 9784091898425 9784861349157 9784885745669 9784101445069 9784122062023 4893635360 4893635840」 (ISBNデータの要素数)回 ISBNデータ[回数-1]で書籍情報取得。 取得データに書籍データを一行追加。 書籍データは空。 1秒待つ。 取得データをファイル名に保存。 終わる。 #----------------------------------------------------------- # http://iss.ndl.go.jp/information/api/ *書籍情報取得(ISBNで) 検索URLは「http://iss.ndl.go.jp/api/sru?operation=searchRetrieve&recordSchema=dcndl_simple&query=mediatype=1 AND isbn={ISBN}」 検索URLからHTTPデータ取得。 データ=それをUTF8_SJIS変換。 ISBNのISBNチェック。 もし、それ=0ならば、書籍データは「エラー!,"{ISBN}"」。戻る。 ヒット数=データから「numberOfRecords」のタグ切り出しし、それのタグ削除。 もし、ヒット数=0ならば、書籍データは「未検出!,"{ISBN}"」。戻る。 データ=データから「record」のタグ切り出し。 データを「</record>」で区切る。 (データの要素数)回 C=回数-1。 書籍データ[C][0]=データ[C]から「dc:title」のタグ切り出しし、それのタグ削除。 書籍データ[C][1]=データ[C]から「dcndl:titleTranscription」のタグ切り出しし、それのタグ削除。 書籍データ[C][2]=データ[C]から「dc:creator」のタグ切り出しし、それのタグ削除し、改行を「 ; 」に置換。 書籍データ[C][3]=データ[C]から「dcndl:creatorTranscription」のタグ切り出しし、それのタグ削除し、改行を「 ; 」に置換。 書籍データ[C][4]=データ[C]から「dcndl:volume」のタグ切り出しし、それのタグ削除。 書籍データ[C][5]=データ[C]から「dcndl:seriesTitle」のタグ切り出しし、それのタグ削除し、改行を「 ; 」に置換。 書籍データ[C][6]=データ[C]から「dc:publisher」のタグ切り出しし、それのタグ削除。 一時=データ[C]から「dc:identifier」のタグ切り出し。 (一時の要素数)回 一時[回数-1]を「URI」で正規表現マッチ。 もし、それ=「URI」ならば、書籍データ[C][7]=一時[回数-1]のタグ削除。 一時[回数-1]を「ISBN」で正規表現マッチ。 もし、それ=「ISBN」ならば、 ISBN=一時[回数-1]のタグ削除。 書籍データ[C][8]=書籍データ[C][8]&ISBN&「 ; 」。 もし、回数=(一時の要素数)ならば、書籍データ[C][8]の3文字右端削除。 #----------------------------------------------------------- #ISBNチェックディジット計算 # 計算式はウィキペディアによる。 # https://ja.wikipedia.org/wiki/ISBN #----------------------------------------------- *ISBNチェック(ISBNの|ISBNを) ISBN=ISBNを文字列分解。A=0。 もし、ISBNの要素数=10ならば、 9回 B=ISBN\(回数-1)。 C=10-(回数-1)。 A=A+B*C。 D=11-A%11。 もし、D=10ならば、D=「X」。 もし、D=11ならば、D=0。 もし、(D=ISBN\9)ならば、はいで戻る。 違えば、いいえで戻る。 違えば、もし、ISBNの要素数=13ならば、 12回 B=ISBN\(回数-1)。 回数%2=0ならば、C=3。 違えば、C=1。 A=A+B*C。 もし、A%10=0ならば、D=0。 違えば、D=10-A%10。 もし、(D=ISBN\12)ならば、はいで戻る 違えば、いいえで戻る。 違えば、いいえで戻る。 #-----------------------------------------------------------
そうそう、ISBNコードとゆう物を学びまして、日本の場合ですが先頭の「9784」は固定であることや(見りゃ分かるでしょとか言わないで~;)最後の一桁は、チェックディジットと言って、コードが間違ってないか確認するためのヤツだというコトを知りました。
前のコード部分を計算して、このチェックディジットと合わなければ、どっか入力ミスってるよ!と分かるって仕掛けです。おぉ!
計算式がウィキペディアに載っていたので、チェックできるようにしてみました☆
なにせ、世の中で一番信用できないのは自分! ってくらいに迂闊な人間ですからねぇ~。入力ミスらないワケ無いですからっ(爆)
とりあえずは、こんなモノかな。
2018-03-17
NDLのAPIで書籍検索してみるよ!
なでしこ1 |
掲示板の質問で、GoogleBooksAPIを使って書籍情報を取得したい! とゆうのがあって、ワタシの心にものすごくヒットしました☆
http://www.eznavi.net/bbs/index2.php?pagetop=415&only=one
記事一つ書けるくらい結構なんだかんだして、モノスゴク賢くなったりもしたんだけど・・・
いかんせんぐーぐるさまの検索結果は、、ISBNコードで検索してんのにヒットしないとか、複数巻あるシリーズ本でも登録されてんのとされてないのがあるとか、漫画も全巻揃ってないとか、なかなかしょぼいようです。
あと、沢山ヒットしても最初の十件しか取得されないようで、たぶん最大取得件数とか、取得開始のインデックスとかが設定できるパラメーターがあるじゃろうと思うんだけど・・・日本語のリファレンスって無いんですかねえ???
どうも英語のトコしか出てこなくて・・・挫折しましたヽ(;´Д`)ノ
しかしアレですよ。書籍検索ならNDLじゃないですか?
http://iss.ndl.go.jp/information/api/
天下の国立国会図書館さまですよ!
枕詞として、世界のぐーぐるさまとどっちが偉いんだとゆうのは置いといて、日本で本を検索するなら断然こっちですとも!!
がっ・・・ご説明を読むも、一体何のことやら・・・;(頭悪すぎ)
難解な日本語はカンタンな英語より読解がむずかしいの~(+_+)
具合わるくはならないケド、すぐに脳がシャットダウンしてしまうので、何度も自分を再起動しないとなりませんw
なんか、ぷろとこる? が6種類もあるしさー。
でっ、でも取りあえず、無難に(?)SRUでXMLを取得するやつでURLを叩いてみる。
http://iss.ndl.go.jp/api/sru?operation=searchRetrieve&query=isbn=9784041056271
ぐーぐるさまには無いと言われた本が、見事にヒットしました☆
そしてさらにまた・・・取得データのスキーマ?? とやらが3種類もあるらしく・・・
パラメータを省略すると、「dc」となりさっきのやつ。
一番詳しいのが「dcndl」
http://iss.ndl.go.jp/api/sru?operation=searchRetrieve&recordSchema=dcndl&query=isbn=9784041056271
「dcndl_simple」はそのシンプル版?
明らかにコレが一番人間の目には優しいですねw
dcよりは大分詳細で、必要っぽい情報は全て備わっているようです。(実際にはタイトルと作者と、あとせいぜい出版社くらいあればいいんだから、dcでもいいんだけどw)
ぐーぐるさまとは違い、省略すると最大取得件数が200件なので、題名や作者で無節操な検索をしてみたら、フリーズしたかと思うほど遅くて焦った;;;
でも大丈夫~。「maximumRecords」で最大取得件数が、「startRecord」で開始位置が変更出来ます☆ 日本語って素晴らしい!(違;)
データベースとしての方針の違いか、ぐーぐるさまと違って内容的な記載はほぼ入ってないので、検索結果を眺めてもつまらんけど、データを取りたいだけなら別にいらないからね。
読みが取れるというのはすごくいいと思うんですよ☆ 後でソートしたい場合とかあるし。
とゆうわけで? とりあえずデータを取得してみる。
折角ジェイソンさんを覚えたのに、XMLぅ~。
しかし、なでしこ1ならむしろ、タグ切り出しとタグ削除で、簡単にデータが取れますからね♪
#----------------------------------------------------------- ISBN=「4198918635」 検索URLは「http://iss.ndl.go.jp/api/sru?operation=searchRetrieve&recordSchema=dcndl_simple&query=mediatype=1 AND isbn={ISBN}」 検索URLからHTTPデータ取得。 データ=それをUTF8_SJIS変換。 データ=データから「record」のタグ切り出し。 データを「</record>」で区切る。 (データの要素数)回 C=回数-1。 書籍データ[C][0]=データ[C]から「dc:title」のタグ切り出しし、それのタグ削除。 書籍データ[C][1]=データ[C]から「dcndl:titleTranscription」のタグ切り出しし、それのタグ削除。 書籍データ[C][2]=データ[C]から「dc:creator」のタグ切り出しし、それのタグ削除し、改行を「 ; 」に置換。 書籍データ[C][3]=データ[C]から「dcndl:creatorTranscription」のタグ切り出しし、それのタグ削除し、改行を「 ; 」に置換。 書籍データ[C][4]=データ[C]から「dcndl:volume」のタグ切り出しし、それのタグ削除。 書籍データ[C][5]=データ[C]から「dcndl:seriesTitle」のタグ切り出しし、それのタグ削除し、改行を「 ; 」に置換。 書籍データ[C][6]=データ[C]から「dc:publisher」のタグ切り出しし、それのタグ削除。 一時=データ[C]から「dc:identifier」のタグ切り出し。 (一時の要素数)回 一時[回数-1]を「URI」で正規表現マッチ。 もし、それ=「URI」ならば、書籍データ[C][7]=一時[回数-1]のタグ削除。 一時[回数-1]を「ISBN」で正規表現マッチ。 もし、それ=「ISBN」ならば、 ISBN=一時[回数-1]のタグ削除。 書籍データ[C][8]=書籍データ[C][8]&ISBN&「 ; 」。 もし、回数=(一時の要素数)ならば、書籍データ[C][8]の3文字右端削除。 書籍データを言う。 #-----------------------------------------------------------
コレもぐーぐるさまには無いと言われたヤツだけど、無事取れました。
ISBNでのヒット率が良ければ、いろいろ検索して遊ぶわけじゃなく蔵書リストのデータを取るだけなら、なにもGUIを使って選択するこたあないんで、ISBNコードのデータを作って置いて処理させても良さそうに思うけど、あんまり連続して機械的にクエリを送っちゃダメだろうね。大量アクセスに関するご注意を見ても、具体的に最低何秒間隔を開けろとか、毎分何件以下にすれとか的な記載は無いからねぇ~。
うーん、超珍しく実用の物を作る気満々だねwww
・・・シカシ・・・「4839951845」はNDLでもヒットしない・・・むむむ。
2018-01-02
ナコ様の透視術
なでしこ1 |
あけましておめでとうございます。
12月中は、ほとんどなにもしないでいるうちに年が明け、ふと気が付いたらなでしこ3がバージョンアップしていたよ!
そんな中、なでしこ1のプログラム(笑)
吹出作成と吹出セリフ表示は、前にスクリーンセーバーの時に作ったものなので(https://nadesiko.g.hatena.ne.jp/snowdrops89/20161107/1478528925)、今回は、数当てカードを作っただけ。
数当てカードは、相手が心の中で思った数を当てるという古典的な有名なマジックで、カードの最初の数を足していくだけの誰にでも出来る超カンタンなものなんだけど、暗算能力が無いワタシはまったくスマートに出来ないんですね;
そして、なんでこんなことが可能なのかについては、わりと最近理解しました;;;
全ての整数は、重複しないいくつかの2の累乗の和で表すことができる、とゆうことになってる・・・ラシイ。(結局そんなに理解してない?!)
ようするに二進数なんだけど、なんでこんな回りくどい言い方しなきゃならんのか><;
とっ、とにかく、ようく分かったのは、昔は一生懸命書き写したりしていたカードですが、実はプログラムで一瞬で作るコトの出来るシロモノだった・・・ということで、ついでにナコ様に実演してもらうようにしたものです。
ナコさまのセリフを読んだら、吹き出しをクリックして進めて下さい。
カードの選択は、慎重かつ正直に。
ナコさまは間違えませんので、もし、結果が思っていた数と違ったら、それはアナタが間違ってるのですwww
#ナコ様の透視術 #----------------------------------------------------------- !母艦設計=「母艦の可視はオフ」 母艦のタイトルは「ナコ様の透視術」 #------------------------------------------------------------ 科白色=$EEBBCC #------------------------------------------------------------ #なこ様 ナコ様とはなこ。 これについて 可視はオフ。 X=ナコ様の幅。//デスクトップワークエリアW-ナコ様の幅。 Y=デスクトップワークエリアH-ナコ様の高さ。 マウス押した時は~ 吹出の可視はオフ。吹出右の可視はオフ。 マウス離した時は~ もし、Y-吹出の高さ+50<0ならば、Y=吹出の高さ-50-20。 もし、Y+ナコ様の高さ>デスクトップワークエリアHならば、Y=デスクトップワークエリアH-ナコ様の高さ もし、X-吹出の幅<0ならば、 もし、X<0ならば、X=0。 吹出右の位置=「{ナコ様のX+ナコ様の幅-80},{ナコ様のY-吹出右の高さ+50}」 もし、吹出方向=「右上」でなければ、吹出方向は「右上」。 違えば、もし、X+ナコ様の幅*2>デスクトップワークエリアWならば、 X=デスクトップワークエリアW-ナコ様の幅*2 吹出の位置=「{ナコ様のX-吹出の幅},{ナコ様のY-吹出の高さ+50}」 もし、吹出方向=「左上」でなければ、吹出方向は「左上」。 違えば、 吹出の位置=「{ナコ様のX-吹出の幅},{ナコ様のY-吹出の高さ+50}」 もし、吹出方向=「左上」でなければ、吹出方向は「左上」。 もし、吹出表示状態=オンならば、 吹出方向で条件分岐 左上ならば、吹出の可視はオン。 右上ならば、吹出右の可視はオン。 母艦位置設定。 ダブルクリックした時は~終わる。 #なこ様吹出 C=0。クリック待ちフラグ=オフ。 吹出とはフォーム。 これについて 可視はオフ。ドラッグ移動はオフ。 クリックした時は~ もし、クリック待ちフラグ=オンならば、 クリック待ちフラグ=オフ。 「{シナリオ¥C}」をナデシコする。。 C=C+1。 クリック待ちフラグ=オン。 吹出右とはフォーム。 これについて 可視はオフ。ドラッグ移動はオフ。 クリックした時は~ もし、クリック待ちフラグ=オンならば、 クリック待ちフラグ=オフ。 「{シナリオ¥C}」をナデシコする。。 C=C+1。 クリック待ちフラグ=オン。 #カードの表示位置(ダイアログ)は母艦の中央になる。 *母艦位置設定 母艦のX=ナコ様のX+120。母艦のY=ナコ様のY-30。 母艦の幅=ナコ様の幅。母艦の高さ=ナコ様の高さ。 #----------------------------------------------------------- シナリオ=「科白を喋る。 科白非表示。数当カード。 終わる」 #------------------------------------------------------------ #メインルーチン 文字サイズは12。 塗り色は科白色。 吹出方向は「右上」 母艦位置設定。 ダイアログ詳細=「文字サイズ=12」 ナコ様の可視はオン。 数当表作成。 「心の中で1~60の間の数字を思い浮かべて、 ボクには見えないようにメモって置いてね。{改行} 準備が出来たら、はじめるよ!」と喋る。 クリック待ちフラグ=オン。 科白=「では、これから六枚のカードを、お見せします。 その中に、あなたの思った数字があれば{カッコ}はい{カッコ閉じ}を、 なければ{カッコ}いいえ{カッコ閉じ}のボタンを押して下さい。」 *数当表作成 数当表=空。 60回 数=回数。 6回 もし、AND(数,(2の(回数-1)乗))=0でなければ、数当表¥(回数-1)に数を一行追加。 *数当カード 答=0 6回 ダイアログタイトル=「数当てカード {回数}枚目」 (回数-1)のカード表示。 もし、それがはいならば、答=答+(2の(回数-1)乗) 「むむ、読めました!{~}あなたが心に描いた数字は…{~} {答} ですね?」と喋る。 *カード表示(Aの) カード=空。 数当表¥Aを配列数値ソート。 30回 もし、それ¥(回数-1)<10ならば、数=「 {それ¥(回数-1)}」 違えば、数=「{それ¥(回数-1)}」 もし、(回数-1)%5=4ならば、カード=「{カード}{数}{改行}」 違えば、カード=「{カード}{数} 」 カードで二択。 #----------------------------------------------------------- *喋る({文字列=「」}AでSと|Sを) 科白種別はA。 吹出方向で条件分岐 「左上」ならば、 吹出にSを「左上」へ200,100で吹出セリフ表示。 吹出の位置=「{ナコ様のX-吹出の幅},{ナコ様のY-吹出の高さ+50}」 吹出の可視はオン。 吹出右にSを「右上」へ200,100で吹出セリフ表示。 「右上」ならば、 吹出右にSを「右上」へ200,100で吹出セリフ表示。 吹出右の位置=「{ナコ様のX+ナコ様の幅-80},{ナコ様のY-吹出右の高さ+50}」 吹出右の可視はオン。 吹出にSを「左上」へ200,100で吹出セリフ表示。 吹出表示状態=オン。 *科白非表示 吹出の可視はオフ。吹出右の可視はオフ。吹出表示状態=オフ。 #------------------------------------------------------------ ●吹出作成({グループ=?}FをW,Hで方向へ) xx=0。yy=0。ww=0。hh=0。 方向で条件分岐 右上ならば、 #矢印は左下 Fのポケットは「右上」 x1=0。y1=H。x2=W/8。y2=H/4*3。x3=W/4。y3=H/8*7。 右下ならば、 #矢印は左上 Fのポケットは「右下」 x1=0。y1=0。x2=W/4。y2=H/8。x3=W/8。y3=H/4。 左上ならば、 #矢印は右下(吹出し変形と同じ) Fのポケットは「左上」 x1=W。y1=H。x2=W/4*3。y2=H/8*7。x3=W/8*7。y3=H/4*3。 左下ならば、 #矢印は右上 Fのポケットは「左下」 x1=W。y1=0。x2=W/4*3。y2=H/8。x3=W/8*7。y3=H/4。 上ならば、 #矢印は下向き hh=H/10。Fのポケットは「上」 x1=W/2。y1=H+hh。x2=W/2-W/20。y2=H-H/100。x3=W/2+W/20。y3=H-H/100。 下ならば、 #矢印は上向き hh=H/10。yy=hh。Fのポケットは「下」 x1=W/2。y1=0。x2=W/2-W/20。y2=hh+H/100。x3=W/2+W/20。y3=hh+H/100。 左ならば、 #矢印は右向き ww=W/10。Fのポケットは「左」 x1=W+ww。y1=H/2。x2=W-W/100。y2=H/2-H/20。x3=W-W/100。y3=H/2+H/20。 右ならば、 #矢印は左向き ww=W/10。xx=ww。Fのポケットは「右」 x1=0。y1=H/2。x2=ww+W/100。y2=H/2-H/20。x3=ww+W/100。y3=H/2+H/20。 Fの可視はオフ。 FのクライアントWはW+ww。FのクライアントHはH+hh。 Fを$00FF00で画面クリア。 線スタイルは透明。 Fのxx,yyからxx+W,yy+Hへ円。1秒待つ。 Fの「{x1},{y1},{x2},{y2},{x3},{y3}」へ多角形。 F→画像通り変形。 // Fの可視はオン。 ●吹出セリフ表示({グループ=?}FにSを{整数=100}minW,{整数=50}minHで{文字列=「」}方向へ) Aとは文字列=「」。Bとは文字列=「」。 Sで反復 Bはそれ。 もし(Aの文字数)<(Bの文字数)ならば、A=B。 swとは整数=Aの文字幅取得。shとは整数=(Sの文字高さ取得)*(Sの要素数) fwとは整数=(Aの文字幅取得)*1.5。fhとは整数=(Sの文字高さ取得)*(Sの要素数)*1.8 もし、fw<minWならば、fw=minW。 もし、fh<minHならば、fh=minH。 sxとは整数=fw/2-sw/2-10 syとは整数=fh/2-sh/2 もし、方向=空ならば、方向=F→ポケット。 もし、方向=空ならば、方向=左上。 もし、方向=右ならば、sx=sx+fw/10 #矢印の長さ分 もし、方向=下ならば、sy=sy+fh/10 Fをfw,fhで方向へ吹出作成。 Fのsx,syへSを文字表示。 #------------------------------------------------------------
2017-10-28
テーブルに編集機能をつけてみたよ!
なでしこ1 |
クリックした時、画像部分コピーで選択色を入れる代わりに、メモを開くようにしただけです。
デフォルトはオフですが、「編集はオン」とすると、有効になります。
アイテムの変更が確定するのは、別のセルにフォーカスが移った時です。
#----------------------------------------------------------------------- #「table_改.nako」 # 編集機能付きテーブル #----------------------------------------------------------------------- ■テーブル改 +イメージ ・線太{=2} ・線色{=$CCCCCC} ・背景色{=$FFFFFF} ・選択色{=$EEEEEE} ・文字色{=$000000} ・文字サイズ{=12} ・フォント{=「MS ゴシック」} ・左余白{=3} ・右余白{=10} ・上余白{=3} ・下余白{=5} ・最小セル幅{=30} ・編集{=オフ} ・列数 ・行数 ・アイテム ←アイテム設定 →アイテム取得 ・アイテム_ ・アイテム取得~それ=アイテム_。 ・アイテム設定(S)~ Sの変数型確認。 もし、それが「配列」でなければ、アイテム_=SをCSV取得。 違えば、アイテム_=S。 アイテム_=アイテム_の表行列交換。 列数=アイテム_の要素数。 アイテム_=アイテム_の表行列交換。 行数=アイテム_の要素数。 ・標準カラー設定({数値=0}Vに)~ Vで条件分岐 0ならば、文字色=黒色。背景色=白色。線色=$CCCCCC。選択色=$EEEEEE。 1ならば、文字色=白色。線色=$808080。背景色=黒色。選択色=$808080。 ・作る~ オブジェクト=VCL_CREATE(自身, 名前, VCL_GUI_IMAGE)。 テーブルイメージバックアップ画面をイメージとして作成。 テーブルイメージバックアップ画面→可視=オフ。 テーブルイメーフォーカス用画面をイメージとして作成。 テーブルイメーフォーカス用画面→可視=オフ。 テーブル編集用メモをメモとして作成。 テーブル編集用メモ→可視はオフ。 テーブル編集用メモ→スクロールバーは空。 ・選択行 ・選択列 ・マウス移動した時は~/*マウス位置設定するためのダミー定義*/ ・クリックした時は~フォーカス選択。 // ・ダブルクリックした時は~選択行&`,`&選択列と言う。 ・セルX ・セルY ・セルW ・セルH ・セル編集フラグ{=0} ・フォーカス選択~ セル内容変更。 左位置=``。右位置=``。上位置=``。下位置=``。 高列=高配列&改行&H。幅列=列幅配列。 オンの間 I=回数-1。左位置=幅列[0]。幅列の0を配列削除。 (幅列[0]>マウスX)ならば、右位置=幅列[0]。抜ける。 選択列=I。もし、選択列>列数-1ならば、選択列=列数-1。 オンの間 I=回数-1。上位置=高列[0]。高列の0を配列削除。 (高列[0]>マウスY)ならば、下位置=高列[0]。抜ける。 選択行=I。もし、選択行>行数-1ならば、選択行=行数-1。 セルX=左位置+描線補正位置。セルY=上位置+描線補正位置。セルW=右位置-左位置-線太さ。セルH=下位置-上位置-線太さ。 S=私→アイテム。S=S[私→選択行][私→選択列]。テーブル編集用メモ→テキストはS。 テーブル編集用メモ→文字サイズは私→文字サイズ。テーブル編集用メモ→文字書体は私→フォント。 テーブル編集用メモ→Xは私→セルX+私→X。テーブル編集用メモ→Yは私→セルY+私→Y。 テーブル編集用メモ→Wは私→セルW。テーブル編集用メモ→Hは私→セルH。 もし、編集=オンならば、テーブル編集用メモ→可視はオン。テーブル編集用メモ→注目。 違えば、 テーブルイメージバックアップ画面を私の0,0へ画像コピー。 テーブルイメーフォーカス用画面のセルX,セルY,セルW,セルHを私のセルX,セルYへ画像部分コピー。 描画処理反映。 セル編集フラグ=1。 ・セル内容変更~ テーブル編集用メモ→可視はオフ。 自身を私にグループ参照コピー。 もし、セル編集フラグ=0でなければ、 S=私→アイテム。S[私→選択行][私→選択列]はテーブル編集用メモ→テキスト。 私→アイテム=S。自動作成。 ・高配列 ・描線補正位置 ・アイテム段数配列 ・自動作成~ もし、線太さ%2=0ならば、描線補正位置=(線太/2)を切捨。 違えば、描線補正位置=(線太/2)を切捨+1。 システム設定変更。文字幅設定する。自身を白色で画面クリア。 アイテム配列座標付情報作成する。 HI=(線太さ/2)を切捨。 //外枠を描く 自身の(線太さ/2)を切捨,(線太さ/2)を切捨からW+1-(線太さ/2)を切捨,表下線位置+1+(線太さ/2)を切捨へ四角。 高配列=(線太さ/2)を切捨。最大出現数とは整数=0。 アイテムを反復 //行線を描く。 V=アイテム段数配列[回数-1]。 (V+1)回、HI=HI+文字高。 HI=HI+(上余白+下余白)。 もし、回数<行数ならば、自身の線太-1,HIからW-線太さ+1,HIへ線。 HIを高配列に配列追加。 //列線を描く。 列幅配列を反復 (回数>1)かつ(回数<列数+1)ならば、自身の対象,0から対象,表下線位置へ線。 アイテム描画する。 バックアップ画面作成する。 システム設定戻す。 ・S_塗色 ・S_線太 ・S_文字色 ・S_線色 ・S_文字サイズ ・S_文字書体 ・システム設定変更~ S_塗色=システム:塗色。S_線太=システム:線太。S_線色=システム:線色。S_文字色=システム:文字色。S_文字サイズ=システム:文字サイズ。S_文字書体=システム:文字書体。 システム:塗色=背景色。システム:線太=線太。システム:線色=線色。システム:文字色=文字色。システム:文字サイズ=文字サイズ。システム:文字書体=フォント。 ・システム設定戻す~ システム:塗色=S_塗色。システム:線太=S_線太。システム:線色=S_線色。システム:文字色=S_文字色。システム:文字サイズ=S_文字サイズ。システム:文字書体=S_文字書体。 ・アイテム描画~ 自身を私にグループ参照コピー。X1とは整数。Y1とは整数。 テーブルイメーフォーカス用画面を貴方にグループ参照コピー。 貴方→サイズ=私→サイズ。貴方→画面クリア(私→選択色)。 アイテム配列座標付情報を反復 X1=対象[1]。Y1=対象[2] 自身のX1,Y1へ対象[0]を文字表示。 貴方のX1,Y1へ対象[0]を貴方:文字表示。 ・アイテム配列座標付情報 ・アイテム配列座標付情報作成~ HI=(線太さ/2)を切捨。I=0。アイテム配列座標付情報=``。 アイテムを反復 対象を反復 アイテム配列座標付情報[I][0]=対象 アイテム配列座標付情報[I][1]=(列幅配列[回数-1]+左余白) アイテム配列座標付情報[I][2]=(HI+上余白)。 Iに1を直接足す。 V=アイテム段数配列[回数-1]。 (V+1)回、HI=HI+文字高。 HI=HI+(上余白+下余白)。 ・バックアップ画面作成~ 自身を私にグループ参照コピー。 テーブルイメージバックアップ画面→サイズ=私→サイズ。 自身をテーブルイメージバックアップ画面の0,0へ画像コピー。 ・文字高 ・表下線位置 //表の下の線位置 ・文字情報設定~ アイテム段数配列=空。 アイテムを反復 最大出現数=0。 対象を反復 V=対象で「{CHR(10)}」の出現回数。 (最大出現数<V)ならば、最大出現数=V。 最大出現数をアイテム段数配列に配列追加。 実行数とは整数=0。 アイテム段数配列を反復 実行数=実行数+(対象+1) 文字高=`字`の文字高さ取得。 表下線位置=(実行数×文字高)+行数*(上余白+下余白)。 ・最大列幅 ・列幅配列 ・文字幅設定~ 文字幅表=``。最大列幅=``。列幅配列=空。 文字情報設定。 アイテムを反復 I=回数-1。V=0。 対象を反復 対象を「{CHR(10)}」で区切って反復 もし、V<(対象の文字幅取得)ならば、V=対象の文字幅取得。 もし、V<最小セル幅ならば、V=最小セル幅。 文字幅表[I][回数-1]=V+左余白+右余白。 V=0。 文字幅表[I]の配列合計を最大列幅に配列追加。 最大列幅=最大列幅の配列最大値。 V=0。 (線太さ/2)を切捨を列幅配列に配列追加。 (文字幅表の表列数)回 V=文字幅表の(回数-1)を表列取得の配列最大値+線太をVに直接足。 Vを列幅配列に配列追加。 表サイズ設定する。 ・サイズ ・表サイズ設定~W=列幅配列の配列最大値+描線補正位置。H=表下線位置+線太。サイズ[0][0]=0。サイズ[0][1]=0。サイズ[0][2]=W。サイズ[0][3]=表下線位置。 #----------------------------------------------------------------------- # 以下はテスト #!「table_改.nako」を取り込む。 ファイル名=「{デスクトップ}Book1.csv」 もし、ファイル名の存在=はいならば、データはファイル名を開く。 違えば、データ=「1,2,3 A,B,"C""D""E" "いろはにほへと{~}ちりぬるを","わかよ,たれそ","つねならむ"」 Tとはテーブル改。 これについて 編集はオン。 アイテムはデータ。 母艦について クリックした時は~ Tのセル内容変更。 Tを自動作成。 閉じた時は~ Tのアイテムをファイル名に保存。 Tを自動作成。 #-----------------------------------------------------------------------
どうかな~?
うまくいってると思うんだけど。
とりあえず、ちょっとワタシが使う分には大丈夫そう☆
変更箇所は結構少ないです。
(設定反映のために、一見、無駄に見える命令があるります。)
weyk.la.coocan.jp/files/tableU.zip
Unicode系の命令を調べている中で、表示サイズを調べる命令と、実際の表示する命令がいくつかあったので、うまく使えばGridのセルを表示するときに役立ちそうです(はみ出るときは「...」的なものを表示 とかもできるっぽい)
シカシ、いきなり「CSVの記述に誤りがあります」とか言われてしまったのでした。しくしく。
文字列を""でくくったらダメっぽい・・??
これまで文字コードのコトなんて気にして生きてこなかったので、Unicodeのこと自体があまり分かっていなかったり;
もうちょっとよくお試ししてみますです☆
ほんとは、CSV取得のUT8版かASCII版(SJISではだめ)があるとよいのですが
ありがとうございます、うまくいきました☆
本当は「UniUtil.nako」の中身をよく研究すると色々賢くなれそうな気がしているんですが、まだそこまで到達していません(^▽^;