top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
Delphi で静的な項目・型をもちいたバリューオブジェクトを利用する場合の簡単なサンプルを作成します。ここでは、注文-注文アイテムの2段階構造のものを利用することを想定します。
まず最初に注文アイテムです。こちらは単純なものの例です。
unit uOrderItemVO;
interface
// 注文アイテムバリューオブジェクト
type
TOrderItemVO = class
private
FItemNo: string;
FPrice: Integer;
FAmount: Integer;
public
// アイテム番号
property ItemNo: string read FItemNo write FItemNo;
// 価格
property Price: Integer read FPrice write FPrice;
// 数量
property Amount: Integer read FAmount write FAmount;
end;
implementation
end.
こちらは少し複雑なものです。
unit uOrderVO;
interface
uses System.SysUtils, System.Generics.Collections, uOrderItemVO;
// 注文バリューオブジェクト
type
TOrderVO = class
private
FOrderNo: string;
FTotalPrice: Integer;
FOrderDate: TDateTime;
FItems: array of TOrderItemVO;
procedure SetOrderNo(const No: string);
procedure SetTotalPrice(const Price: Integer);
procedure SetOrderDate(const DateTime: TDateTime);
public
// コンストラクタ
constructor Create;
// 注文番号
property OrderNo: string read FOrderNo write SetOrderNo;
// 合計金額
property TotalPrice: Integer read FTotalPrice write SetTotalPrice;
// 注文日
property OrderDate: TDateTime read FOrderDate write SetOrderDate;
// 注文アイテムを取得
function GetItems: TArray<TOrderItemVO>;
// 注文アイテムを挿入
procedure InsertItem(Index: Integer; const item: TOrderItemVO);
// 注文アイテムを追加
procedure AddItem(const item: TOrderItemVO);
// 注文アイテムを削除
procedure DeleteItem(Index: Integer);
end;
implementation
// コンストラクタ
constructor TOrderVO.Create;
begin
inherited Create;
FOrderDate := Now;
end;
procedure TOrderVO.SetOrderNo(const No: string);
begin
FOrderNo := No;
end;
procedure TOrderVO.SetTotalPrice(const Price: Integer);
begin
FTotalPrice := Price;
end;
procedure TOrderVO.SetOrderDate(const DateTime: TDateTime);
begin
FOrderDate := DateTime;
end;
// 注文アイテムを取得
function TOrderVO.GetItems: TArray<TOrderItemVO>;
begin
Result := TArray<TOrderItemVO>(FItems);
end;
// 注文アイテムを挿入
procedure TOrderVO.InsertItem(Index: Integer; const item: TOrderItemVO);
var
WrkList: TList<TOrderItemVO>;
i: Integer;
begin
try
WrkList := TList<TOrderItemVO>.Create;
WrkList.AddRange(FItems);
WrkList.Insert(Index, item);
SetLength(FItems, WrkList.Count);
for i := 0 to WrkList.Count - 1 do
begin
FItems[i] := WrkList.Items[i];
end;
finally
FreeAndNil(WrkList);
end;
end;
// 注文アイテムを追加
procedure TOrderVO.AddItem(const item: TOrderItemVO);
begin
InsertItem(Length(FItems), item);
end;
// 注文アイテムを削除
procedure TOrderVO.DeleteItem(Index: Integer);
var
WrkList: TList<TOrderItemVO>;
i: Integer;
begin
try
WrkList := TList<TOrderItemVO>.Create;
WrkList.AddRange(FItems);
WrkList.Delete(Index);
SetLength(FItems, WrkList.Count);
for i := 0 to WrkList.Count - 1 do
begin
FItems[i] := WrkList.Items[i];
end;
finally
FreeAndNil(WrkList);
end;
end;
end.
子のバリューオブジェクトは (TList<> ではなく) 配列で保持しています。これは、JSON 直列化の際に デフォルトの解釈器が美しい JSON 文字列を作成するために必要でした。