参考
競馬ソフト開発体験教室(https://jra-van.jp/dlb/sdv/trial.html)
Lesson.3 JV-Dataの内容を読み出す
注:上記の参考サイトを元にVBからC#へ移植する進めていきます。
前回記事
JV-LinkをC#で使ってみる(WinForms版) ~2.JV-Dataをダウンロードする~
今回のソースコード
source – JV-LinkをC#で使ってみる(WinForms版) ~3.JV-Dataの内容を読み出す~
開発環境
- Windows7 64ビット版
- Visual Studio Community 2017
- JV-Link Ver.4.5.1
フォームの編集
データ表示エリアの作成
フォームデザイナーで[ツールボックス]から「RichTextBox」を貼り付けます。
「RichTextBox」の設定を以下のように変更します。
プロパティ | 値 |
---|---|
(Name) | rtbData |
Multiline | True |
WordWrap | False |
コードの編集
JV-Data構造体の使用方法
JRA-VAN Data Lab. SDK 内の「JVData_Struct.cs」をプロジェクトフォルダーにコピーします。
ソリューションエクスプローラーの[既存の項目を追加]から「JVData_Struct.cs」を追加します。
JV-Data構造体へのデータ読み込み
参考サイトのLesson.3のVBソースコードをC#へ移植します。
< サンプルを移植するにあたっての変更点 >
- [lBuffSize]のconstキーワードを外します。 ([lBuffSize]をoutパラメーター付きで渡しますが、const宣言されているとエラーが発生します。)
- do whileループのExit DoはVBのみでC#には存在しませんので、フラグ管理に変更します。
- switchの正常読み込み部分
case int ret when ret > 0:
はC#のバージョンによっては動作しない可能性があります。
前回追加したbtnGetJVData_Click()関数に対して、72~76行目/101~158行目が追加になっています。
private void btnGetJVData_Click(object sender, EventArgs e)
{
int nReturnCode;
try
{
string strDataSpec; // JVOpen: ファイル識別子
string strFromTime; // JVOpen: データ提供日付
int nOption; // JVOpen: オプション
int nReadCount; // JVOpen: 戻り値
int nDownloadCount; // JVOpen: 総ダウンロードファイル数
string strLastFileTimestamp; // JVOpen: 最新ファイルのタイムスタンプ
int nBuffSize = 110000; // JVRead: データ格納バッファサイズ
int nNameSize = 256; // JVRead: ファイル名サイズ
string strBuff; // JVRead: データ格納バッファ
string strFileName; // JVRead: ダウンロードファイル名
JV_RA_RACE RaceInfo = new JV_RA_RACE(); // レース詳細情報構造体
// 引数設定
strDataSpec = "RACE";
strFromTime = "20050301000000";
nOption = 2;
nReadCount = 0;
nDownloadCount = 0;
// JVLink ダウンロード処理
nReturnCode = AxJVLink1.JVOpen(strDataSpec, strFromTime, nOption, ref nReadCount, ref nDownloadCount, out strLastFileTimestamp);
// エラー判定
if (nReturnCode != 0)
{
MessageBox.Show("JVOpen エラー:" + nReturnCode);
}
else
{
MessageBox.Show(
"戻り値 : " + nReturnCode + "\n" +
"読み込みファイル数 : " + nReadCount + "\n" +
"ダウンロードファイル数 : " + nDownloadCount + "\n" +
"タイムスタンプ : " + strLastFileTimestamp);
if (nReadCount > 0)
{
bool flg_exit = false;
do
{
// バッファ作成
strBuff = new string('\0', nBuffSize);
strFileName = new string('\0', nNameSize);
// JVRead で1行読み込み
nReturnCode = AxJVLink1.JVRead(out strBuff, out nBuffSize, out strFileName);
// リターンコードにより処理を分枝
switch (nReturnCode)
{
case 0: // 全ファイル読み込み終了
flg_exit = true;
break;
case -1: // ファイル切り替わり
break;
case -3: // ダウンロード中
break;
case -201: // JVInit されてない
MessageBox.Show("JVInit が行われていません。");
flg_exit = true;
break;
case -203: // JVOpen されてない
MessageBox.Show("JVOpen が行われていません。");
flg_exit = true;
break;
case -503: // ファイルがない
MessageBox.Show(strFileName + "が存在しません。");
flg_exit = true;
break;
case int ret when ret > 0: // 正常読み込み
// レコード種別 ID の識別
if (strBuff.Substring(0, 2) == "RA")
{
// レース詳細のみ処理
// レース詳細構造体への展開
RaceInfo.SetDataB(ref strBuff);
// データ表示
rtbData.AppendText(
"年:" + RaceInfo.id.Year +
" 月日:" + RaceInfo.id.MonthDay +
" 場:" + RaceInfo.id.JyoCD +
" 回次:" + RaceInfo.id.Kaiji +
" 日次:" + RaceInfo.id.Nichiji +
" R:" + RaceInfo.id.RaceNum +
" レース名:" + RaceInfo.RaceInfo.Ryakusyo10 +
"\n");
}
break;
}
}
while (!flg_exit);
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
return;
}
// JVLink 終了処理
nReturnCode = AxJVLink1.JVClose();
if (nReturnCode != 0)
{
MessageBox.Show("JVClose エラー:" + nReturnCode);
}
}
コードの修正が完了したらプログラムを実行し、データ取得ボタンを選択して動作を確認します。
以上で、 JV-Data のデータ読み込みが完了となります。
ただし、現段階ではデータをテキスト表示しているだけなので実用性がありません。