G3015_パソコンアプリの作り直し

2025221

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); // フォルダ生成

}