VC# Tips 2006.04.20(木)〜
著作者: 中野 良知 作成日: 2006.04.20(木) 「CNCの実験(ソフト編)」から分離。 変更 : 2006.04.22(土) アプリケーションの終了項目を追加。 : 2006.05.03(水) リストボックスの項目を追加。 : 四捨五入(少数点以下3位)の項目を追加。 : 2006.07.07(金) 16進数の数値・数字変換の項目を追加。 : 2006.09.08(金) 入力フォームの追加の項目を追加。 : 2006.09.17(日) 構造体の項目を追加。 : 2006.09.24(日) 釦背景色の保存と復帰の項目を追加。 : 2006.09.29(金) フォームの配置の項目を追加。 : 2006.10.01(日) 少数点以下の桁数指定の項目を追加。 : 2006.10.21(土) 数字判定の項目を追加。 : 2007.05.20(日) リストボックスに文字色の指定の項目を追加。 : カーソルの形状変更(砂時計)の項目を追加。 : リストボックスに文字色の指定の項目を追加。 : 2007.06.21(木) 保存用ダイアログの表示、テキストデータの保存、 : バイナリデータの保存の項目を追加 : 2007.06.24(日) 半角キャラクターに変換の項目を追加。 : 2007.07.03(火) カウンターの項目に : using System.Runtime.InteropServices; の設定を追加。 : 2007.07.15(日) フォームの配置(右下)の項目を追加。 : 2007.07.20(金) レジストリにusing Microsoft.Win32;を追記。 : 2007.08.20(月) 区切り文字で文字列の取り出しを追加。 : 2008.02.13(水) マウス・ホイールの回転イベントを追加。 : 2009.07.08(水) 半角キャラクター変換に「型変換」を追加。 : バイナリーデータの読出しの項目を追加。 : 2009.07.10(金) シリアル通信を追加。 : 2009.09.02(水) msec遅延の項目を追加。 : シリアル通信のデータ受信でMsec_Delay()を使用。 : 2010.02.15(月) マウス・ホイール回転イベントを有効にする項目を追加。 : 2012.03.04(日) リストボックスから文字列の取得を追加。 : 2012.03.16(金) 表にデータの代入を追加。 : 2012.05.09(水) マウス・ホイールの回転イベントを有効にする方法を変更。
概要 CNC、DXF2NC、HPGL2NCやその他のAppを作成するときに用いた、VC#関数の使用例です。 目次 1. 数値・数字 1.1. 10進数の数字を数値に変換 1.2. 数値を10進数の数字に変換 1.3. 16進数の数字を数値に変換 1.4. 数値を16進数の数字に変換 1.5. 絶対値 1.6. 四捨五入(少数点以下1位) 1.7. 四捨五入(少数点以下3位) 1.8. 数字判定 2. ユーザーインターフェース 2.1. メッセージボックス 2.2. グラフィック 2.3. マウス・ホイールの回転イベント 2.4. 入力フォームの追加(Form2) 2.4.1. フォームの配置(中央) 2.4.2. フォームの配置(右下) 2.5. 釦背景色の保存と復帰 2.6. カーソルの形状変更(砂時計) 3. タイマー・カウンター 3.1. 日時の取得 3.2. カウンター 3.3. msec遅延 4. レジストリ 4.1. レジストリへデータを登録 4.2. レジストリからデータを取得 5. 文字列 5.1. 文字の検索 5.2. 文字列の取り出し 5.3. 少数点以下の桁数指定 5.4. 半角キャラクターに変換 5.4.1. 型変換 5.4.2. キャラクターテーブル参照 5.5. 区切り文字で文字列の取り出し 6. リストボックス 6.1. リストボックスをクリア 6.2. 文字列表示 6.3. 数値表示 6.4. 文字列と数値の表示 6.5. 最終行を選択 6.6. 文字色の指定 6.7. 文字列の取得 7. 表にデータを代入 8. 構造体 8.1. 宣言と初期化 8.2. データ格納 9. ファイル 9.1. 読み込み用ダイアログの表示 9.2. ファイルの読み込み 9.3. ファイル名の取得 9.4. 保存用ダイアログの表示 9.5. テキストデータの保存 9.6. バイナリデータの保存 9.7. バイナリデータの読出し 10. シリアル通信 11. アプリケーションの終了 11.1. 終了メニュー 11.2. クローズ釦 1. 数値・数字 1.1. 10進数の数字を数値に変換 double n = double.Parse("12345"); 変数nの値は12345になります。 1.2. 数値を10進数の数字に変換 string s = n.ToString(); 変数n=12345の時、変数sは文字列で"12345"になります。 1.3. 16進数の数字を数値に変換 テキストボックスの16進数2桁の数字を1バイトの数値に変換します。 byte buf = (byte)(Convert.ToInt32(textBox1.Text,16)); テキストボックス1が数字で"7F"の時、bufに127(0x7F)が代入されます。 1.4. 数値を16進数の数字に変換 textBox2.Text = buf[0].ToString("X"); buf[0]の値が126の時、テキストボックス2は"7e"と表示されます。 textBox2.Text = buf[0].ToString("X2"); 2桁の16進数の数字に変換します。 1.5. 絶対値 double a = System.Math.Abs(-1); 変数aは1になります。 1.6. 四捨五入(少数点以下1位) int n = 1.5678; double r = Math.Round(n); 変数rは2になります。 1.7. 四捨五入(少数点以下3位) int n = 1.5678; double r = (Math.Round(n * 100)) / 100; 変数rは1.57になります。 1.8. 数字判定 char.IsDigitを使用して、テキストボックスに入力された文字列が数字かそれ以外か を判定します。 数字ならば、数値に変換します。 textBox1.textに文字列"1.234"が入力されています。 if( num_check(textBox1.text) ) { // 関数の戻り値がtrueならば、入力文字列は数字列です。 // 実数型の変数に数値を代入します。 double num = double.Parse(textBox1.text); } // 数字文字列を判定する関数 private bool num_check(string st) { int i; int k = 0; for (i = 0; i < st.Length; i++) { if (char.IsDigit(st, i) == false) { // 数字以外なら if (st.Substring(i, 1) == "." && k == 0) { // 小数点記号で、1回目の出現なら k++; } else { // 小数点以外なら return false; } } } return true; } 2. ユーザーインターフェース 2.1. メッセージボックス MessageBox.Show("スピンドルを回転してください。"); 2.2. グラフィック 1) グラフィックイメージを使えるようにします。 pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height); 2) 直線を描きます。 Graphics g = Graphics.FromImage(pictureBox1.Image); // ハンドルの取得 Pen MyPen = new Pen(Color.Blue, 1); // ペンの生成 g.DrawLine(MyPen, x1, y1, x2, y2); // 線の描画 g.Dispose(); // ハンドルを廃棄 pictureBox1.Invalidate(); // 再描画 Application.DoEvents(); // OSに一時的に戻し画面に表示 3) グラフィックをクリアし、再描画に備えます。 pictureBox1.Image.Dispose(); // グラフィックイメージを廃棄 pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height); 4) ペンの色を変更します。 MyPen.Color = Color.WhiteSmoke; 2.3. マウス・ホイールの回転イベント pictureBox1内でマウス・ホイールを回転した時にイベントが発生するようにします。 1) マウス・ホイールのイベントハンドラーを追加します。 namespace HPGL2NC { ..... public partial class Form1 : Form { public Form1() { InitializeComponent(); // 以下を追加 this.pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler (this.pictureBox1_MouseWheel); } } ..... } 2) マウス・ホイールイベントのメソッドを追加します。 namespace HPGL2NC { public partial class Form1 : Form { ..... public Form1() { ..... } ..... private void pictureBox1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e) { if (e.Delta > 0) { // 向こうへ回転なら ..... } if (e.Delta < 0) { // 手前に回転なら ..... } } } } 3) マウス・ホイールの回転イベントを有効にします。 //------------------------------------------------------- // マウスがピクチャーボックス内に入った時のイベント //------------------------------------------------------- private void pictureBox1_MouseEnter(object sender, EventArgs e) { // ピクチャーボックスをアクティブに設定 pictureBox1.Select(); // クロスカーソルに変更 this.Cursor = Cursors.Cross; } 2.4. 入力フォームの追加(Form2) 1) フォームをプロジェクトに追加します。 「Windows フォームの追加」をクリックします。 「新しい項目の追加」のダイアログが表示されます。 2)「Windowsフォーム」を選択します。 OK」をクリックします。 Form2.csが追加されます。 3) Form2にツールを配置します。 4) ツールの広域参照を許可します。 5) 入力フォームから値を取得します。 // Form2を実体化 Form2 form2 = new Form2(); // Form2を表示(Form1は休止) form2.ShowDialog(); // Form2のテキストボックスから値を取得 int x_len = (int)(double.Parse(form2.textBox1.Text)); 2.4.1. フォームの配置(中央) 入力フォームを親ホームの中央に配置します。 // Form2を実体化 Form2 form2 = new Form2(); // フォームの表示位置を指定。親フォームの中央に配置。 form2.StartPosition = FormStartPosition.CenterParent; // Form2を表示(Form1は休止) form2.ShowDialog(); 2.4.2. フォームの配置(右下) 入力フォームを親ホームの右下に配置します。 // Form2を実体化 Form2 form2 = new Form2(); // フォームの表示位置を指定。親フォームの右下に配置。 form2.Top = this.Top + this.Height * 4 /5; form2.Left = this.Left + this.Width * 4 / 5; form2.StartPosition = FormStartPosition.Manual; // Form2を表示(Form1は休止) form2.ShowDialog(); 2.5. 釦背景色の保存と復帰 釦の背景色を変更し、再び元の色に戻します。 Color pause_button_bgcolor; // 現在の釦の背景色を保存します。 pause_button_bgcolor = button2.BackColor; // 釦の背景色を黄色に変更します。 button2.BackColor = Color.Yellow; // 釦の背景色を復旧します。 button2.BackColor = pause_button_bgcolor; 2.6. カーソルの形状変更(砂時計) // 砂時計を表示します。 this.Cursor = Cursors.WaitCursor; // 処理を行います。 pic_write(file_path, device); // 処理が終了したらカーソル形状を元に戻します。 this.Cursor = Cursors.Default; 3. タイマー・カウンター 3.1. 日時の取得 // 日時を取得します。 DateTime nowTime = DateTime.Now; // 文字列変数に代入します。 string str = "(" + nowTime + ")"; strの内容は、"(2006/04/19 20:16:00)" です。 (年月日時間は参考例) 3.2. カウンター ステップパルス幅を制御する為に、PC内臓のクロックカウンターを使用します。 1) [DllImport("kernel32.dll")]参照用のusing指定 using System.Runtime.InteropServices; 2) dllを使用することを宣言します。 [DllImport("kernel32.dll")] 3) ステップパルス幅を制御します。 QueryPerformanceFrequency(ref freq); // カウンタ周波数の取得 QueryPerformanceCounter(ref count2); // カウンタ取り込み j = 0; for (k = 0; k < pulse_count; k++) { count1 = count2; // スタート点保存 // パルス幅の下位桁を取得。(単位[μs]) count3 = (long)drive_data[drive_data_no + j++]; // パルス幅の下位を取得し下位桁に加える。(単位[μs]) count3 += (long)(drive_data[drive_data_no + j++] << 8); // カウント値に換算。(単位[カウント]) count3 = count3 * freq / 1000000; // ステップパルスデータをEZ-USBマイコンへ出力 m = 0; buf[m++] = (byte)EzSub.EzByte.EZR_WRITE; buf[m++] = (byte)EzSub.EzByte._OUTB; buf[m++] = drive_data[j++]; buf[m++] = (byte)EzSub.EzByte.EZR_WRITE; buf[m++] = (byte)EzSub.EzByte._OUTC; buf[m++] = drive_data[j++]; usb.BulkWrite((int)EzSub.EzInt.RGIO_CPIPE, buf, m); // 遅延残り分を消化 while (true) { QueryPerformanceCounter(ref count2); // カウンタ取り込み if ((count2 - count1) > count3) break; // 遅延終了チェック } } 3.3. msec遅延 msec単位の時間を遅延(消費)します。 [DllImport("kernel32.dll")] extern static short QueryPerformanceCounter(ref long x); [DllImport("kernel32.dll")] extern static short QueryPerformanceFrequency(ref long x); public void Msec_Delay(int t) { long count1 = 0; long count2 = 0; long freq = 0; QueryPerformanceFrequency(ref freq); // カウンタ周波数の取得 count2 = (long)t * freq / 1000; // 遅延時間相当のカウント値 QueryPerformanceCounter(ref count1); // 計測開始! count2 += count1; // 遅延後のカウント値 while (true) { QueryPerformanceCounter(ref count1); if (count1 >= count2) break; } } 4. レジストリ using Microsoft.Win32; // for RegistryKey をForm1.csなどのソースコードの巻頭に記述します。 4.1. レジストリへデータを登録 Windowsのレジストリへ変数のデータを登録しておくと、次回のApp起動で同じデータ を変数に復元する事ができます。 // レジストリの検索 string sub_key = "SOFTWARE\\CNC\\SETTINGS"; // SOFTWAREレジストリにCNCを作成する RegistryKey reg_key = Registry.LocalMachine.CreateSubKey(sub_key); // X_MAX_FEEDの項目に定数X_MAX_FEEDの値を登録する reg_key.SetValue("X_MAX_FEED", X_MAX_FEED); 4.2. レジストリからデータを取得 Windowsのレジストリからデータを取得し、前回Appの終了した時のデータを変数に復 元します。 // レジストリの検索 string sub_key = "SOFTWARE\\CNC\\SETTINGS"; RegistryKey reg_key = Registry.LocalMachine.OpenSubKey(sub_key); if (reg_key != null) { // レジストリに登録があれば if (reg_key.GetValue("X_MAX_FEED") != null) { // X_MAX_FEEDの項目があれば // 項目の値を取得して変数へ代入する x_max_feed = (int)reg_key.GetValue("X_MAX_FEED"); } } 5. 文字列 5.1. 文字の検索 文字列中の文字の検索をします。 一致する文字があると文字列中の位置を返します。 string str = "N0010 M30"; if( str.IndexOf("M30") >= 0){ // NCコード終了 } 上記では 6 を返します。 文字列の先頭と一致する場合、str = "M30" では 0 を返します。 一致する文字がなければ、 0 未満(-1)を返します。 5.2. 文字列の取り出し 文字列の中の指定した位置から指定した個数の文字列を取得します。 string str = "G00 X0 Y0"; string s1, s2, s3; s1 = str.Substring(0, 1); s2 = str.Substring(1, 2); s3 = str.Substring(4, 1); s1には"G"、s2には"00"、s3には"X"、がそれぞれ代入されます。 5.3. 少数点以下の桁数指定 int x_cur; // x_curが0又は1234の時 label14.Text = "X:" + ((double)x_cur / 1000).ToString(); の表示結果は x_cur 表示 -------+------------- 0 X:0 1234 X:1.234 少数点以下の桁数を指定します。 label14.Text = "X:" + System.String.Format("{0:F3}", (double)x_cur / 1000); の表示結果は x_cur 表示 -------+------------- 0 X:0.000 1234 X:1.234 (参考) 数値結果テーブルの書式設定 (C# リファレンス) から System.String.Format("{0:X}", 250); → FA System.String.Format("{0:N}", 2500000); → 2,500,000.00 System.String.Format("{0:D5}", 25); → 00025 5.4. 半角キャラクターに変換 5.4.1. 型変換 string s = ""; s += (char)0x31; // 数字1のASCIIコード s += (char)0x32; // 数字2のASCIIコード s += (char)0x33; // 数字3のASCIIコード listBox1.Items.Add(s); リストボックスに"123"が表示されます 5.4.2. キャラクターテーブル参照 1バイトデータを半角のキャラクターコードに変換します。 HEX形式やバイナリ形式のファイルをダンプするときにキャラクターの表示用に使用 しました。 テーブルを書き換えれば、注目したい数値をキャラクターで表示する 等の応用が出来ます。 private char byte2chr(Byte n) { char[] chr_table = { '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'G', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '/', ']', '^', '_', '_', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '[', '\\', ']', '^', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '。', '「', '」', '、', '_', 'ヲ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ャ', 'ュ', 'ョ', 'ッ', 'ー', 'ア', 'イ', 'ウ', 'エ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', 'サ', 'シ', 'ス', 'セ', 'ソ', 'タ', 'チ', 'ツ', 'テ', 'ト', 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'ヒ', 'フ', 'ヘ', 'ホ', 'マ', 'ミ', 'ム', 'メ', 'モ', 'ヤ', 'ユ', 'ヨ', 'ラ', 'リ', 'ル', 'レ', 'ロ', 'ワ', 'ン', '゙', '゚', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_' }; return chr_table[n]; } 5.5. 区切り文字で文字列の取り出し string fuse_item_list = "DWEN,EESAVE,SPIEN,WDTON,BODLEVEL3-0,RSTDISEL"; から','を区切り文字として複数の文字列を取り出します。 string[] words = fuse_item_list.Split(','); words[0]に"DWEN" words[1]に"EESAVE" words[2]に"SPIEN" words[3]に"WDTON" words[4]に"BODLEVEL3-0" words[5]に"RSTDISEL" が格納されます。 数種類の区切り文字記号で取り出す場合 char[] delimiterChars = { ' ', ',', '.', ':', '\t' }; string fuse_item_list = "DWEN EESAVE,SPIEN.WDTON:BODLEVEL3-0 RSTDISEL"; string[] words = fuse_item_list.Split(delimiterChars); 6. リストボックス 6.1. リストボックスをクリア listBox1.Items.Clear(); 6.2. 文字列表示 listBox1.Items.Add("G00 X0 Y0"); 6.3. 数値表示 int n = 123; // 数値を文字列に変換し、リストボックスに表示します。 listBox1.Items.Add(n.ToString()); 6.4. 文字列と数値の表示 int x = 10; int y = 10; // 文字列に変換し、+演算子で結合します。 listBox1.Items.Add("G01 X" + x.ToString() + " Y" + y.ToString()); 6.5. 最終行を選択 // 0から10までの数字をリストボックスに表示 for( n = 0; n <= 10; n++){ listBox1.Items.Add(n.ToString()); } // 最終行を選択します。 listBox1.SetSelected(listBox1.Items.Count - 1, true); // 表示イベントを実施 Application.DoEvents(); 6.6. 文字色の指定 listBox1.Items.Clear(); listBox1.ForeColor = System.Drawing.Color.Red; listBox1.Items.Add("処理を実行中です。"); 6.7. 文字列の取得 リストボックスの先頭行から最終行までをファイルへ出力します。 ファイル操作はテキストデータの保存の項目を参照して下さい。 for(i = 0; i < listBox1.Items.Count; i++) { // 行を指定 listBox1.SelectedIndex = i; // リストボックスから1行分を取得 String src_code = listBox1.Text; // 1行をファイルへ書き込み file_text.WriteLine(src_code); } 7. 表にデータを代入 DataGridViewツールをフォームに貼り付けます。 // 8行4列の表にデータを代入 int line; for (line = 0; line < 8; line++) { // 行ごとに列を生成 DataGridViewRow row = dataGridView1.Rows[line]; // セルにデータを代入 row.Cells[0].Value = line * 4 + 0; row.Cells[1].Value = line * 4 + 1; row.Cells[2].Value = line * 4 + 2; row.Cells[3].Value = line * 4 + 3; } 8. 構造体 ステッピングモーターの駆動用パルスデータを構造体変数に設定します。 8.1. 宣言と初期化 // 構造体を宣言 public struct step_data { // メンバー public int time; // パルス幅[μs] public byte xy; // パルスデータ。下位4ビット:X相。上位4ビット:Y相。 public byte za; // パルスデータ。下位4ビット:Z相。上位4ビット:A相。 public int x_pos; // X座標 public int y_pos; // Y座標 public int z_pos; // Z座標 public int a_pos; // A座標 // メンバー初期化のコンストラクタ public step_data(byte a, byte b, int t, int xp, int yp, int zp, int ap) { time = t; // ステップ幅[μs] xy = a; // 下位X相、上位Y相 za = b; // 下位Z相、上位A相 x_pos = xp; // X座標 y_pos = yp; // Y座標 z_pos = zp; // Z座標 a_pos = ap; // A座標 } }; // 構造体の初期化 step_data[] step_pulse = new step_data[2000000]; 8.2. データ格納 // パルス幅格納 step_pulse[drive_data_no].time = pulse_width_usec(feed); // X,Yパルスデータ格納 step_pulse[drive_data_no].xy = (byte)(v_x_out + (v_y_out << 4)); // Z,Aパルスデータ格納 step_pulse[drive_data_no].za = (byte)(v_z_out + (v_a_out << 4)); 9. ファイル 9.1. 読み込み用ダイアログの表示 ファイルオープンダイアログを開きファイル名を指定します。 // 以前に使用したファイル名の有無をチェック if (file_name == null) { // ファイル名がなければ、ワイルドカードと拡張子を設定 file_name = "*.plt"; } // ダイアログのファイル名を設定 openFileDialog1.FileName = file_name; // ファイルオープンダイアリグを開く openFileDialog1.Filter = "HPGLコード(*.PLT)|*.PLT|すべてのファイル(*.*)|*.*"; // ダイアログの「開く」「キャンセル」釦をクリックした時 if (openFileDialog1.ShowDialog() == DialogResult.Cancel) { // キャンセルが押されたら return; } 9.2. ファイルの読み込み ファイルオープンダイアログで指定したテキストファイルを読み込みます。 // シフトJISを指定して、ファイルをオープンします。 System.IO.StreamReader file_text = new System.IO.StreamReader (file_name, System.Text.Encoding.GetEncoding("Shift_JIS")); // ファイルの先頭から最後まで1行づつ文字列変数に読み込みます。 for (hpgl_end = 0; (str = file_text.ReadLine()) != null;) { // 大文字に変換 str = str.ToUpper(); string tmp; // HPGLコード字句解析 // ターミネーター(;)で区切って字句に分割します。 while (str.IndexOf(";") >= 0) { // ターミネーターがあれば // ターミネーターの位置を取得 n = str.IndexOf(";"); // 先頭からターミネーターの手前までを取り出す tmp = str.Substring(0, n); // スペースを削除 tmp = tmp.Trim(); // 文字列配列に格納 hpgl_code[hpgl_end++] = tmp; // 残りの字句を取り出す tmp = str.Substring(n + 1, str.Length - n - 1); str = tmp; // 1行を表示(デバッグ用) //listBox1.Items.Add(src_code[hpgl_end-1]); } } // ファイルをクローズ file_text.Close(); 9.3. ファイル名の取得 ファイルパス中からファイル名を取得します。 string file_name = "d:\\NTCAD\\DFX\\ベアリングホルダー.DXF"; // ファイル名を取得し、文字列変数に代入します。 string str = "(" + System.IO.Path.GetFileName(file_name) + ")"; strの内容は、"(ベアリングホルダー.DXF)" です。 9.4. 保存用ダイアログの表示 ツールボックスのダイアログからsaveFileDialogコントロールをフォームにドラッグ します。 String fname = "d:\\test.txt"; saveFileDialog1.FileName = fname; saveFileDialog1.Filter = "テキスト(*.txt)|*.txt|すべてのファイル(*.*)|*.*"; if (saveFileDialog1.ShowDialog() == DialogResult.Cancel) { // キャンセル釦が押されたら return; } if (saveFileDialog1.FileName == null) { // ファイル名がなければ return; } else { // ファイル名を更新 fname = saveFileDialog1.FileName; } 9.5. テキストデータの保存 String [] src_code = { "G00 X10 Y10", "G00 Z-0.1", "G01 Y20 F50" } int i; String fname = "d:\\text.txt"; // ここに保存用ダイアログの表示を追加できます // 保存用ダイアログの表示の項を参照 System.IO.StreamWriter file_text = new System.IO.StreamWriter (fname, false, System.Text.Encoding.GetEncoding("Shift_JIS")); for ( i = 0; i < 3; i++) { // 1行を書き込み file_text.WriteLine( src_code[i]); } file_text.Close(); 9.6. バイナリデータの保存 Byte[] data = {0,1,2,3,4,5,6,7,8,9}; String fname = "d:\\data.bin"; // ここに保存用ダイアログの表示を追加できます // 保存用ダイアログの表示の項を参照 // 上書きモードでファイルを開きます // 既存のファイルがなければ新しくファイルが作成されます System.IO.FileStream fs = new System.IO.FileStream( fname, System.IO.FileMode.Create, System.IO.FileAccess.Write ); // バイナリ配列のデータを一括して書き込みます fs.Write(data, 0, data.Length); // ファイルを閉じます fs.Close(); 9.7. バイナリデータの読出し String fname = "d:\\test.bin"; saveFileDialog1.FileName = fname; saveFileDialog1.Filter = "テキスト(*.bin)|*.bin|すべてのファイル(*.*)|*.*"; if (saveFileDialog1.ShowDialog() == DialogResult.Cancel) { // キャンセル釦が押されたら return; } if (saveFileDialog1.FileName == null) { // ファイル名がなければ return; } else { // ファイル名を更新 fname = saveFileDialog1.FileName; } // ファイルオープン System.IO.FileStream fs = new System.IO.FileStream( fname, System.IO.FileMode.Open, System.IO.FileAccess.Read ); // バイト型データを用意 Byte[] data = new Byte[fs.Length]; // バイナリデータの一括読み込み fs.Read(data, 0, data.Length); // ファイルを閉じる fs.Close(); 10. シリアル通信 RS-232CコネクターのTxDとRxDを接続したループバックテストの例です。 (FT232RLモジュールを使用しテストしました。) int BAUD_RATE = 9600; string PORT_NAME = "COM4"; // 送信用バイトデータを用意 byte[] send_buf = new byte[] { 1, 2, 3, 4, 5 }; // 受信用バイト配列を用意 byte [] recv_buf = new byte[5]; // ポート名を設定 serialPort1.PortName = PORT_NAME; // 通信レートを設定 serialPort1.BaudRate = BAUD_RATE; // シリアル通信をオープン serialPort1.Open(); // 5バイト送信 serialPort1.Write(send_buf, 0, send_buf.Length); bool rt = true; int b1 = 0; int b2 = 0; int t_over_count = 0; // 受信タイムアウトを設定(msec) int time_out = 5000; // 受信バッファにデータが溜まるまで待ち while (true){ // 受信バッファーのバイト数を取得 b1 = serialPort1.BytesToRead; if( b1 == serialPort1.BytesToRead == send_buf.Length) { // 指定バイト数がバッファーにあれば break; // ループ終了 } // 1msec遅延。msec遅延の項目を参照。 Msec_Delay(1); // 受信バッファーのバイト数を取得 b2 = serialPort1.BytesToRead; if (b1 != b2) { //受信進行中なら t_over_count = 0; } if (++t_over_count == time_out) { // タイムオーバーなら rt = false; break; } } if(rt == false){ listBox1.Items.Add("受信タイムアウト"); } // 5バイト受信 serialPort1.Read(recv_buf, 0, send_buf.Length); // 受信したデータを表示 for(int i = 0; i < send_buf.Length; i++){ listBox1.Items.Add(recv_buf[i].ToString()); } // シリアル通信をクローズ serialPort1.Close(); 11. アプリケーションの終了 メニュー又はクローズ釦でアプリケーションを終了させます。 11.1. 終了メニュー 「ファイル」の「終了」メニューをクリックしてアプリケーションを終了させます。 1) メニューツールで「終了」メニューを作成します。 2) 「終了」メニューの左端を左ダブルクリックします。 「終了」メニューのクリックイベントコードが表示されます。 3) レジストリーへの登録やアプリケーションの終了を記述します。 private void 終了XToolStripMenuItem_Click(object sender, EventArgs e) { // レジストリ登録 string sub_key = "SOFTWARE\\HPGL2NC\\SETTINGS"; RegistryKey reg_key = Registry.LocalMachine.OpenSubKey(sub_key); reg_key = Registry.LocalMachine.CreateSubKey(sub_key); reg_key.SetValue("SCALE", scale); reg_key.SetValue("X_SHIFT", x_shift); reg_key.SetValue("Y_SHIFT", y_shift); reg_key.SetValue("Z_SHIFT", z_shift); reg_key.SetValue("DEPTH_RESULT", depth_result.ToString()); reg_key.SetValue("DEPTH_DRILL", depth_drill.ToString()); reg_key.SetValue("FEED", feed_set); reg_key.SetValue("Z_FEED", z_feed); reg_key.SetValue("Z_UP", z_up); reg_key.SetValue("DIMENSION_WIDTH", dimension_width); reg_key.SetValue("REVERSE", reverse); // ファイル名登録 if (file_name == null) { reg_key.SetValue("FILE_PASS", "hpgl2nc.plt"); } else { reg_key.SetValue("FILE_PASS", file_name); } // アプリケーション終了 Application.Exit(); } 11.2. クローズ釦 [×]釦 フォームのクローズ釦をクリックしてアプリケーションを終了する時に、終了メニュ ーを呼び出します。 1) Form1_FormClosingイベントコード表示させます。 1. Form1.cs[デザイン]タブをクリックして、フォームデザインを表示します。 2. Form1のプロパティウィンドウのイベントタグをクリックします。 3. FormClosingの項目名をダブルクリックします。 イベントのコードが表示されます。 2) 終了メニューのクリックイベントをコールするプログラムを記述します。 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { // 終了メニュークリックイベントをコール 終了XToolStripMenuItem_Click(sender, e); }
ページのTopへ:2006.04.20〜 サイトのTopへ
法律条項 この資料の著作権は著作者が有します。 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 プログラム作成でのコピー&ペーストなどによる利用は自由です。 それ以外の場合は、著作者まで連絡をお願いします。
inserted by FC2 system