Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   [FMX-iOS] dynamische Livebindings funktionieren teilweise (https://www.delphipraxis.net/194501-%5Bfmx-ios%5D-dynamische-livebindings-funktionieren-teilweise.html)

Devil1925 30. Nov 2017 12:35

[FMX-iOS] dynamische Livebindings funktionieren teilweise
 
Moin,
ich steh mal wieder vor ner Wand.
Ich erzeuge auf meinem Formular dynamisch Komponenten, welche ich dann ebenfalls dynamisch mit meiner Datenquery über Livebindings verbinde. Das Funktioniert auch erstmal alles wunderbar. Die komponenten werden erzeugt und die Daten über die Livebindings eingetragen und entsprechend angezeigt. Möchte ich die Daten jetzt bearbeiten (z.B. in einem Edit Feld), funktioniert das ganze auf Android einwandfrei und die geänderten Daten werden auch zurück in die Datenbank geschrieben. Auf iOS hingegen werden die Daten nicht abgespeichert, und bei z.B. einem TDateEdit stürzt die App beim eingeben eines geänderten Datums ab.

Hier die Prozedur zum Anlegen der LiveBindings:
Delphi-Quellcode:
procedure TForm1.LinkToControl(Control: TControl; DataSet: TUniQuery; FieldName: string);
var
  DataName: string;
  BindSourceDB: TBindSourceDB;
  BindingsList: TBindingsList;
  LinkListControl: TLinkListControlToField;
  LinkControl: TLinkControlToField;
begin
  DataName := DataSet.Name;
  if (DataName = '') and Assigned(DataSet.DataSource) then
    DataName := DataSet.DataSource.Name;

  if Assigned(Control.FindComponent(DataName + '_BindSource')) then
    raise Exception.CreateFmt('LinkToControl: %s.%s ist bereits an %s (%s) gebunden.', [DataName, FieldName, Control.Name, Control.ClassName]);

  BindSourceDB := TBindSourceDB.Create(Control);
  BindSourceDB.Name := DataName + '_BindSource';
  BindSourceDB.DataSet := DataSet;
  BindSourceDB.DataSet.Active := True;
  BindSourceDB.DataSource.Enabled := True;

  BindingsList := TBindingsList.Create(BindSourceDB);
  BindingsList.Name := DataName + '_BindingsList';

  if Control is TCombobox then
  Begin
    LinkListControl := TLinkListControlToField.Create(BindingsList);
    LinkListControl.Name := DataName + '_LinkListControl';
    LinkListControl.Control := Control;
    LinkListControl.DataSource := BindSourceDB;
    LinkListControl.FieldName := FieldName;
    LinkListControl.Active := True;
  end
  else
  Begin
    LinkControl := TLinkControlToField.Create(BindingsList);
    LinkControl.Name := DataName + '_LinkListControl';
    LinkControl.Control := Control;
    LinkControl.DataSource := BindSourceDB;
    LinkControl.FieldName := FieldName;
    LinkControl.Active := True;
  End;
end;
Hat da vielleicht jemand eine Idee was ich Falsch mache? oder ist das ein generelles Problem von FMX mit iOS?

Sherlock 30. Nov 2017 13:07

AW: [FMX-iOS] dynamische Livebindings funktionieren teilweise
 
Sind LiveBindings nicht faktisch tot? Miese Performance, recht buggy und am Ende nur für Projekte mit einer Komplexität knapp oberhalb von "Hello world" - also den Standard-Emba Demos geeignet. Lass lieber die Finger davon.

Sherlock

Devil1925 30. Nov 2017 13:10

AW: [FMX-iOS] dynamische Livebindings funktionieren teilweise
 
Meine gesamte app besteht aus Livebindings /.\ und das läuft eigentlich ganz gut... nur eben an dieser Stelle nicht.

Rollo62 30. Nov 2017 17:25

AW: [FMX-iOS] dynamische Livebindings funktionieren teilweise
 
Was passiert denn wenn du in der DB Daten manuell reinschreibst, ich nehme an mit FireDac ?

Geht das unter iOS denn sonst an anderer Stelle genauso, oder ist das jetzt ein generelles Problem ?
Könnte ja sein das da ein Commit fehlt vor dem Beenden ?
Würde ich mal generell ausprobieren bevor ich an den LiveBindings rumprobiere.

Rollo

Devil1925 1. Dez 2017 07:43

AW: [FMX-iOS] dynamische Livebindings funktionieren teilweise
 
Generell kann ich von der App aus normal in die DB reinschreiben (mache ich schon an einigen Stellen).
Nur eben an dieser Stelle mit den Dynamischen LiveBindings nicht.

TigerLilly 1. Dez 2017 08:17

AW: [FMX-iOS] dynamische Livebindings funktionieren teilweise
 
iOS - bist du sicher?

Die ganzen Bindings und Listen, die du erzeugst, sollen doch nach dem Prozeduraufruf noch "weiterleben". Du machst das konzeptionell falsch - lokale Variable, die "außerhalb" weiter benutzt werden, ist problematischer Code.

Android und OSX haben unterschiedliche Speicherverwaltung, deshalb funktioniert das auf Android, weil die Objekte erst dann freigegeben werden, wenn keine Referenz mehr drauf ist. Unter OSX wird der Speicher freigegeben, sobald die Objekte out of scope sind.

"The Android, iOS and Linux compilers use ARC memory management for objects. The Windows and OSX compilers use the classic manual memory management, where ARC is supported only on interface references, not objects. On the other hand, FMX as a cross-platform framework, and uses different memory management systems, depending on which OS platform it runs on."

Devil1925 5. Dez 2017 15:28

AW: [FMX-iOS] dynamische Livebindings funktionieren teilweise
 
So, ich habe das ganze jetzt mal geändert, sodass hier keine Lokalen Variablen in der Prozedur mehr verwendet werden. Trotzdem werden die Daten über die Livebindings nicht gespeichert. Und bei der Eingabe eines Datums stürzt die App beim tippen auf "Fertig" im Datumsdialog ab.

Stevie 5. Dez 2017 16:36

AW: [FMX-iOS] dynamische Livebindings funktionieren teilweise
 
Da stürzt nix ab, es gibt eine Exception und einen Callstack. Wenn du diese Informationen nutzt und möglichweise uns auch zur Verfügung stellst, dann findest du oder wir auch den Fehler.

P.S. Das hat nix mit ARC zu tun, denn all die Objekte sind von TComponent abgeleitet und ihnen wird ein Owner im Create mitgegeben, womit sie auch nach der Methode weiter leben.

TigerLilly 5. Dez 2017 20:51

AW: [FMX-iOS] dynamische Livebindings funktionieren teilweise
 
Zitat:

Zitat von Stevie (Beitrag 1388004)
Das hat nix mit ARC zu tun, denn all die Objekte sind von TComponent abgeleitet und ihnen wird ein Owner im Create mitgegeben, womit sie auch nach der Methode weiter leben.

:shock: Echt jetzt?

Stevie 5. Dez 2017 22:07

AW: [FMX-iOS] dynamische Livebindings funktionieren teilweise
 
Zitat:

Zitat von TigerLilly (Beitrag 1388013)
Zitat:

Zitat von Stevie (Beitrag 1388004)
Das hat nix mit ARC zu tun, denn all die Objekte sind von TComponent abgeleitet und ihnen wird ein Owner im Create mitgegeben, womit sie auch nach der Methode weiter leben.

:shock: Echt jetzt?

Ja, die Owner-Mechanik von TComponent führt dazu, dass sich da nix durch ARC auflöst, das ist der Hauptgrund für das unsägliche DisposeOf, was intern dafür sorgt, dass der Destruktor aufgerufen wird, obwohl RefCount der Instanz noch > 0 ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 Uhr.
Seite 1 von 2  1 2      

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