見出し画像

【競馬】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 です。

レース開催が無い日や、古い開催日をコード内で指定している場合は下図のようなエラーが発生します。

この記事が気に入ったらサポートをしてみませんか?