はじめに
セーブデータをバックアップしたい
という思いで前回から開発しています。
[前回の記事]https://qiita.com/MORAsan/items/967acb1ea77d6a37727d
ところが問題が発生。
ファイルを指定できない
もともとセーブフォルダ内のファイルに、解放状況(限定キャラボイスなど)が保存されていましたが、最近になり一部のゲームでセーブフォルダとは別の場所にいくつか作られるように変わりつつあるので仕様変更しないといけません。
とういわけで、愛用のプロデルで再び作ってみました。
[プロデル公式]https://rdr.utopiat.net
仕様
前回できたこと
- セーブデータを.zipに圧縮し指定した場所へコピーする
- 指定した場所の圧縮されたセーブデータを元の場所へ展開し、戻す
今回変えること
- セーブデータを1フォルダだけではなく複数バックアップ
- 複数のバックアップを元の場所へ展開し戻す
基本的な流れは同じですが処理するデータが増え複雑になります。
使用するプラグイン等
データ量が多く、今まで通りテキストファイルでの処理は厳しいと判断したので、今回はデータベース(SQLite3)を使います。
また、プログラムのほとんどに改変が必要なため初めから作り直しました。
- SQLiteを使用するためプロデルのデータベース機能を使用
- 前回は記述していませんが引き続き7zipのdllを利用
プログラム
実行環境
プロデルデザイナWindows版 Ver 1.6.935
プログラム
「Produire.Data.SQLite.dll」を利用する
SQLiteというSQLiteデータベースを作る
メイン画面を表示する
SQLiteのデータソースを、「[今の位置]data.db」に変える
メイン画面:更新
待機する
メイン画面とは
ウィンドウを継承する
はじめの手順
初期化する
ーー貼り付けた部品に対する操作をここに書きます
終わり
初期化する手順
ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
この実質大きさを{867,570}に変える
この内容を「メイン画面」に変える
初期化開始する
更新ボタンというボタンを作る
その位置と大きさを{578,292,277,49}に変える
その内容を「更新」に変える
その移動順を7に変える
そのフォントを「メイリオ,14.25」に変える
メーカーリストというリストボックスを作る
その位置と大きさを{12,66,277,220}に変える
その横スクロールバーを○に変える
その縦スクロールバーを○に変える
その項目高さを24に変える
その移動順を4に変える
そのフォントを「メイリオ,12」に変える
製品リストというリストボックスを作る
その位置と大きさを{295,66,277,220}に変える
その横スクロールバーを○に変える
その縦スクロールバーを○に変える
その項目高さを24に変える
その移動順を4に変える
そのフォントを「メイリオ,12」に変える
バックアップリストというリストボックスを作る
その位置と大きさを{578,66,277,220}に変える
その横スクロールバーを○に変える
その縦スクロールバーを○に変える
その項目高さを24に変える
その移動順を4に変える
そのフォントを「メイリオ,12」に変える
パス確認リストというリストボックスを作る
その位置と大きさを{12,292,277,220}に変える
その横スクロールバーを○に変える
その縦スクロールバーを○に変える
その項目高さを24に変える
その移動順を5に変える
そのフォントを「メイリオ,12」に変える
バックアップパス確認リストというリストボックスを作る
その位置と大きさを{295,292,277,220}に変える
その横スクロールバーを○に変える
その縦スクロールバーを○に変える
その項目高さを24に変える
その移動順を6に変える
そのフォントを「メイリオ,12」に変える
バックアップボタンというボタンを作る
その位置と大きさを{578,347,277,49}に変える
その内容を「バックアップ」に変える
その移動順を8に変える
そのフォントを「メイリオ,14.25」に変える
復元ボタンというボタンを作る
その位置と大きさを{578,402,277,49}に変える
その内容を「復元」に変える
その移動順を9に変える
そのフォントを「メイリオ,14.25」に変える
初期化終了する
終わり
更新の手順
メーカーリストをクリアする
製品リストをクリアする
バックアップリストをクリアする
パス確認リストをクリアする
パス確認リストの背景色を「Window」にする
バックアップパス確認リストをクリアする
バックアップパス確認リストの背景色を「Window」にする
メーカーリストへ[メーカー取り出しする]を一括追加する
終わり
[配列]を内容取り出し手順
処理1は、[配列]を「,」で繋げたもの
処理2は、処理1から「{」を「」へ置換したもの
処理3は、処理2から「}」を「」へ置換したもの
「{[処理3]}」を配列化したものを返す
終わり
メーカー取り出しの手順
SQLiteへ接続する
結果は、「SELECT DISTINCT メーカー FROM data」をSQLiteから取得したもの
SQLiteから切断する
[[結果]を内容取り出しする]を返す
終わり
[メーカー名]を製品名取り出しの手順
SQLiteへ接続する
結果は、「SELECT DISTINCT 製品名 FROM data WHERE メーカー = "[メーカー名]"」をSQLiteから取得したもの
SQLiteから切断する
[[結果]を内容取り出しする]を返す
終わり
メーカーリストが選択された時の手順
製品リストをクリアする
バックアップリストをクリアする
パス確認リストをクリアする
パス確認リストの背景色を「Window」にする
バックアップパス確認リストをクリアする
バックアップパス確認リストの背景色を「Window」にする
製品リストへ[[メーカーリストの内容]を製品名取り出しする]を一括追加する
終わり
[製品]をパス取り出しの手順
SQLiteへ接続する
結果は、「SELECT パス FROM data WHERE 製品名 = "[製品]"」をSQLiteから取得したもの
SQLiteから切断する
[[結果]を内容取り出しする]を関連付けする
SQLiteへ接続する
結果は、「SELECT バックアップ FROM data WHERE 製品名 = "[製品]"」をSQLiteから取得したもの
SQLiteから切断する
[[結果]を内容取り出しする]をB関連付けする
パス辞書の見出しを返す
終わり
[パス]を関連付けの手順
ck=0
[パス]をP結果へそれぞれ繰り返す
文字位置は、P結果から「\」を前方向へ探したもの
P処理1は、P結果の[[文字位置]+1]文字目以降
もし[P結果が「\.」という正規表現に合致する]なら
「ファイル:[P処理1]」をP処理2へ代入する
そうでないなら
「フォルダ:[P処理1]」をP処理2へ代入する
もし終わり
もしck=0なら
パス辞書は、「[P処理2]=[P結果]」を辞書化したもの
ck=1
そうでないなら
パス辞書へ[P処理2]として「[P結果]」を設定する
もし終わり
繰り返し終わり
終わり
[バックアップパス]をB関連付けの手順
ck=0
cnt=1
[バックアップパス]をB結果1へそれぞれ繰り返す
パス辞書の見出し([cnt])をB結果2へ代入する
もしck=0なら
バックアップパス辞書は、「[B結果2]=[B結果1]」を辞書化したもの
ck=1
そうでないなら
バックアップパス辞書へ[B結果2]として「[B結果1]」を設定する
もし終わり
cnt=cnt+1
繰り返し終わり
終わり
製品リストが選択された時の手順
バックアップリストをクリアする
パス確認リストをクリアする
パス確認リストの背景色を「Window」にする
バックアップパス確認リストをクリアする
バックアップパス確認リストの背景色を「Window」にする
バックアップリストへ[[製品リストの内容]をパス取り出しする]を一括追加する
パス確認する
バックアップパス確認する
終わり
パス確認の手順
ck=0
PD=「False」
PDA=「False」
[バックアップリストの一覧]をPCK処理1へそれぞれ繰り返す
PCK処理2=「」
PCK結果は、パス辞書からPCK処理1を得たもの
もし[PCK結果が「\.」という正規表現に合致する]なら
もし「[PCK結果]」というファイルが存在するでないなら
PCK処理2へPCK処理1を代入
もし終わり
そうでないなら
もし「[PCK結果]」というフォルダが存在するでないなら
PCK処理2へPCK処理1を代入
もし終わり
もし終わり
もしPCK処理2が「」なら
PD=「True」
そうでないなら
もしck=0なら
PCK配列は、「{以下のデータが見つかりません,[PCK処理2]}」を配列化
パス確認リストの背景色をピンクにする
ck=1
そうでないなら
PCK配列へPCK処理2を追加する
もし終わり
もし終わり
繰り返し終わり
もしck=0なら
PCK配列は、「{全データの存在を確認しました}」を配列化
PDA=「True」
パス確認リストの背景色を黄緑にする
そうでないなら
もしPD=「True」ならPCK配列へ「残りのデータは見つかりました」を追加する
もし終わり
パス確認リストへPCK配列を一括追加
終わり
バックアップパス確認の手順
ck=0
BPD=「False」
BPDA=「False」
[バックアップリストの一覧]をBPCK処理1へそれぞれ繰り返す
BPCK処理2=「」
BPCK結果は、バックアップパス辞書からBPCK処理1を得たもの
もし[BPCK結果が「\.」という正規表現に合致する]なら
もし「[BPCK結果]」というファイルが存在するでないなら
BPCK処理2へBPCK処理1を代入
もし終わり
そうでないなら
もし「[BPCK結果]」というフォルダが存在するでないなら
BPCK処理2へBPCK処理1を代入
もし終わり
もし終わり
もしBPCK処理2が「」なら
BPD=「True」
そうでないなら
もしck=0なら
BPCK配列は、「{以下のデータが見つかりません,[BPCK処理2]}」を配列化
バックアップパス確認リストの背景色をピンクにする
ck=1
そうでないなら
BPCK配列へBPCK処理2を追加する
もし終わり
もし終わり
繰り返し終わり
もしck=0なら
BPCK配列は、「{全データの存在を確認しました}」を配列化
BPDA=「True」
バックアップパス確認リストの背景色を黄緑にする
そうでないなら
もしBPD=「True」ならBPCK配列へ「残りのデータは見つかりました」を追加する
もし終わり
バックアップパス確認リストへBPCK配列を一括追加
終わり
バックアップの手順
もしPDA=「True」なら
もしBPD=「True」なら
質問結果は、「既に、データがあるため元データを削除しますがよろしいですか?」をはいといいえで質問アイコンにして質問したもの
もし質問結果が「はい」ならバックアップ処理する
そうでないなら
バックアップ処理する
もし終わり
そうでないなら
「セーブデータを確認してください」を警告アイコンで表示
もし終わり
終わり
復元の手順
もしBPDA=「True」なら
もしPD=「True」なら
「既に、データがあるため処理途中に上書きについて
質問されますので注意してください」を「注意」として警告アイコンで表示する
復元処理する
そうでないなら
復元処理する
もし終わり
そうでないなら
「バックアップデータを確認してください」を警告アイコンで表示
もし終わり
終わり
バックアップ処理の手順
[バックアップリストの一覧]をBK処理1へそれぞれ繰り返す
BKFは、パス辞書からBK処理1を得たもの
BKTは、バックアップパス辞書からBK処理1を得たもの
BKFをBKTへ圧縮する
繰り返し終わり
「バックアップしました」を情報アイコンで表示
終わり
復元処理の手順
[バックアップリストの一覧]をRV処理1へそれぞれ繰り返す
RVTは、パス辞書からRV処理1を得たもの
RVFは、バックアップパス辞書からRV処理1を得たもの
RVFをRVTへ解凍する
繰り返し終わり
「復元しました」を情報アイコンで表示
終わり
更新ボタンがクリックされた時の手順
更新する
終わり
バックアップボタンがクリックされた時の手順
バックアップする
終わり
復元ボタンがクリックされた時の手順
復元する
終わり
終わり
データベース
環境
- SQLite3を使用
- データベース編集ソフトとして「pupsqlite_ver_2000300」を使用
- [pupsqlite]https://www.eonet.ne.jp/~pup/software.html
内容
本プログラム用のデータベース構成です。
- ファイル名:data.db
- テーブル名:data
カラム
メーカー | 製品名 | パス | バックアップ |
---|---|---|---|
メーカー名 | 製品名(ソフト名) | バックアップしたいデータの絶対パス(C:\から始まるパス) | バックアップ先の絶対パス(C:\から始まるパス) |
これからの開発予定
問題点
- データベースへの登録や更新するための機能がない
- ラベルがないため何の情報か分かりにくい
自分なりの解決策
- データベースで製品ごとにテーブルを作り更新しやすくする
- 現在のテーブルでは、更新に手間がかかる
- 不具合が起きやすい配置になっている
- ラベルを追加しわかりやすくする
最後に
まだ実装できていない機能等もあるので、問題点も含めて取り組んでいきます。
前回よりデータベースでの処理にしたことで、プログラムの量が少なくできたので正解だったと思います。
最後まで見てくださりありがとうございました。
途中経過または完成版を出来次第、再び投稿しようと思います。