scieditor2 5 version 12

2019/09/06 14:43 by yamasyuh68
  :追加された部分   :削除された部分
(差分が大きい場合、文字単位では表示しません)
scieditor2  5
190904
# 保存ルーチン修正した
- 実用化に近づいた(・∀・)ノ
①シンチラから文書を取得(u8)
②文書のエンコがu8ならそのままバイナリで保存
③取得した文書をデコード
④tryでエンコードしてバイナリで保存
⑤例外が発生したらメッセージを出して保存しないで終了

- 保存する前にエンコードしてしまいエラーを出させるところがポイント
エラーの場合はそもそも保存させないことにした
これで**データ破壊の可能性が無くなり安心**です
- エラー箇所はreplaceするメニューを追加してもいい
- エラーが発生した文字をハイライト表示したい
ポジションはわかるのでそこにカーソルが飛ぶようにしてみたが、ポジションはバイト単位と思われ、文字単位のカーソルがズレる症状、どうしたら良い??

# 開いたファイルのデータベースを作る
- 前に開いていた場所に飛ぶ機能
いつも使うファイルだけど開いたら常に先頭表示になるのは地味に使いづらい
あまり意識したこと無かったけどgPadはキャレット位置まで前回終了時を再現してくれて、これに慣れてしまったので無いと凄く不便に思ってしまう


```
import os , sqlite3 , datetime

class openfiledb():
    def __init__(self):
        self.db=os.path.join(os.path.dirname(__file__) , 'openfile.db')
        conn = sqlite3.connect(self.db)
        c = conn.cursor()
        c.execute('create table IF NOT EXISTS database(path PRIMARY KEY,line,times,date)')
        c.close()
        conn.commit()
        conn.close()

    def save(self,fname,line):
        conn = sqlite3.connect(self.db)
        c = conn.cursor()
        date="{0:%Y%m%d}".format( datetime.datetime.now() )
        try:
            c.execute( "INSERT INTO database (path,line,times,date) VALUES (?,?,?,?)" , (fname,line,1,date ))
        except:
            c.execute('select  times from database where path = ?',(fname, ))
            times=c.fetchone()[0]+1
            print(times)
            c.execute('update database set line= ? ,times=? ,date=? where path = ? ', ( line, times, date ,fname ))
        c.close()
        conn.commit()
        conn.close()

```
- お気に入りファイルだけにしようと思ってたんだけど、お気に入りの仕組み自体をどう変えるか考えている内にお気に入り以外だって記憶していた方が良いかなとか、ふつう「最近使ったファイル」って機能はあるからDB作って保存しておくのもありだと思うようになった
- そうなるとiniよりはDB、SQLで実装することにした
- 開いた回数と保存日付もデータ化しておくことにして、古いデータは削除したり、存在しないファイル名は削除したりと言った機能もいずれは実装しようかなという計画
- 以前DBのビューアを作ってあったのでそれでDBを確認しようと思ったら、汎用性がほとんど無くダメだった。作り直すか??
- でもここまでは結構簡単でした。前に作ったときに随分苦労して勉強したからまだ覚えてた部分も多かったんだな
いまのところは保存まで、読込はこれから

# もろもろ
- 本体の文書ロードまわりを整理、すっきりしてきた
- アウトライン解析を派生クラスに移す計画は、treeがウイジェットだったのですぐできない状態。widgetはデータと一体だから
派生クラスにwidgetを渡してセットしてもらうやり方もあるけど、どうせならモデルを分けて再利用した方がスマートだろう。特にファイルが大きくなったときは
そうなるとdesigerに戻ってwidgetをviewに差し替えなければならない
ver管理しておいたほうが良いレベルだな

----
190904
# ini 見直し general -> sql へ
- sqlを使い出したので基本的な設定もsqlに移すことにした
Qtはwidgetが設定保存のメソッドを持ってるので簡単で良いんだけどデータはバイナリ
sqlでテーブルを新しくして保存と読込を実装、問題なく動いた
少しづつだけどコードがコンパクトになってきたような気がする
- 実装時にエラーで少し時間がかかった
sqlのselect文の結果はfetchで取得するが、タプルのリストで帰ってくる
fetchoneはリストのイテレータでタプルが順番に帰ってくるんだな
そのあたりがよくわかんなくて(忘れてただけなんだろうか?)、要するにデータの取り出し方って事だけど、少し悩んだ
- というのも初めからtryで書いてたのでエラーが出ても落ちずに進んでしまいエラーの理由がわからなくて
トライを外してエラーをみてselect文の仕組みがわかった
- 今考えたら**except でメッセージを取得してprint**すれば良かったんだな
昨日やってるときは気づかなかった
久しぶりにVSCodeでBP設定してデバッグしたりした
まだまだだな・・・( ̄― ̄?)
- こうなるとお気に入りこそsqlに移したいが、手で簡単に書けなくなるので編集ツールも必要になると思うと面倒ですぐには取りかかれない

##文書保存を使うようになった、実用化してます##
### 文書保存を使うようになった、実用化してます

----
190905

- ファイルを開いたとき、前回の終了位置にキャレットをセットするようにしたが、その行はページの最終行になってしまうので、状態そのものを復元するようにした
- ページの一番上の行を保存、設定する機能がシンチラにはありこれを使った
SCI_SETFIRSTVISIBLELINE(line displayLine) 2613
SCI_GETFIRSTVISIBLELINE → line     2152
- sql化していたので、sqlite3.exeでカラムを一つ手動で追加した。今後は見えている最上位の行もキャレットとともに保存・読込することにした


----
--->[scieditor2](https://mimemo.io/m/zeXgworpjz4K0Ek)      

190904

保存ルーチン修正した

  • 実用化に近づいた(・∀・)ノ
    ①シンチラから文書を取得(u8)
    ②文書のエンコがu8ならそのままバイナリで保存
    ③取得した文書をデコード
    ④tryでエンコードしてバイナリで保存
    ⑤例外が発生したらメッセージを出して保存しないで終了

  • 保存する前にエンコードしてしまいエラーを出させるところがポイント
    エラーの場合はそもそも保存させないことにした
    これでデータ破壊の可能性が無くなり安心です

  • エラー箇所はreplaceするメニューを追加してもいい

  • エラーが発生した文字をハイライト表示したい
    ポジションはわかるのでそこにカーソルが飛ぶようにしてみたが、ポジションはバイト単位と思われ、文字単位のカーソルがズレる症状、どうしたら良い??

開いたファイルのデータベースを作る

  • 前に開いていた場所に飛ぶ機能
    いつも使うファイルだけど開いたら常に先頭表示になるのは地味に使いづらい
    あまり意識したこと無かったけどgPadはキャレット位置まで前回終了時を再現してくれて、これに慣れてしまったので無いと凄く不便に思ってしまう
import os , sqlite3 , datetime

class openfiledb():
    def __init__(self):
        self.db=os.path.join(os.path.dirname(__file__) , 'openfile.db')
        conn = sqlite3.connect(self.db)
        c = conn.cursor()
        c.execute('create table IF NOT EXISTS database(path PRIMARY KEY,line,times,date)')
        c.close()
        conn.commit()
        conn.close()

    def save(self,fname,line):
        conn = sqlite3.connect(self.db)
        c = conn.cursor()
        date="{0:%Y%m%d}".format( datetime.datetime.now() )
        try:
            c.execute( "INSERT INTO database (path,line,times,date) VALUES (?,?,?,?)" , (fname,line,1,date ))
        except:
            c.execute('select  times from database where path = ?',(fname, ))
            times=c.fetchone()[0]+1
            print(times)
            c.execute('update database set line= ? ,times=? ,date=? where path = ? ', ( line, times, date ,fname ))
        c.close()
        conn.commit()
        conn.close()

  • お気に入りファイルだけにしようと思ってたんだけど、お気に入りの仕組み自体をどう変えるか考えている内にお気に入り以外だって記憶していた方が良いかなとか、ふつう「最近使ったファイル」って機能はあるからDB作って保存しておくのもありだと思うようになった
  • そうなるとiniよりはDB、SQLで実装することにした
  • 開いた回数と保存日付もデータ化しておくことにして、古いデータは削除したり、存在しないファイル名は削除したりと言った機能もいずれは実装しようかなという計画
  • 以前DBのビューアを作ってあったのでそれでDBを確認しようと思ったら、汎用性がほとんど無くダメだった。作り直すか??
  • でもここまでは結構簡単でした。前に作ったときに随分苦労して勉強したからまだ覚えてた部分も多かったんだな
    いまのところは保存まで、読込はこれから

もろもろ

  • 本体の文書ロードまわりを整理、すっきりしてきた
  • アウトライン解析を派生クラスに移す計画は、treeがウイジェットだったのですぐできない状態。widgetはデータと一体だから
    派生クラスにwidgetを渡してセットしてもらうやり方もあるけど、どうせならモデルを分けて再利用した方がスマートだろう。特にファイルが大きくなったときは
    そうなるとdesigerに戻ってwidgetをviewに差し替えなければならない
    ver管理しておいたほうが良いレベルだな

190904

ini 見直し general -> sql へ

  • sqlを使い出したので基本的な設定もsqlに移すことにした
    Qtはwidgetが設定保存のメソッドを持ってるので簡単で良いんだけどデータはバイナリ
    sqlでテーブルを新しくして保存と読込を実装、問題なく動いた
    少しづつだけどコードがコンパクトになってきたような気がする
  • 実装時にエラーで少し時間がかかった
    sqlのselect文の結果はfetchで取得するが、タプルのリストで帰ってくる
    fetchoneはリストのイテレータでタプルが順番に帰ってくるんだな
    そのあたりがよくわかんなくて(忘れてただけなんだろうか?)、要するにデータの取り出し方って事だけど、少し悩んだ
  • というのも初めからtryで書いてたのでエラーが出ても落ちずに進んでしまいエラーの理由がわからなくて
    トライを外してエラーをみてselect文の仕組みがわかった
  • 今考えたらexcept でメッセージを取得してprintすれば良かったんだな
    昨日やってるときは気づかなかった
    久しぶりにVSCodeでBP設定してデバッグしたりした
    まだまだだな・・・( ̄― ̄?)
  • こうなるとお気に入りこそsqlに移したいが、手で簡単に書けなくなるので編集ツールも必要になると思うと面倒ですぐには取りかかれない

文書保存を使うようになった、実用化してます


190905

  • ファイルを開いたとき、前回の終了位置にキャレットをセットするようにしたが、その行はページの最終行になってしまうので、状態そのものを復元するようにした
  • ページの一番上の行を保存、設定する機能がシンチラにはありこれを使った
    SCI_SETFIRSTVISIBLELINE(line displayLine) 2613
    SCI_GETFIRSTVISIBLELINE → line     2152
  • sql化していたので、sqlite3.exeでカラムを一つ手動で追加した。今後は見えている最上位の行もキャレットとともに保存・読込することにした

--->scieditor2