private void RegistQSO() { int iTmp; double dTmp; #region "交信開始時刻" { int iTz; if (txtTimeZone.Text.ToUpper() == "JST") { iTz = 9; } else if (txtTimeZone.Text.ToUpper() == "UTC") { iTz = 0; } else if (!int.TryParse(txtTimeZone.Text, out iTz)) { //DateTime dtU = DateTime.UtcNow; //TimeSpan ts = DateTime.Now - dtU; ErrMsg("Invalid timezone formatting.\nタイムゾーンの書式が不正です(JST:+9、UTC:0)。"); } DateTime dtS; if (!DateTime.TryParse(txtDate_S.Text + " " + txtTime_S.Text, out dtS)) { ErrMsg("Invalid date formatting.\n日付の書式が不正です。"); return; } dtS = dtS.AddHours(-iTz); _QSO.Date_S = dtS.Ticks; } #endregion _QSO.Prefix1 = txtPrefix1.Text; _QSO.Prefix2 = txtPrefix2.Text; if (txtCall.Text == "") { ErrMsg("Error:The callsign is blank.\nコールサインが空白です。"); return; } else { _QSO.Call = txtCall.Text; } _QSO.QRA = txtQRA.Text; _QSO.DXCC = txtDXCC.Text; _QSO.CityCode = txtCityCode.Text; _QSO.GL = txtGL.Text; _QSO.QTH = txtQTH.Text; _QSO.QTH_h = txtQTH_h.Text; if (int.TryParse(txtRS_His.Text, out iTmp)) { _QSO.RS_His = iTmp; } else { ErrMsg("Error: RS_His"); return; } if (int.TryParse(txtRS_My.Text, out iTmp)) { _QSO.RS_My = iTmp; } else { ErrMsg("Error: RS_My"); return; } if (double.TryParse(txtFreq.Text, out dTmp)) { _QSO.SetFreq(dTmp, _dcBand); } else { ErrMsg("Error: Freq"); return; } _QSO.Mode = txtMode.Text; if (double.TryParse(txtPwr_My.Text, out dTmp)) { _QSO.Pwr_My = dTmp; } else { ErrMsg("Error: Pwr_My"); return; } #region "交信終了時刻" { if (txtTime_E.Text == "") { _QSO.Date_E = -1; } else { DateTime dtTmp; if (DateTime.TryParse(txtDate_S.Text + " " + txtTime_E.Text, out dtTmp)) { _QSO.Date_E = dtTmp.AddHours(-_QSO.TimeZone).Ticks; if (_QSO.Date_E < _QSO.Date_S) { _QSO.Date_E = dtTmp.AddHours(24 - _QSO.TimeZone).Ticks; } //零時またぎのQSO } else { ErrMsg("Error: Date_E or Time_E"); return; } } } #endregion _QSO.QSLManager = txtQSLManager.Text; _QSO.Rig_His = txtRig_His.Text; _QSO.Ant_His = txtAnt_His.Text; #region "相手局出力" if (txtPwr_His.Text == "") { _QSO.Pwr_His = -1d; } else { if (double.TryParse(txtPwr_His.Text, out dTmp)) { _QSO.Pwr_His = dTmp; } else { ErrMsg("Error: Pwr_His"); return; } } #endregion _QSO.Rig_My = txtRig_My.Text; _QSO.Ant_My = txtAnt_My.Text; _QSO.QTH_My = txtQTH_My.Text; _QSO.Prefix_My = txtPrefix_My.Text; _QSO.CityCode_My = txtCityCode_My.Text; _QSO.GL_My = txtGL_My.Text; _QSO.CardMsg = txtCardMsg.Text; _QSO.Remarks = txtRemark.Text; _QSO.Card_Send = chkCard_Send.Checked; _QSO.Card_Resv = chkCard_Resv.Checked; _QSO.Except = chkExcept.Checked; _QSO.LastUpdate = DateTime.UtcNow.Ticks; #region "QSLカード交換方法" if (rdoBureau.Checked) { _QSO.QSLMethod = (int)cQSO.enQSLMethod.B; } else if (rdoDirect.Checked) { _QSO.QSLMethod = (int)cQSO.enQSLMethod.D; } else if (rdoManager.Checked) { _QSO.QSLMethod = (int)cQSO.enQSLMethod.M; } else if (rdoNone.Checked) { _QSO.QSLMethod = (int)cQSO.enQSLMethod.N; } else if (rdo1way.Checked) { _QSO.QSLMethod = (int)cQSO.enQSLMethod.R; } else { _QSO.QSLMethod = (int)cQSO.enQSLMethod.X; } #endregion //新規QSO→更新履歴に追加する if (!_blAllQSO.Contains(_QSO) && _QSO.Call != "") { _blAllQSO.Add(_QSO); } //QSOを新規に _QSO = new cQSO(_QSO); RefleshForm(); }
//WSJT-XのLogプレビュー作成 private void PreviewWSJT() { List <string> lsErr = new List <string>(); int iDc = 0; //Dupeの件数 int iL = 0; using (StreamReader sr = new StreamReader(txtSetInCSV.Text, Encoding.ASCII)) { while (-1 < sr.Peek()) { iL++; cQSO q = new cQSO(); //自局情報 if (txtPrefix_My.Text != "") { q.Prefix_My = txtPrefix_My.Text; } if (txtQTH_My.Text != "") { q.QTH_My = txtQTH_My.Text; } if (txtDcode.Text != "") { q.CityCode_My = txtDcode.Text; } if (txtGL.Text != "") { q.GL_My = txtGL.Text; } if (0 <= cboQSL.SelectedIndex) { cQSL qs = (cQSL)cboQSL.SelectedItem; q.QSLMethod = qs.QSLMethod; } //QSO情報 string[] sL = sr.ReadLine().Split(','); DateTime dtS, dtE; int iV; double dV; if (!DateTime.TryParse(sL[0].Replace("-", "/") + " " + sL[1], out dtS)) { lsErr.Add(string.Format("Line:{0} 開始時刻の書式が不正", iL)); } if (!DateTime.TryParse(sL[2].Replace("-", "/") + " " + sL[3], out dtE)) { lsErr.Add(string.Format("Line:{0} 終了時刻の書式が不正", iL)); } q.Date_S = dtS.Ticks; q.Date_E = dtE.Ticks; q.TimeZone = 0; q.Call = sL[4]; q.GL = sL[5]; if (double.TryParse(sL[6], out dV)) { q.SetFreq(dV, _dcBand); } else { lsErr.Add(string.Format("Line:{0} 周波数の書式が不正", iL)); } q.Mode = sL[7]; string[] sCalls = q.Call.Split('/'); #region "移動運用対策" if (sCalls.Length == 3) { q.Prefix1 = sCalls[0]; q.Call = sCalls[1]; q.Prefix2 = sCalls[2]; } else if (sCalls.Length == 2) { if (sCalls[0].Length < sCalls[1].Length) { q.Prefix1 = sCalls[0]; q.Call = sCalls[1]; } else { q.Call = sCalls[0]; q.Prefix2 = sCalls[1]; } } #endregion //デフォルト設定のリグ if (chkUseDefault.Checked && _dcDefault.ContainsKey(q.Band)) { if (q.Prefix_My == "") { q.Rig_My = _dcDefault[q.Band].RigHome; q.Ant_My = _dcDefault[q.Band].AntHome; } else { q.Rig_My = _dcDefault[q.Band].RigMobile; q.Ant_My = _dcDefault[q.Band].AntMobile; } } if (int.TryParse(sL[8], out iV)) { q.RS_His = iV; } else { lsErr.Add(string.Format("Line:{0} 相手RSの書式が不正", iL)); } if (int.TryParse(sL[9], out iV)) { q.RS_My = iV; } else { lsErr.Add(string.Format("Line:{0} 自局RSの書式が不正", iL)); } if (double.TryParse(sL[10], out dV)) { q.Pwr_My = dV; } else { if (sL[10] != "") { lsErr.Add(string.Format("Line:{0} 出力の書式が不正", iL)); } } q.Remarks = sL[11]; q.QRA = sL[12]; //重複判別 bool bDupe = false; foreach (cQSO pq in _blDest) { if (pq.Date_S == q.Date_S && pq.Call == pq.Call) { bDupe = true; iDc++; } } if (bDupe && chkExceptDupe.Checked) { continue; } #region "DXCC" { string sPrefix = q.Call; if (1 < q.Prefix1.Length) { sPrefix = q.Prefix1; } if (1 < q.Prefix2.Length) { sPrefix = q.Prefix2; } Dictionary <string, string> dcDx = GetDXCC(sPrefix); if (dcDx.Count == 1) { var kv = dcDx.FirstOrDefault(); q.DXCC = kv.Key; } } #endregion _blPreview.Add(q); } } if (lsErr.Count != 0) { string sErr = string.Join("\n", lsErr); MessageBox.Show("エラーがありました。\n\n" + sErr, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); } if (iDc != 0) { MessageBox.Show("重複件数: " + iDc.ToString(), "重複がありました", MessageBoxButtons.OK, MessageBoxIcon.Information); } }
private void cmdSetInCSV_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); if (Directory.Exists(txtSetInCSV.Text)) { ofd.InitialDirectory = txtSetInCSV.Text; } ofd.Filter = "Logcs CSV file(*.csv)|*.csv|All files(*.*)|*.*"; if (ofd.ShowDialog() != DialogResult.OK) { return; } txtSetInCSV.Text = ofd.FileName; List <string> lsErr = new List <string>(); dgvInport.SuspendLayout(); using (StreamReader sr = new StreamReader(txtSetInCSV.Text, Encoding.GetEncoding(932))) { int iL = 0; while (-1 < sr.Peek()) { iL++; string[] sL = sr.ReadLine().Split(','); List <string> lsL = new List <string>(); #region "カンマ区切り対策" lsL.AddRange(sL); // 項目分繰り返す for (int i = 0; i < lsL.Count; ++i) { //先頭のスペースを除去して、ダブルクォーテーションが入っていないか判定する if (lsL[i] != string.Empty && lsL[i].TrimStart()[0] == '"') { // もう一回ダブルクォーテーションが出てくるまで要素を結合 while (lsL[i].TrimEnd()[lsL[i].TrimEnd().Length - 1] != '"') { lsL[i] = lsL[i] + "," + lsL[i + 1]; //結合したら要素を削除する lsL.RemoveAt(i + 1); } } } for (int i = 0; i < lsL.Count; i++) { lsL[i] = lsL[i].Trim().Replace("\"", ""); } #endregion cQSO q = new cQSO(); int iV; double dV; q.Prefix1 = lsL[0]; q.Call = lsL[1]; q.Prefix2 = lsL[2]; q.CityCode = lsL[3]; q.QTH = lsL[4]; q.QTH_h = lsL[6]; q.QRA = lsL[7]; if (int.TryParse(lsL[8], out iV)) { q.RS_His = iV; } else { lsErr.Add(string.Format("{0} RS_His={1}", iL, lsL[8])); } if (int.TryParse(lsL[9], out iV)) { q.RS_My = iV; } else { lsErr.Add(string.Format("{0} RS_My={1}", iL, lsL[9])); } if (double.TryParse(lsL[10], out dV)) { q.SetFreq(dV, _dcBand); } q.Mode = lsL[11]; if (double.TryParse(lsL[12], out dV)) { q.Pwr_My = dV; } else { q.Pwr_My = -1d; } DateTime dtS; if (lsL[16] == "J") { q.TimeZone = 9; } else if (lsL[16] == "U") { q.TimeZone = 0; } else { lsErr.Add(string.Format("{0} TimeZone={1}", iL, lsL[16])); } if (!DateTime.TryParse(string.Format("{0} {1}", lsL[13].Replace("-", "/"), lsL[14]), out dtS)) { lsErr.Add(string.Format("{0} Day={1} Time={2}", iL, lsL[13], lsL[14])); } else { q.Date_S = dtS.AddHours(-q.TimeZone).Ticks; } q.QTH_My = lsL[21]; q.Prefix_My = lsL[22]; if (Regex.IsMatch(lsL[23], @"^\d{4}")) { q.DXCC = "JA"; q.CityCode_My = lsL[23]; } else { q.DXCC = lsL[23]; } q.GL_My = lsL[24]; q.Rig_My = lsL[25]; q.Ant_My = lsL[26]; #region "カード交換方式" q.QSLMethod = (int)cQSO.enQSLMethod.N; if (lsL[29] == "J") { q.QSLMethod = (int)cQSO.enQSLMethod.B; } else if (lsL[29] == "D") { q.QSLMethod = (int)cQSO.enQSLMethod.D; } else if (lsL[29] == "M") { q.QSLMethod = (int)cQSO.enQSLMethod.M; } #endregion if (lsL[30] == "*") { q.Card_Send = true; } else { q.Card_Send = false; } if (lsL[31] == "*") { q.Card_Resv = true; } else { q.Card_Resv = false; } _blPreview.Add(q); } dgvInport.ResumeLayout(); } MessageBox.Show("プレビューされた交信リストを確認のうえ、問題が無ければ登録を押してください。", "確認", MessageBoxButtons.OK, MessageBoxIcon.Information); }