G3015_パソコンアプリの作り直し
2025年2月21日
18:28
G3015_pc_goma_note_new_project
既設の日常使いしていたGoma_txt_dbというプロジェクトの整理整頓
テキストデータベース
カレンダー機能
フォルダ管理
プロジェクト名 Goma_note とします
起動環境の設定
デバッグモニタ用にリストボックスを配置します
メッセージの共用関数をコピーペーストします
// 共用関数のコードは折りたたみ、見通しを良くする
// テキストファイル読み込み
// テキストファイルの任意のカラムを1次元配列に代入する
private int com_txt_tbl_red(string prm_fil_path, int prm_tbl_no, string[] prm_cst_tbl)
{
// 他のフォームでも呼び出しが必要だったため、ここに移設した
// 将来は、ライブラリ機能を調べて、そちらに移植すべきものかもしれない
// 最低でも、昔のインクルードのような機能は調べたい
// プログラム全体で共通する処理の場合、コピペして行くと、修正箇所が無限に発生するからである
int cst_tbl_max = prm_cst_tbl.Length;
Encoding enc = Encoding.GetEncoding("UTF-8");
string txt_buf;
int cnt = 0;
if (File.Exists(prm_fil_path) == true)
{
using (StreamReader red = new StreamReader(prm_fil_path, enc))
{
while (true)
{
if (red.EndOfStream == true) break;
txt_buf = red.ReadLine();
// フリー書式に対応するために、ない場合は空欄
prm_cst_tbl[cnt] = "";
if (prm_tbl_no < txt_buf.Split(',').Length)
prm_cst_tbl[cnt] = txt_buf.Split(',')[prm_tbl_no];
++cnt;
if (cst_tbl_max <= cnt) break; //オーバーフロー
}
}
}
return (cnt);
}
// メッセージ
// namespace Goma_txt_db の直下 public partial class Form1 : Form
// のネストの内部に定義された関数は、private定義で、Form1の内部どこからでも利用出来る
// 手動で共用関数のような機能を追加してみた
private void msg(String prm_msg)
{
listBox1.Items.Add(prm_msg);
//MessageBox.Show(prm_msg);
}
// ログファイル記録
private void msg2(String prm_msg, String prm_msg2, String prm_msg3)
{
// プログラムの問題調査の為のモニタ関数
// ログファイルに記録される
// 起動先頭位置のファイルモニタの場合、パラメータ読込のエラー調査を
// するばあい、パスを外します C:ドライブにファイルが生成されます
//string fil_path = "999_err_msg.log";
string fil_path = "999_err_msg.log";
int yy_all, mm, dd, tim_h, tim_m;
string txt_buf;
DateTime now = DateTime.Now; // カレンダー取得
yy_all = now.Year;
mm = now.Month;
dd = now.Day;
tim_h = now.Hour;
tim_m = now.Minute;
Encoding enc = Encoding.GetEncoding("Shift_JIS");
using (StreamWriter wrt = new StreamWriter(fil_path, true, enc))
{
txt_buf = yy_all.ToString() + "/" + mm.ToString() + "/" + dd.ToString()
+ " " + tim_h.ToString() + ":" + tim_m.ToString()
+ ", (" + Msg_cnt.ToString() + ") ," + prm_msg + "," + prm_msg2 + "," + prm_msg3;
wrt.WriteLine(txt_buf);
// クローズは必要ないらしい、括弧の外に出た時点でクローズされる
// 書式を統一するか、検討する事
}
++Msg_cnt;
}
メッセージ関数をテストします
ログファイルは、プログラムexe ファイルと同じフォルダに作成されます
ansiファイルになっていますが、このままとします
フォームの字体が小さいので、サイズを調整します
データフォルダのパスを読み込みします
初期化エリアで Goma_note_prm.txt を読み込みしてグローバル変数に取得します
string[] fld_tbl = new string[10];
com_txt_tbl_red("Goma_note_root.txt",0,fld_tbl);
msg(fld_tbl[0]);
フォルダが存在しない場合生成します
コードは解説の途中で修正されています
// フォルダの存在検査、生成
private void com_folder_chk(int prm_tbl_no)
{
if (Directory.Exists(Folder_path_tbl[prm_tbl_no]) == false)
Directory.CreateDirectory(Folder_path_tbl[prm_tbl_no]); // フォルダ生成
}
フォルダパスの配列は、パラメータに吸収されました
// 初期化処理を作成します
string[] fld_tbl = new string[10];
com_txt_tbl_red("Goma_note_prm.txt",0,fld_tbl);
Folder_path_tbl[0] = fld_tbl[0];
com_folder_chk(0); // データルートフォルダ
Folder_path_tbl[1] = Folder_path_tbl[0] + "\\000_sys";
com_folder_chk(1); // システムフォルダー
Folder_path_tbl[2] = Folder_path_tbl[1] + "\\prm";
com_folder_chk(2); // パラメータフォルダ
msg(Folder_path_tbl[0]);
msg(Folder_path_tbl[1]);
msg(Folder_path_tbl[2]);
パラメータ設計
グローバル変数の追加
public static int Prm_tbl_cnt = 0;
public static string[] Prm_dat_tbl = new string[500+1];
public static string[] Prm_name_tbl = new string[500+1];
パラメータ関連の共用関数を作ります
// パラメータ名検索
private int Prm_name_sarch(string prm_name)
{
int ans_index = -1;
for (int i = 0; i < Prm_tbl_cnt; i++)
{
if (prm_name.Trim() == Prm_name_tbl[i].Trim())
{
ans_index = i; // 発見しました
break;
}
}
return ans_index;
}
// パラメータ名追加
private bool Prm_name_add(string prm_name)
{
int tbl_max = Prm_name_tbl.Length; // グローバル変数配列の定義個数取得
if (tbl_max <= Prm_tbl_cnt)
{
msg2("Prm_name_add()", "テーブル件数オーバーフロー", "");
return false;
}
if (Prm_name_sarch(prm_name.Trim()) == -1)
{
Prm_name_tbl[Prm_tbl_cnt] = prm_name.Trim();
++Prm_tbl_cnt; // 追加しました
}
return true;
}
// パラメータデータ更新
private void Prm_dat_upd(string prm_name, string prm_dat)
{
int tbl_max = Prm_name_tbl.Length; // グローバル変数配列の定義個数取得
int find_index = Prm_name_sarch(prm_name.Trim());
if (tbl_max <= find_index)
{
msg2("Prm_dat_upd()", "テーブル件数オーバーフロー", "");
return;
}
if (find_index == -1)
{
// パラメータ名称を追加します
if (Prm_name_add(prm_name.Trim()) == false) return;
find_index = Prm_name_sarch(prm_name.Trim());
}
if (0 <= find_index && find_index < tbl_max)
{
// パラメータデータの更新
Prm_dat_tbl[find_index] = prm_dat;
}
}
// パラメータデータ取得
private string Prm_dat_get(string prm_name)
{
int find_index = Prm_name_sarch(prm_name.Trim());
if (find_index == -1) return ""; // 未登録です
return Prm_dat_tbl[find_index];
}
ファイルパスも配列ではなく、パラメータに統一します
string[] fld_tbl = new string[10];
string tmp_cst;
// フォルダも配列ではなく、パラメータに統一します
Com_txt_tbl_red("Goma_note_root.txt",0,fld_tbl);
Prm_name_add("データルートフォルダ");
Prm_dat_upd("データルートフォルダ", fld_tbl[0]);
Prm_name_add("システムフォルダ");
tmp_cst = Prm_dat_get("データルートフォルダ") + "\\000_sys";
Prm_dat_upd("システムフォルダ", tmp_cst);
Com_folder_chk(Prm_dat_get("データルートフォルダ"));
Com_folder_chk(Prm_dat_get("システムフォルダ"));
Prm_name_add("パラメータファイルパス");
tmp_cst = Prm_dat_get("システムフォルダ") + "\\000_パラメータ.txt";
Prm_dat_upd("パラメータファイルパス",tmp_cst);
msg("データルートフォルダ");
msg(Prm_dat_get("データルートフォルダ"));
msg("システムフォルダ");
msg(Prm_dat_get("システムフォルダ"));
msg("パラメータファイルパス");
msg(Prm_dat_get("パラメータファイルパス"));
パラメータファイル読み込み関数を作成します
// パラメータファイル読み込み
private void Prm_txt_fil_red()
{
string fil_path = Prm_dat_get("パラメータファイルパス");
string txt_buf;
string[] fld_tbl = new string[20];
if (File.Exists(fil_path) == false) return;
Encoding enc = Encoding.GetEncoding("UTF-8");
using (StreamReader red = new StreamReader(fil_path, enc))
{
while (red.EndOfStream == false)
{
txt_buf = red.ReadLine();
if (txt_buf == null) continue;
if (txt_buf == "")continue;
fld_tbl = txt_buf.Split(',');
if(fld_tbl.Length < 2) continue;
Prm_dat_upd(fld_tbl[0], fld_tbl[1]);
}
}
}
パラメータファイル書き込み関数を作成します
// パラメータファイル書き込み
private void Prm_txt_fil_wrt()
{
string fil_path = Prm_dat_get("パラメータファイルパス");
if (File.Exists(fil_path) == true) File.Delete(fil_path);
Encoding enc = Encoding.GetEncoding("UTF-8");
using (StreamWriter wrt = new StreamWriter(fil_path, true, enc))
{
for (int i = 0; i < Prm_tbl_cnt; i++)
wrt.WriteLine(Prm_name_tbl[i].Trim() + "," + Prm_dat_tbl[i]);
}
}
フォームがクローズする時実行される関数を生成します
パラメータ処理のまとめ
効果の推測
追記
// フォルダの存在検査、生成
private void Com_folder_chk(string prm_folder_path)
{
if (prm_folder_path.Trim() == "") return;
if (Directory.Exists(prm_folder_path) == false)
Directory.CreateDirectory(prm_folder_path); // フォルダ生成
}