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デザイナ次のように設定すれば完成です。
コンボボックスの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;