![]() |
[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:
Hat da vielleicht jemand eine Idee was ich Falsch mache? oder ist das ein generelles Problem von FMX mit iOS?
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; |
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 |
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.
|
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 |
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. |
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." |
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.
|
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. |
AW: [FMX-iOS] dynamische Livebindings funktionieren teilweise
Zitat:
|
AW: [FMX-iOS] dynamische Livebindings funktionieren teilweise
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz