Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#19

AW: Livebinding Problem mit Combobox auf Datenfeld

  Alt 8. Jan 2013, 16:13
Delphi-Referenz durchsuchenTDataGeneratorAdapter 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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 8. Jan 2013 um 16:17 Uhr)
  Mit Zitat antworten Zitat