Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Livebinding Problem mit Combobox auf Datenfeld (https://www.delphipraxis.net/172500-livebinding-problem-mit-combobox-auf-datenfeld.html)

helste 7. Jan 2013 16:40

Livebinding Problem mit Combobox auf Datenfeld
 
Ich habe gerade XE3 installiert und fange an mich mit Livebindings zu beschäftigen.
So ungefähr habe ich das auch schon verstanden und mit dem vissuellen Livebindingseditor ist das eigentlich ganz einfach.
Jetzt hänge ich aber bei einem wohl trivialen Problem und habe nach stundenlangem Herumprobieren und Googeln keine Lösung gefunden.

Ich habe eine Datentabelle mit einem Integer Feld, welches einen bestimmten Wert zwischen 0 und sagen wir mal 10 hat.
Jeder dieser Werte repräsentiert eine bestimmte Eigenschaft.
Beispiel:
0 = undefiniert
1 = Eigenschaft 1
2 = Eigenschaft 2
3 = Eigenschaft 3

etc.

Nun habe ich auf dem Eingabeformular eine Combobox, platziert und möchte diese zum einen mit Items füllen, die eben den Eigenschaften entsprechen, also undefeiniert, Eigenschaft 1, etc.
Aus der Combobox soll eine Eigenschaft ausgewählt werden können und in der Datenbank soll dann entsprechend der Integerwert (in dem Fall also eigentlich Itemindex) gespeichert werden.
Umgekehrt soll natürlich auch anhand des gespeicherten Wertes gleich der Itemindex der Combobox gesetzt werden, damit der richtige Eigenschaftstext angezeigt wird.
Das möchte ich über Livebindings ralisieren. Irgendwie funktioneirt das aber nicht. Binde ich itemindex an das Feld, dann wird es zwar richtgi angezeigt, aber ich kann dann den Feldwert nicht neu setzen.
Außerdem bräuchte ich unter Umständen noch einen Weg für den nicht so trivialen Fall, dass der Feldwert genau dem Itemindex entspricht, sondern die Einträge der Auswahlliste durchaus eine andere Sortierung haben sollten, als der Integer Wert im Datenfeld, den sie repräsentieren.

Kann mir da vielleicht jemand auf die Sprünge helfen, bevor ich gleich wieder die Livebindings ad acta lege, noch ehe ich richtig damit angefangen habe?
Blöderweise gibt es jede Menge Tutorials, aber genau diese Problematik, die doch eigentlich so gängig sein sollte, wird nirgendwo erklärt.

Danke schon mal im Voraus.

stahli 7. Jan 2013 17:07

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Zitat:

Zitat von helste (Beitrag 1198126)
Außerdem bräuchte ich unter Umständen noch einen Weg für den nicht so trivialen Fall, dass der Feldwert NICHT genau dem Itemindex entspricht, sondern die Einträge der Auswahlliste durchaus eine andere Sortierung haben sollten, als der Integer Wert im Datenfeld, den sie repräsentieren.

Da fehlt wohl ein "nicht", dann wird es verständlicher...

Da stößt Du genau auf die Probleme mit dem DataBinding (neben dem Gitter-Problem).
Für manche Dinge sind die schon nützlich, man stößt aber schnell an Grenzen wenn man ein paar etwas speziellere Anforderungen/Wünsche hat.
Allgemein kann ich jetzt nicht sagen, wie die ItemIndex-Bindung möglich ist (schaue heute Abend mal nach). Spätestens, wenn Du die Reihenfolge ändern willst, musst Du eine "Übersetzung" hinterlegen. Du musst irgendwo nachsehen, welchen Index Du für Deinen Wert brauchst und umgekehrt. Dazu musst Du irgendwelchen Code ausführen. In einer einfachen Expression kannst Du das nicht erledigen ... außer, Du ruftst in der Expression eine Funktion auf - dann kannst Du das aber auch in einer Ereignisbehandlung durchführen.

Die Möglichkeiten einer Datenbindung sind da begrenzt.

Für manche Aufgaben sind sie praktisch und nützlich, aber sie haben ihre Schwächen und Tücken.


EDIT: Oh, herzlich willkommen noch! :-)

helste 7. Jan 2013 17:13

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Danke für Deine Antwort. Ja, ein NICHT macht es verständlicher. Sorry, Deutsch ist eine Fremdsprache für mich. Bin nämlich Österreicher;-)

Der triviale Fall, wo Itemindex dem wert in der Tabelle entspricht, wäre schon mal ein Anfang.
Wenn ich dann noch wüsste, ob es einen Eventhandler gibt, der zum Ermitteln des zu speichernden Wertes aufgerufen wird, dann könnte ich darüber dann auch eine Umsetzung von Itemindex auf einen beliebigen anderen Integerwert einfach realisieren.
Ist halt alles noch neu für mich. Jetzt fühle ich mich wieder wie ein blutiger Programmieranfänger, obwohl ich seit Turbopascal 3.0 dabei bin.

Edit: Achja, noch ein Zusatz: Den nicht trivialen Fall kann ich auch ganz simpel in einem Trigger der Datenbank erledigen. Reicht also erst mal die Verbindung Itemindex zum Datenfeld.

Edit2: Und danke für den Willkommensgruß. Bin hier ja schon lange registriert, habe bisher aber nur gelesen.

stahli 7. Jan 2013 17:26

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Was noch interessant sein könnte: Suchst Du eine Lösung für VCL oder FMX (kann ja u.U. leichte Differenzen geben)?

RWarnecke 7. Jan 2013 17:32

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Hier mein Versuch unter der VCL mit den LiveBindings und einer Combobox. Link

Ich habe es mittlerweile aufgegeben mit Livebindings zu arbeiten. Aus meiner Sicht sind die LiveBindings nicht ausgereift und selbst die Standard-Komponenten von Delphi werden nicht richtig unterstützt (z.B. DateTimePicker).

Bummi 7. Jan 2013 17:44

AW: Livebinding Problem mit Combobox auf Datenfeld
 
:thumb:

helste 8. Jan 2013 07:13

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Danke für die Antworten.
Aktuell suche ich eine Lösung für Firemonkey.
Ich habe auch schon festgestellt, dass es bei Livebindings merkwürdige Phänomene gibt, habe das aber eher dem Umstand, dass ich damit noch keine Erfahrung habe und eventuell Fehler bei der Anwendung gemacht habe, zugerechnet.
Dabei habe ich extra von XE2 auf XE3 upgegraded, damit ich den visuellen Livebinding Editor nutzen kann, weil das in XE2 sehr umständlich war.
Sieht auch ganz nett aus und ist für einige Dinge ganz praktisch, aber wenn man dann schon bei so einfachen Aufgaben scheitert, wird es mühsam.
Eventuell werde ich einen Mix aus Livebindings und konventionellem Vorgehen nutzen.

Wenn aber wer für die Verbindung von Itemindex in einer Combobox zu einem Datenfeld eine Lösung hat, wäre ich für Hinweise dankbar.

Rolf, Deinen Beitrag bzw. den ganzen Thread aus dem Oktober habe ich gelesen, aber daraus kann ich nicht erkennen, wie Du Itemindex mit dem Datenfeld verbunden hast, sodass auch der itemindex gespeichert wird.
Wenn ich Itemindex mit dem Datenfeld verbinde, so ist das immer nur unidirektional und dient daher nur der Darstellung des Datenbankwertes.

Oder habe ich da noch was übersehen?

Furtbichler 8. Jan 2013 07:21

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Zitat:

Zitat von helste (Beitrag 1198162)
Wenn aber wer für die Verbindung von Itemindex in einer Combobox zu einem Datenfeld eine Lösung hat, wäre ich für Hinweise dankbar.

Hinweis: Third-Party Controls, also TMS, DevExpress usw. Erst damit macht das Programmieren Spaß. Obwohl, Quatsch. Programmieren macht sowieso Spaß, aber mit besseren Controls macht es noch mehr Spaß und spart Zeit und bringt mehr Geld.

helste 8. Jan 2013 07:30

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Ja, das ist mir schon klar. Deshalb habe ich auch so gut wie alles, was es von TMS gibt. Auch die Firemonkeysuite.
Habe sie aber erst kurz. Gibt es da einen Comboboxersatz, wo das problemlos funktioniert?
Muss ich gleich mal genauer schauen.

stahli 8. Jan 2013 08:26

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Hast Du meinen Beitrag von gestern gesehen: http://www.delphipraxis.net/172249-d...ml#post1198159 ?
Am Videoanfang habe ich mal unter FMX Dein Problem versucht zu lösen. Ist mir aber nicht gelungen.
Ich denke nicht, dass Du Dich zu ungeschickt anstellst. Die LB sind einfach der falsche Ansatz.

helste 8. Jan 2013 08:37

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Nein, das Video hatte ich nicht gesehen. Ich schaue es mir gleich mal an. Danke.

Ich programmiere seit etwa beinahe 25 Jahren. Angefangen mit Turbopascal 3.0.
Mein erstes Delphi war Delphi 2.
Der erste große Umdenkprozess war schon bei Borlandpascal die objektorientierte Programmierung. Da habe ich am Anfang nicht ganz verstanden, was das bringen soll. Naja, mittlerweile kann ich es mir anders nicht mehr vorstellen:)

Jetzt wieder das Ding mit den Livebindings. Ich denke halt, dass ich da vielleicht derzeit die gleiche Blockade durchmache, wie zu Beginn der objektorientierten Programmierung.
Ich schau mir jedenfalls jetzt mal in Ruhe bei einer Tasse Kaffee Dein Video an und schaue dann weiter, was ich mache.

Eventuell frage ich mal bei Embarcadero nach, wie sie sich das vorstellen.

stahli 8. Jan 2013 09:21

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Oh, da erkenne ich mich ziemlich genau wieder ;-)

Du solltest nur das aktuelle LB nicht überbewerten.
Es soll einem lediglich etwas Arbeit abnehmen. Die Funktionsweise ist dank der neuen RTTI auchg keine Zauberei.
Das Problem ist, dass es zu viele Probleme damit gibt und dass der grundsätzliche Ansatz nicht wirklich sinnvoll ist (um komplexe BL-GUI-Bindungen zu realisieren).

Zum Thema "schreiben an Emba" kannst Du hier mal schauen:
http://www.delphipraxis.net/171665-e...moprojekt.html
http://www.delphipraxis.net/172143-h...=-support.html

David I hatte mir ein Demoprojekt versprochen, seitdem ist trotz zweifacher Nachfragen Ruhe. Unterstützer in der Thematik sind mir natürlich sehr willkommen.

Bin mal gespannt, ob der Kaffe nicht sauer wird, bei meinem "Video". :wink:
Sei nicht so streng mit mir, das Anliegen wird hoffentlich erkennbar.

helste 8. Jan 2013 09:23

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Ja, das scheint wirklich so nicht zu funktionieren.
Ich werde mal bei Embarcadero nachfragen.

Einstweilen habe ich aber eine Idee für einen quick and dirty workaround.
Ich platziere zusätzlich zur Combobox ein einfaches Editfeld, welches ich unsichtbar setze und versorge im OnChange der Combobox den Text des Editfeldes mit dem Itemindex der ComboBox. Das Editfeld verbinde ich mit der Datenmenge.
Eine Kleinigkeit fehlt mir noch. Das Editfeld wird zwar jetzt beim Welchseln von Itemindex der Combobox versorgt, aber das wirkt sich auf das Datenfeld noch nicht aus. Wenn ich im Editfeld den Wert manuell ändere, tut es das schon.
Ich muss also wohl im OnChange der Combobox, nach dem Setzen des Edit1,Text noch ein Notify aufrufen. Was genau, weißm ich aber leider nicht. Hat da wer einen Tipp?

helste 8. Jan 2013 09:26

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Zitat:

Zitat von stahli (Beitrag 1198179)
nicht wirklich sinnvoll ist (um komplexe BL-GUI-Bindungen zu realisieren).

Naja, so komplex finde ich den Wunsch Itemindex einer Combobox mit einem Datenfeld zu verbinden ja nicht.
Das ist doch eine der Grundfunktionen, wie eine Combobox mit einer Datenbank verbunden wird. Wer speichert schon die Textwerte in der DB?

helste 8. Jan 2013 11:13

AW: Livebinding Problem mit Combobox auf Datenfeld
 
So, jetzt kommen die nächsten Probleme.
Nachdem ich in Firemonkey nicht so recht weiter komme, habe ich mal eine VCL Testanwendung begonnen, um die Livebindings mal näher unter die Lupe zu nehmen.
Scheint so, als würde das nur mit den nativen Delphikomponenten funktionieren.
Habe mal ein TAdvEdit von TMS auf das Formular gelegt, aber da bekomme ich keine TLinkControlToField Bindung zusammen.

Also ehrlich, so mühsam hätte ich mir das echt nicht vorgestellt.

Ich glaube, ich pfeife auf die Livebindings und mache das wieder zu Fuß.
Die Livebindings dürften wohl eher so eine Art Marketinggag sein, als eine praktisch nützliche Funktion. Sieht in den Webinars gut aus, funktioniert in der Praxis aber gar nicht. Sehr enttäuschend. Ich frage mich bloß, warum ich letzte Woche so viel Geld in ein XE3 Update investiert habe. Der einzige Grund war der visuelle Livebindingseditor. Sonst wäre ich mal bei XE2 geblieben.

Sir Rufo 8. Jan 2013 14:29

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Liste der Anhänge anzeigen (Anzahl: 2)
Schau dir mal den Anhang an, so geht das mit den LiveBindings und der ComboBox :)

helste 8. Jan 2013 14:39

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Wow, super. Genau so will ich das haben.
Vielen Dank.
Ich habe jetzt nur mal die Exe ausprobiert und gerade mal den Source aufgemacht.
Ich schau mir das jetzt genau an und versuche es zu verstehen.
Wollte mich nur schnell mal bedanken.

Also, nochmal recht herzlichen Dank.

helste 8. Jan 2013 14:55

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Ich glaube, ich habe es verstanden.
Die Eigenschaftstexte werden nicht als Items in die Combobox geschrieben, sondern als Lookupvalues aus einer Datenmenge geholt. Wenn sie nicht in der DB sind, dann halt über den DataGeneratorAdapter.
Ist ein Weg, auf den man erst mal kommen muss.
Ich werde es mal damit versuchen. Vielen Dank.

Vielleicht hast Du auch eine Lösung für das 2. Problem, nämlich dass ich TMS Edits nicht bidirektional binden kann. Da funktionieren nur Propertybindings und keine Controlbindings.
Wenn ich ein Controllink machen will, dann werden diese Komponenten nicht angeboten, obwohl sie den gleichen Vorfahren wie die Standardkomponenten haben.
Wenn ich sie aber nur über LinkPropertyToField und nicht LinkControlToField binden kann, dann ist das nur unidirektional, kann also nur anzeigen, aber nichts in die DB zurück schreiben.
Gibt es da auch eine einfache Lösung, bzw. wodurch entscheidet das visual livebinding, welche Komponenten wofür angeboten werden?

Ich habe gerade ein paar Videos (Webinars)von Embarcadero aufgemacht, die ich mir anschauen werde.

Hast Du vielleicht einen Tipp auf ein Video und/oder eine Lektüre, wo das alles halbwegs verständlich beschrieben ist?
Die Art, wie Du das gelöst hast,. auf das wäre ich so nie gekommen. Ich suche halt jetzt zur Verkürzung der Einarbeitungszeit eine Quelle, wo ich solche Sachen finde.

Sir Rufo 8. Jan 2013 15:13

AW: Livebinding Problem mit Combobox auf Datenfeld
 
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
Delphi-Quellcode:
TAdapterBindSource.Active
von
Delphi-Quellcode:
False
auf
Delphi-Quellcode:
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;

helste 8. Jan 2013 15:57

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Ich habe das mal auf mein Beispiel umgesetzt und es funktioniert. Habe das auch so weit verstanden.

Vom Datageneratoradapter habe ich schon gewusst. Habe ich in den diversen Webinaren gesehen. Mir hat einfach das um die Ecke denken gefehlt, dass man den auch für sowas missbrauchen kann.

Danke für Deine Hilfe.:thumb:

Ich werde mir noch ein paar Videos und Blogbeiträge zum Thema rein ziehen. Wenn allerdings jemand einen Tipp für die ultimative Lektüre hat, dann bitte ich um einen dezenten Hinweis.:oops:

stahli 8. Jan 2013 20:29

AW: Livebinding Problem mit Combobox auf Datenfeld
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Sir Rufo (Beitrag 1198230)
Schau dir mal den Anhang an, so geht das mit den LiveBindings und der ComboBox :)

Hmm, ok es funktioniert. Aber wirklich effektiv ist das nicht.

Wenn ich die Wahl hätte, eine solche Funktionalität in Eventhandlern (so etwas wie OnGetText bzw. OnSetText o.ä.) des GUI-Controls umzusetzen oder in diversen Adaptern...
... dann ist mir die klassische Variante lieber. Der Aufwand bleibt ja der gleiche.

Will sagen: Die Emba-Lösung sagt mir generell nicht zu.


EDIT: Anbei ein Screenshot einer spezialisierten ComboBox, die direkt mit angebundenen Daten umgehen kann.
(Das kann man natürlich auch etwas abweichend organisieren.)

Sir Rufo 8. Jan 2013 21:11

AW: Livebinding Problem mit Combobox auf Datenfeld
 
@helste

Bitte gerne.

Der DataGenerator wird hier aber nicht missbraucht, sondern das ist der Weg ;)

Lektüre zu LiveBindings gibt es nur verstreut im Netz. Vom Hersteller gibt es bislang nur dürftige Informationen. Mal schauen ob sich das mit Marco ändert ... die Hoffnung stirbt zuletzt.

Bleibt allerdings immer noch die Performance Bremse, wenn es mal mehr wird.

helste 9. Jan 2013 06:52

AW: Livebinding Problem mit Combobox auf Datenfeld
 
@Sir, ich habe mir gestern Abend noch dieses Video rein gezogen:
http://www.youtube.com/watch?v=fBoFydYZsMo

Das hat mir sehr für das Verständnis geholfen. Ich habe nun auch eine Idee, was ich mit Livebindings machen kann und was nicht, bzw. was ich machen will und was nicht.

Vermutlich ist der Weg der, gewisse Aufgaben durch Livebindings zu lösen und andere auf anderem Weg.
Wenn man mal das Konzept verstanden hat, dann ist es eigentlich gar nicht so schlecht.

Ein paar Videos habe ich mir noch zur Seite gelegt. Die werde ich mir dann heute Abend weiter rein ziehen.

@Stahli, ich mache das üblicherweise auch so, dass ich mir spezialisierte Komponenten bastle. Werde das mit der Combobox auch machen. Jetzt, wo ich die Funktionsweise der Livebindings mal so halbwegs verstanden habe, sehe ich da einiges deutlich klarer. Ein spannendes Thema. Bin schon gespannt, wie es weiter geht.

Jedenfalls mal herzlichen Dank euch beiden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:39 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