DelphiでTListItemを継承した項目をリストビューに追加する

以前にC++BuilderでツリービューにTTreeNodeを継承した項目を追加する方法を書きました。
[C++Builder]TTreeNodeを継承した独自のノードをツリービューに追加する |山本隆の開発日誌

今回はDelphiでリストビューにTListItemを継承した項目を追加する方法です。

フォームにTListView、TLabel、TButtonを配置します。

01

TListItemを継承したクラスを作成します。

type
  TMyListItem = class(TListItem)
  public
    Time: TDateTime; //項目の作成時刻
  end;

リストビューのOnCreateItemClassイベントは、新しく項目を作成しようとしたときに発生します。
引数のItemClassを設定して、作成される項目オブジェクトのクラスをTMyListItemクラスにします。

procedure TForm1.ListView1CreateItemClass(Sender: TCustomListView;
  var ItemClass: TListItemClass);
begin
  ItemClass := TMyListItem;
end;

リストビューに項目を追加すると、TMyListItemクラスのオブジェクトが作成されます。

procedure TForm1.Button1Click(Sender: TObject);
var
  Item: TMyListItem;
begin
  Item := ListView1.Items.Add as TMyListItem;
  Item.Caption := IntToStr(ListView1.Items.Count);
  Item.Time := Now();
end;

項目を選択したとき、選択項目のTimeフィールドの値を表示します。
項目はTMyListItemクラスのオブジェクトになっています。

procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
begin
  Label1.Caption := FormatDateTime('hh:nn:ss', (Item as TMyListItem).Time);;
end;

実行結果

02

6000万ドルの損害を与えたbreak文の誤り

プログラマのためのサバイバルマニュアル』より。

1990年1月15日午後2時25分、AT&T電話網が落ちた。
電話網の稼働を再開させるまで9時間かかり、AT&Tが被った損害は6000万ドルと推計されている。

原因はC言語で書かれた次のようなコードだった。

if (condition) {
    // 仕事をする……
}
else {
    break;
}

このbreakはどのような働きをするのだろうか。

breakはif()文から抜け出すわけではない。
if()文の外側にあるwhile()やswitch()などから抜け出すのだ。

TDateTimePickerのFormatプロパティで日時の書式を設定する

Delphi XE2/C++Builder XE2からTDateTimePickerにFormatプロパティが追加されたようです。

Formatプロパティで日時の書式を設定することができます。

DateTimePicker1->Format = L"yyyy年MM月dd日";

TDateTimePicker

C++Builder XE以前ではDateTime_SetFormat関数を使います。

DateTime_SetFormat(DateTimePicker1->Handle, L"yyyy年MM月dd日");