【競馬】Delphi で JRA-VAN DataLab. のデータを取得する
Delphi で JV-Link を操作することにより、JRA-VAN DataLab. が提供する競馬データを取得することができます。
今回は Delphi を使って簡単な競馬ソフトを作りたいと思います。
1. 事前準備
事前準備に関してはこちらの記事を参照して下さい。
2. 作成手順
Delphi IDE を開きます。
[ファイル] > [新規作成] > [Windows VCL アプリケーション] をクリックします。
新規プロジェクトが作成されました。
[ファイル] > [プロジェクトに名前を付けて保存] をクリックします。
まずはユニットの保存が求められます。適当なフォルダを指定して保存します。
名前はデフォルトの Unit1.pas としています。
同じフォルダにプロジェクトを保存します。
名前はデフォルトの Project1.dproj としています。
Delphi IDE の画面に戻ったら、画面右下のパレットの [Standard] > [TButton] をフォーム上に配置します。
IDE 画面左下のオブジェクト インスペクタの Name はデフォルトの [Button1] としています。
IDE 画面右下のパレットの [ActiveX] > [TJVLink] をフォーム上に配置します。
Name はデフォルトの [JVLink1] としています。
※ TJVLink は実行時に表示されないので、レイアウトを気にする必要はありません。
フォーム上の Button1 を選択し、オブジェクト インスペクタの [イベント] タブ内の [OnClick] の右の空欄をダブルクリックします。
コードエディタが開き、TForm1.Button1Click プロシージャが追加されます。
TForm1.Button1Click プロシージャの中身を下記コードで上書きします。
procedure TForm1.Button1Click(Sender: TObject);
var
ReturnCode : Integer;
Buff : WideString;
BuffSize : Integer;
FileName : WideString;
RaceName : WideString;
RaceNames : WideString;
Len : Integer;
LastChar : WideString;
begin
BuffSize := 40000;
RaceNames := '';
// 速報系データの0B12を呼び出し
// 日付は直近の土日を指定して下さい
ReturnCode := JVLink1.JVRTOpen('0B12', '20230423');
// JVRTOpenエラー処理
if ReturnCode <> 0 then begin
ShowMessage('JVRTOpen : ' + IntToStr(ReturnCode));
Exit;
end;
ReturnCode := 1;
while ReturnCode <> 0 do begin
ReturnCode := JVLink1.JVRead(Buff, BuffSize, FileName);
if copy(Buff, 0, 2) = 'RA' then begin
// レース名を抽出
RaceName := copy(Buff, 33, 30);
Len := Length(RaceName);
LastChar := copy(RaceName, Len, 1);
// 末尾の全角スペースを除去
while LastChar = ' ' do begin
RaceName := copy(RaceName, 0, Len - 1);
Len := Length(RaceName);
LastChar := copy(RaceName, Len, 1);
end;
// レース名が空文字でなければレース名一覧に結合
if RaceName <> '' then
RaceNames := RaceNames + RaceName + sLineBreak;
end;
end;
// レース名一覧を表示
ShowMessage(RaceNames);
// 一通り読み込みが終わった後はJVCloseを行う
ReturnCode := JVLink1.JVClose;
end;
17 行目の
ReturnCode := JVLink1.JVRTOpen('0B12', '20230423');
の日付部分は直近の土日(中央競馬のレースが開催された日)を yyyymmdd 形式で指定して下さい。
※ このコードで取得している速報系データはレース後 1 週間程で配信されなくなるので、古い開催日を指定してもデータは取得できません。
TForm1 クラスの定義に FormShow プロシージャの宣言
procedure FormShow(Sender: TObject);
を追加します。
TForm1.Button1Click プロシージャの前に、TForm1.FormShow プロシージャを追加します。
procedure TForm1.FormShow(Sender: TObject);
var
sid : WideString;
ReturnCode : Integer;
begin
sid := 'UNKNOWN';
// JVLink初期化
ReturnCode := JVLink1.JVInit(sid);
// JVInitエラー処理
If ReturnCode <> 0 Then begin
ShowMessage('JVInitエラー:' + IntToStr(ReturnCode));
Exit;
end
end;
Unit1 のコード全体は下記のようになります。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, JVDTLabLib_TLB,
Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
JVLink1: TJVLink;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
var
sid : WideString;
ReturnCode : Integer;
begin
sid := 'UNKNOWN';
// JVLink初期化
ReturnCode := JVLink1.JVInit(sid);
// JVInitエラー処理
If ReturnCode <> 0 Then begin
ShowMessage('JVInitエラー:' + IntToStr(ReturnCode));
Exit;
end
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ReturnCode : Integer;
Buff : WideString;
BuffSize : Integer;
FileName : WideString;
RaceName : WideString;
RaceNames : WideString;
Len : Integer;
LastChar : WideString;
begin
BuffSize := 40000;
RaceNames := '';
// 速報系データの0B12を呼び出し
// 日付は直近の土日を指定して下さい
ReturnCode := JVLink1.JVRTOpen('0B12', '20230423');
// JVRTOpenエラー処理
if ReturnCode <> 0 then begin
ShowMessage('JVRTOpen : ' + IntToStr(ReturnCode));
Exit;
end;
ReturnCode := 1;
while ReturnCode <> 0 do begin
ReturnCode := JVLink1.JVRead(Buff, BuffSize, FileName);
if copy(Buff, 0, 2) = 'RA' then begin
// レース名を抽出
RaceName := copy(Buff, 33, 30);
Len := Length(RaceName);
LastChar := copy(RaceName, Len, 1);
// 末尾の全角スペースを除去
while LastChar = ' ' do begin
RaceName := copy(RaceName, 0, Len - 1);
Len := Length(RaceName);
LastChar := copy(RaceName, Len, 1);
end;
// レース名が空文字でなければレース名一覧に結合
if RaceName <> '' then
RaceNames := RaceNames + RaceName + sLineBreak;
end;
end;
// レース名一覧を表示
ShowMessage(RaceNames);
// 一通り読み込みが終わった後はJVCloseを行う
ReturnCode := JVLink1.JVClose;
end;
end.
デザインビューに切り替え、フォームを選択した状態でオブジェクト インスペクタの [イベント] タブ内の [OnShow] の右のプルダウンリストから [FormShow] を選択します。
この操作により、フォームが呼び出されたときに JVLink の初期化処理が書かれている TForm1.FormShow プロシージャが呼び出されるようになります。
3. 動作確認
[実行] ボタンをクリックします。
Form1 が表示されたら、Button1 をクリックします。
メッセージボックスにレース名が表示されれば OK です。
レース開催が無い日や、古い開催日をコード内で指定している場合は下図のようなエラーが発生します。
この記事が気に入ったらサポートをしてみませんか?