TDataGeneratorAdapter ist eigentlich nur dafür gedacht einen Prototyp zu haben, um zur DesignTime die Controls mit etwas Leben zu füllen und die Felder zum Verlinken an der Hand zu haben (für das VisualLiveBinding) oder auch dem Kunden ein Oberfläche mit einer (Dummy-)Funktion zu präsentieren.
Produktiv wird dieser Adapter nicht in Erscheinung treten.
Den Weg zu finden war eigentlich ganz einfach, nachdem ich im LiveBindings-Designer bei der ComboBox folgende (automatisch vorbelegte) Eigenschaften sah:
- Item.Text (das wird angezeigt)
- Item.LookupData (das ist der verbundene Wert)
- SelectedValue (das ist der aktuell ausgewählte Wert von Item.LookupData)
Das
SelectedValue hat mich dann einfach neugierig gemacht
Da ist noch eine Kleinigkeit zum AdapterBindSourceCreateAdapter-Event zu sagen:
Jedes mal, wenn
TAdapterBindSource.Active
von
False
auf
True
wechselt wird dieses Event ausgelöst.
Somit sollte man sicherstellen, dass (in diesem Beispiel) die gebundene Liste nicht jedes Mal neu erstellt wird, wenn der Adapter nicht die Kontrolle über diese Liste hat.
Delphi-Quellcode:
procedure TForm1.Property_AdapterBindSourceCreateAdapter( Sender : TObject;
var ABindSourceAdapter : TBindSourceAdapter );
begin
if not Assigned( FComboValues )
then
begin
FComboValues := TObjectList < TComboValues < Integer >>.Create;
FComboValues.Add( TComboValues<Integer>.Create( 0, 'undefiniert' ) );
FComboValues.Add( TComboValues<Integer>.Create( 1, 'Eigenschaft 1' ) );
FComboValues.Add( TComboValues<Integer>.Create( 2, 'Eigenschaft 2' ) );
FComboValues.Add( TComboValues<Integer>.Create( 3, 'Eigenschaft 3' ) );
FComboValues.Add( TComboValues<Integer>.Create( 10, 'Eigenschaft 10' ) );
end;
ABindSourceAdapter := TListBindSourceAdapter < TComboValues < Integer >>
.Create(
Self, // Owner des BindSourceAdapter
FComboValues, // Instanz einer Liste
False // Ist der BindSourceAdapter Owner der Liste
);
end;
Um dieser Liste jetzt zur Laufzeit einen weiteren Eintrag hinzuzufügen:
Delphi-Quellcode:
procedure TForm1.Button1Click( Sender : TObject );
begin
// Adapter deaktivieren
Property_AdapterBindSource.Active := False;
// Eintrag hinzufügen
FComboValues.Add( TComboValues<Integer>.Create( 11, 'Eintrag 11' ) );
// Adapter aktivieren -> CreateAdapter-Event wird ausgelöst
Property_AdapterBindSource.Active := True;
// Die ComboBox ist jetzt aber nicht mehr mit dem aktuellen Subject synchron, daher
Subject_AdapterBindSource.Refresh;
end;