Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2018-03-22

NDLからまとめてデータを取得する&ISBNチェックディジット

| 01:06

 の後たいしたコトはしてませんが、連続して書籍データを取得するのは、10件ほどのデータで1秒隔くらいでお試ししたところ、案外すんなりと快調に取得することが出来ました☆

 ・・・っと思っていたら、なんか突然モノスゴク遅くなることもあるみたい~。

 こっ、コレは、こんなにクエリ送ってくんなと怒られてるんですかね><

 んなに無茶な送りっぷりでは無いつもりだったんですがね・・・

 それとも単に向こうさんが何らかの事情で遅くなってる?

 まあ、応答なしとかになって焦っても、最終的には正常終了してデータも取れてるので、パソコンやインターネットなんて遅いモノだと思っていれば、何の問題もありません(違;)

 どっちにしても、タイトルがびみょーだったり、ISBNで検索しても、点字の資料とか何とかで2個以上上がってきちゃうとかあるし(mediatypeの設定で解決するかと思ったらしなかった)で、結局は修正が必要そうだし、バーコードでも読めるんならいいですが、ISBN入力するだけでも結構めんどーで、一度にんな大量に処理する予定は無いんですけどね。


 でっ、こんな感じ?

 肝心の部分は、前のと何も変わってないんですけどね;;;

書籍データ=。取得データ=。
ファイル名=今日の「/」を置換「-」の「:」を置換「.csvISBNデータ=「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変換。
  
  ISBNISBNチェック。
  もしそれ=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を)
  ISBNISBN文字列分解。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」は固定であることや(見りゃ分かるでしょとか言わないで~;)最後の一桁は、チェックディジットと言って、コードが違ってないか確認するためのヤツだというコトを知りました。

 前のコード部分を計算して、このチェックディジットと合わなければ、どっか入力ミスってるよ!と分かるって仕掛けです。おぉ!

 計算式がウィキペディアに載っていたので、チェックできるようにしてみました☆

 なにせ、世の中で一番信用できないのは自分! ってくらいに迂闊な人ですからねぇ~。入力ミスらないワケ無いですからっ(爆)



 とりあえずは、こんなモノかな。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20180322

2018-03-17

NDLのAPIで書籍検索してみるよ!

| 19:34

 掲示板の質問で、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」はのシンプル版?

http://iss.ndl.go.jp/api/sru?operation=searchRetrieve&recordSchema=dcndl_simple&query=isbn=9784041056271

 明らかにコレが一番人の目には優しいですね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でもヒットしない・・・むむむ。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20180317

2018-01-02

ナコ様の透視術

| 23:15

 あけましておめでとうございます。

 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を文字表示。
#------------------------------------------------------------
トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20180102

2017-10-28

テーブルに編集機能をつけてみたよ!

| 17:43

 クリックした時、画像部分コピーで選択色を入れる代わりに、メモ開くようにしただけです。

 デフォルトはオフですが、「編集はオン」とすると、有効になります。

 アイテムの変更が確定するのは、別のセルにフォーカスが移った時です。

#-----------------------------------------------------------------------
#「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を自動作成。
#-----------------------------------------------------------------------

 どうかな~?

 うまくいってると思うんだけど。

 とりあえず、ちょっとワタシが使う分には大丈夫そう

通りすがり通りすがり2017/10/31 21:04Unicode系の命令をまとめたnakoファイルを用意して、UTF8用のものを作ってみました。
変更箇所は結構少ないです。
(設定反映のために、一見、無駄に見える命令があるります。)

weyk.la.coocan.jp/files/tableU.zip

Unicode系の命令を調べている中で、表示サイズを調べる命令と、実際の表示する命令がいくつかあったので、うまく使えばGridのセルを表示するときに役立ちそうです(はみ出るときは「...」的なものを表示 とかもできるっぽい)

雪乃☆雫雪乃☆雫2017/11/02 00:43いつもながら、さすがですね~!(@_@)
シカシ、いきなり「CSVの記述に誤りがあります」とか言われてしまったのでした。しくしく。
文字列を""でくくったらダメっぽい・・??
これまで文字コードのコトなんて気にして生きてこなかったので、Unicodeのこと自体があまり分かっていなかったり;
もうちょっとよくお試ししてみますです☆

通りすがり通りすがり2017/11/03 18:35初期データ(UTF8の二次元配列のデータ)の生成だけうまくゆかないようなので、1項目づつUTF8に変換するようにしてみました。
ほんとは、CSV取得のUT8版かASCII版(SJISではだめ)があるとよいのですが

雪乃☆雫雪乃☆雫2017/11/06 15:30遅くなりましてスミマセン;
ありがとうございます、うまくいきました☆
本当は「UniUtil.nako」の中身をよく研究すると色々賢くなれそうな気がしているんですが、まだそこまで到達していません(^▽^;

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20171028

2017-10-25

table.nakoを改造してみるよ!

| 22:26

 文字サイズの変更が出来なかったことに比べれば、全然たいしたこと無いですけど、ぱっと見どうしても気になってならないのが、最終行の高さが他と合ってないことと、フォーカスの選択色が枠に少しかぶること。

 細かくてスミマセン;;;

 枠全体のサイズの計算が行引くための行枠高の計算と合ってないために、のしわ寄せが最終行に来ているっぽい。

 してさらにどーでもいいようなことですが、ワタシとしては枠の中にピタッとフォーカスが入って欲しいワケですよ。


 それから、アイテムに指定するデータの形式が、CSVと見せかけて(別に見せかけてはいない;)ちょっと特殊仕様(?)っぽいんだけど、出来ればエクセルで作ってCSV保存したものがふつーに表示出来るようにしたい。


 あと、テーブルの背景色や文字色などを設定すると、システムの塗り色文字色を書き換えてしまうんですよね。フツーのGUIは、んなことにはならないですよね。

 さらによろしくないことには、テーブルの背景色や文字色などを設定してあっても、自動作成する前にシステムの塗り色文字色を設定したら、それで描画が行われちゃう。

 たぶん、テーブルを作ったら、設定から自動作成まで一連のセットとして記述する前提の仕様なんだろうけど、ダブルクリックしたら編集用の窓を開いて、内容を書き換えることができるようにしようと思ったら、編集するたびに自動作成で描画し直すことになるんで、の時設定も全部し直さなきゃないことになっちゃう><

 でもこれは、カンタンに直せそう


 で・・・

■テーブル改 +イメージ
 ・列数{=2}
 ・行数{=1}

 ・太{=2}
 ・線色{=$CCCCCC}
 ・背景色{=$FFFFFF}
 ・選択色{=$EEEEEE}
 ・文字色{=$000000}
 ・文字サイズ{=12}
 ・フォント{=「MS ゴシック」}

 ・左余白{=3}
 ・右余白{=10}
 ・上余白{=3}
 ・下余白{=5}

 ・アイテム ←アイテム設定 →アイテム取得
 ・アイテム_
 ・アイテム取得~それ=アイテム_。
 ・アイテム設定(S)~
  Sの変数型確認。
  もしそれが「配列」でなければ、アイテム_=SをCSV取得。
  違えば、アイテム_=S。
  アイテム_=アイテム_表行列交換。
  列数=アイテム_要素数。
  アイテム_=アイテム_表行列交換。
  行数=アイテム_要素数。

 ・標準カラー設定({数値=0}Vに)~
  Vで条件分岐
   0ならば文字色黒色。背景色=白色線色=$CCCCCC。選択色=$EEEEEE。
   1ならば文字色=白色線色=$808080。背景色=黒色。選択色=$808080。

 ・作る~
  オブジェクト=VCL_CREATE(自身, 名前, VCL_GUI_IMAGE)。
  テーブルイメージバックアップ画面をイメージとして作成。
  テーブルイメージバックアップ画面→可視=オフ。
  テーブルイメーフォーカス用画面をイメージとして作成。
  テーブルイメーフォーカス用画面→可視=オフ。

 ・選択行
 ・選択列
 ・マウス移動した時は~/*マウス位置設定するためのダミー定義*/
 ・クリックした時は~
   フォーカス選択。
// ・ダブルクリックした時は~選択行&`,`&選択列と言う。

 ・セルX
 ・セルY
 ・セルW
 ・セルH
 ・フォーカス選択~
  左位置=``。右位置=``。上位置=``。下位置=``。
  高列=高配列&改行&H。幅列=列幅配列。
  
  オン
   I=回数-1。左位置=幅列[0]。幅列の0を配列削除。
   (幅列[0]>マウスX)ならば、右位置=幅列[0]。抜ける。
  選択列=I。
  オン
   I=回数-1。上位置=高列[0]。高列の0を配列削除。
   (高列[0]>マウスY)ならば、下位置=高列[0]。抜ける。
  選択行=I。
  自身を私にグループ参照コピー。
  セルX=左位置+描補正位置。セルY=上位置+描補正位置。セルW=右位置-左位置-線太さ。セルH=下位置-上位置-線太さ。
  テーブルイメージバックアップ画面を私の0,0へ画像コピー。
  テーブルイメーフォーカス用画面のセルX,セルY,セルW,セルHを私のセルX,セルYへ画像部分コピー。
  描画処理反映。

 ・高配列
 ・描補正位置
 ・アイテム段数配列
 ・自動作成~
  もし線太さ%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=対象文字幅取得。
    文字幅表[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」を取り込む。

データ=「1,2,3
A,B,"C""D""E"
"いろはにほへと{~}ちりぬるを","わかよ,たれ","つねならむ"」//をCSV取得
//データは「Book1.csv」を開く

Tとはテーブル改。
これについて
  選択色は$EEEEEE
  背景色は$EEFFFF
  線太さは5
  線色は$CCCCCC
  文字色は$000066
  フォントは「MS 明朝」
  文字サイズは18

  上余白は10。
  下余白は10。
  左余白は10。
  右余白は10。

  アイテムはデータ。

Tを自動作成。
#-----------------------------------------------------------------------

 エクセルで保存したCSV改行CR+LFではなくLFみたい。

 上下左右の余白(padding的な)を設定できるようにしてみた。


 さてさて、どうかな?

 見た目的にはうまくいってると思うんだけど・・・

 あと、やっぱり編集できるようにしたいね。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20171025