LiveBindingsでTComboBoxに選択肢を設定したり、選択された値を取得する方法

LiveBindingsでTComboBoxに選択肢を設定したり、選択された値を取得する方法。

TDBLookupComboBoxみたいなことをLiveBindingsで実現する方法です。

TObjAとTObjBの2つのクラスを用意します。

TObjAはコンボボックスの選択肢となるオブジェクト、TObjBは選択された値を設定するオブジェクトです。

TObjA = class
private
  FId: Integer;
  FText: string;
public
  property Id: Integer read FId write FId;
  property Text: string read FText write FText;
  constructor Create(AId: Integer; AText: string);
end;

TObjB = class
private
  FObjA_Id: Integer;
  function GetValue: string;
public
  property ObjA_Id: Integer read FObjA_Id write FObjA_Id;
  property Value: string read GetValue;
end;

{ TObjA }

constructor TObjA.Create(AId: Integer; AText: string);
begin
  inherited Create;
  FId := AId;
  FText := AText;
end;

{ TObjB }

function TObjB.GetValue: string;
begin
  Result := Format('ObjA_Id=%d', [FObjA_Id]);
end;

フォームです。

フォームのデザイン

コンボボックスの項目は、TObjAのリストをLiveBindingsで結びつけます。

ボタンを押すと、コンボボックスで選択されたTObjAオブジェクトのIdフィールドの値がTObjBのObjA_Idプロパティに設定され、TObjBのValueプロパティの値がラベルに表示されます。

LiveBindingsデザイナ次のように設定すれば完成です。

LiveBindingsデザイナ

コンボボックスのItem.Textには項目の表示文字列、Item.LookupDataには項目が選択されたときの値、SelectedValueには選択された項目の値を設定します。

アプリケーションを実行したところ

実行画面

フォームのコードも書いておきます。

TForm1 = class(TForm)
…
private
  { private 宣言 }
  FObjB: TObjB;
public
  { public 宣言 }
end;

procedure TForm1.AdapterBindSource1CreateAdapter(Sender: TObject;
  var ABindSourceAdapter: TBindSourceAdapter);
var
  ObjAList: TObjectList<TObjA>;
begin
  ObjAList:= TObjectList<TObjA>.Create;
  ObjAList.Add(TObjA.Create(0, 'Alice'));
  ObjAList.Add(TObjA.Create(1, 'Bob'));
  ObjAList.Add(TObjA.Create(2, 'Carol'));
  ABindSourceAdapter := TListBindSourceAdapter<TObjA>.Create(self,
    ObjAList, True);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if PrototypeBindSource1.Editing then
    PrototypeBindSource1.Post;
end;

procedure TForm1.PrototypeBindSource1CreateAdapter(Sender: TObject;
  var ABindSourceAdapter: TBindSourceAdapter);
begin
  FObjB := TObjB.Create;
  ABindSourceAdapter := TObjectBindSourceAdapter<TObjB>.Create(self, FObjB);
end;

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください