Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi LiveBindings, Verwendung u.a. von TListBindSourceAdapter (https://www.delphipraxis.net/190711-livebindings-verwendung-u-von-tlistbindsourceadapter.html)

haentschman 29. Okt 2016 15:04

Delphi-Version: 10 Seattle

LiveBindings, Verwendung u.a. von TListBindSourceAdapter
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallöle...:P

Ich mache meine ersten Schritte mit LiveBindings... bitte seid nett. :P

Was ich vorhabe:
Meine Anwendung hat als Datenhaltung reichlich generische Listen die von der DB gefüllt werden. Um die Schreibarbeit mit der Anbindung der Objekte übersichtlicher zu gestalten wollte ich mit LiveBindings arbeiten.

Dazu habe ich mir ein Testprojekt erstellt. Nach ein wenig lesen habe ich die Liste in die ListView bekommen. *schwitz*

Nur eine Sache kiege ich nicht hin:

1. Nur wenn ich die lokal deklarierte Liste ausschließlich im CreateAdaper erzeuge und ausfülle sind die Daten sichtbar. :gruebel:
2. Wenn ich die gefüllte Liste von außen, z.B. im constructor, übergebe ist die ListView leer. :gruebel:

Wo liegt der Denkfehler? :?

Testcode:
Delphi-Quellcode:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes, System.Generics.Collections, System.Generics.Defaults,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Data.Bind.Components, Data.Bind.ObjectScope, Data.Bind.GenData, Data.Bind.EngExt,
  Vcl.Bind.DBEngExt, System.Rtti, System.Bindings.Outputs, Vcl.Bind.Editors, Vcl.ComCtrls;

type
  TBlubb = class
  private
    FID: Integer;
    FDatum: TDateTime;
    FText: string;
    FCheck: Boolean;
  public
    property ID: Integer read FID write FID;
    property Text: string read FText write FText;
    property Datum: TDateTime read FDatum write FDatum;
    property Check: Boolean read FCheck write FCheck;
  end;

  TForm2 = class(TForm)
    edt1: TEdit;
    lbl1: TLabel;
    chk1: TCheckBox;
    binadp1: TAdapterBindSource;
    lv1: TListView;
    bndlst1: TBindingsList;
    genadp1: TDataGeneratorAdapter;
    linproCaption: TLinkPropertyToField;
    lnkcon1: TLinkControlToField;
    lincon1: TLinkFillControlToField;
    linproChecked: TLinkPropertyToField;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure binadp1CreateAdapter(Sender: TObject; var ABindSourceAdapter: TBindSourceAdapter);
  private
    FList: TObjectList<TBlubb>;
    FBlubb: TBlubb;
  public

  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.binadp1CreateAdapter(Sender: TObject; var ABindSourceAdapter: TBindSourceAdapter);
begin
  FList := TObjectList<TBlubb>.Create(True); // mußte hierher verschoben werden weil FormCreate nach dem CreateAdapter gefeuert wird. Sonst ist die Instanz nil.

  FBlubb := TBlubb.Create;
  FBlubb.ID := 100;
  FBlubb.Text := 'BLA';
  FBlubb.Datum := Now;
  FBlubb.Check := True;

  FList.Add(FBlubb);

  ABindSourceAdapter := TListBindSourceAdapter<TBlubb>.Create(self, FList);
end;

procedure TForm2.FormCreate(Sender: TObject);
begin

//  FBlubb := TBlubb.Create;
//  FBlubb.ID := 100;
//  FBlubb.Text := 'BLA';
//  FBlubb.Datum := Now;
//  FBlubb.Check := True;
//
//  FList.Add(FBlubb);
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  FList.Free;
end;

end.

haentschman 30. Okt 2016 08:17

AW: LiveBindings, Verwendung u.a. von TListBindSourceAdapter
 
Moin...:P

Bitte seid nachsichtig mit mir... Ich komme einfach nicht weiter. :?

Nach diversen Tests bin ich der Überzeugung das im CreateAdapter nur die Liste mit seinem derzeitigen Inhalt angezeigt wird. Ein Hinzufügen eines Objektes zu der Liste hat keinerlei Auswirkungen "optische" Auswirkungen. :? Das bedeutet, das der Inhalt der Liste nicht mit der Anzeige übereinstimmt. :?

Hat wirklich keiner jemals eine externe Liste an die LiveBindings gehängt? :? Was übersehe ich hier?

Ist das vieleicht ein Bug?

Danke...

Nachtrag:

Ist kein Bug. :P Das Geheimnis ist das Umgehens mit den "AOwnsObjects". 8-)
Delphi-Quellcode:
constructor TForm1.Create(AOwner: TComponent);
begin
  FList := TObjectList<TBlubb>.Create(True); // die Listeninstanz mit "True" = am Ende alles abräumen

  FBlubb := TBlubb.Create;
  FBlubb.ID := 100;
  FBlubb.Text := 'BLA';
  FBlubb.Datum := Now;
  FBlubb.Check := True;

  FList.Add(FBlubb);

  inherited; // erst die Listen Instanz und danach das BlubbCreateAdapter
end;
.
.
procedure TForm1.BindSourceAdapter1CreateAdapter(Sender: TObject; var ABindSourceAdapter: TBindSourceAdapter);
begin
  ABindSourceAdapter := TListBindSourceAdapter<TBlubb>.Create(self, FList, False); // nicht die Listenobjekte freigeben
end;
.
.
procedure TForm1.btn1Click(Sender: TObject);
begin
  FBlubb := TBlubb.Create; // 1 Objekt hinzufügen
  FBlubb.ID := 111;
  FBlubb.Text := 'BLUBB';
  FBlubb.Datum := Now + 30;
  FBlubb.Check := False;

  FList.Add(FBlubb);

  TListBindSourceAdapter<TBlubb>(binpro1.InternalAdapter).SetList(FList, False); // aktuelle Liste zuweisen, OwnsObjects = False, ! mit der Zuweisung wird die Liste nicht geleert.
  BindSourceAdapter1.Active := True; // wieder aktivieren
end;

Rollo62 31. Okt 2016 19:18

AW: LiveBindings, Verwendung u.a. von TListBindSourceAdapter
 
Das hier kennst du ?

Es geht zwar nicht genau um deine Liste, aber vielleicht hilft es dir ja trotzdem weiter.

Rollo

haentschman 1. Nov 2016 07:01

AW: LiveBindings, Verwendung u.a. von TListBindSourceAdapter
 
Moin...:P

Danke. Die kenne ich alle schon...:P
Inzwischen hat sich das mit den LiveBindings erledigt. Ich bin über neue Probleme gestolpert die ich nicht hinbekomme...:? Wenn jemand eine Lösung wüßte wie ich das eigentliche Objekt, ohne zusätzlichen Code, als DATA an das ListviewItem hängen kann... höre ich zu. 8-) Im Nachhinein geht das schon mit der Liste durchlaufen und die Items aktualisieren... dann kann ich es gleich klassisch machen. :?

Rollo62 1. Nov 2016 08:36

AW: LiveBindings, Verwendung u.a. von TListBindSourceAdapter
 
Hilft das als Vorlage weiter ?
Könnte vielleicht sogar mit Spring4D zusammenarbeiten.

Wahrscheinlich muss man aber noch etwas mehr basteln.

Rollo

haentschman 1. Nov 2016 09:00

AW: LiveBindings, Verwendung u.a. von TListBindSourceAdapter
 
Moin...:P
Zitat:

Wahrscheinlich muss man aber noch etwas mehr basteln.
...ich streube mich nicht neue Sachen auszuprobieren. Wenn aber das Verbinden eines Edits mit dem ausgewählten Objekt in der Liste den klassischen Aufwand übersteigt dann bin ich raus. Ich habe nicht die Zeit das Projekt (ca. 40000 Zeilen) komplett zu überarbeiten und zu basteln... :? Sorry...


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz