![]() |
Delphi-Version: XE5
Combobox lookup refresh Items
Hallo zusammen,
wie werden die Listeneinträge in einer Combobox aktualisiert, wenn sich die Daten in der darunterliegenden Datenmenge ändern (zur Laufzeit)? Mein Problem: Die Datenbankeinträge aus der die Lookup Werte kommen, ändern sich in Abhängigkeit von Masterdatensätzen. Das Dataset hat die korrekten Werte, jedoch ändern sich die Einträge in der Combobox nicht. Danke für Eure Hilfe. |
AW: Combobox lookup refresh Items
Welche Komponente meinst du genau? TComboBox, TDBComboBox, TDBLookupComboBox oder noch was anderes?
|
AW: Combobox lookup refresh Items
Ich meine die TCombobox in Verbindung mit Livebindings unter Firemonkey.
|
AW: Combobox lookup refresh Items
Ich hole das hier noch mal hoch, da ich aktuell praktisch das gleiche Problem habe - bzw. sogar noch simpler als der ursprüngliche Fragesteller:
Ich habe einfach eine Query die eine Tabelle abfragt. Eine Text-Spalte daraus ist via LiveBindings an eine Combobox (FMX) gebunden. Das klappt so an sich ganz gut. Wenn ich aber nun in meiner Tabelle einen neuen Datensatz anlege, oder einen bestehenden ändere, kommt davon in meiner Combobox nichts an. Query refreshen bringt leider nichts, und ich habe keine Möglichkeit gefunden, bei den an dem Binding beteiligten Komponenten einen Zwangs-Refresh bei z.B. Combobox.OnClick auszulösen. (Dabei fiel mir noch auf, dass man im Source auf die Property "LiveBindings" überhaupt nicht zugreifen kann - nur über den OI. Das ist ja mal ... nicht so toll. Ist das so gewollt!?) Zusatz: Selbst Schließen und wieder Öffnen der Query bringt nichts :shock:. Nur Neustart des Programms. Bei StringGrids funktioniert das allerdings! Verstehe ich nicht. |
AW: Combobox lookup refresh Items
*vorsichtigpush*
|
AW: Combobox lookup refresh Items
Hallo,
hier steht was von DataSource.Active=False und wieder True setzen, also nicht die Query. ![]() Oder deaktivierst das LiveBinding im Code und setzt die Query danach wieder drauf. Ich erkläre es etwas umständlich, weil ich LiveBindings nicht benutze. |
AW: Combobox lookup refresh Items
Soo, ich konnte das nun endlich mal testen. Leider ohne Erfolg.
Die dort beschriebenen Properties gibt es so bei mir überhaupt nicht. Ich vermute der wichtige Unterschied ist, dass dort VCL LiveBindings beschrieben werden. Ich arbeite jedoch mit FMX. (Prima, dass die Interfaces da unterschiedlich zu sein scheinen.....) Ich habe nun alles durch. Alle Komponenten die in irgendeiner Weise an den Bindings oder der Datenquelle beteiligt sind habe ich Disabled/Enabled, Refreshed, Close/Open, Tänzchen gemacht, Weihrauch verströmt. Nichts. Meine DropDowns versorgen sich EIN Mal bei Programmstart, und dann niemals wieder. Das kann's doch eigentlich nicht sein, oder? Das ist doch absolute Basis-Funktion, ein Musterbeispiel für was man LiveBindings überhaupt haben wöllte. Wie kann sowas ungetestet in einem Release landen? Hätte sonst noch ggf. jemand eine schlaue Idee? Ich will mein Programm eigentlich nicht nach jeder Änderung in meinen Tabellen neu starten lassen um diese in den Auswahlboxen zu übernehmen... (Sorry wenn das etwas angepinkelt klingt. Bin ich auch. Aber nicht von euch! <3 ) |
AW: Combobox lookup refresh Items
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
ich hänge mich mal an diesen Thread dran da die Überschrift passt und man ihn deshalb beim Suchen findet. Mein Problem betrifft allerdings die ComboBox unter FMX. Bin FMX-Anfänger... Frage: Wie ändere ich die in der DropDownList anzuzeigenden Einträge zur Laufzeit? Das angehängte Beispiel zeigt, dass sich bei Änderung (durch Click auf den Button) zwar die Titelzeile der ComboBox korrekt ändert, nicht aber der betreffende Eintrag in der DropDownList. Noch verwirrender: Beim ERSTEN Click tut er es manchmal(!) doch. Bitte mehrmals probieren. Und on top: Bei Auswahl des geänderten (falsch angezeigten) Eintrags wird dann doch der Eintrag MIT Änderung in die Titelzeile übernommen. Ist also nur ein Anzeige-Problem. |
AW: Combobox lookup refresh Items
Edit: Also bei mir geht dsa korrekt unter aktuellem Delphi 11 und Windows 11
Carsten |
AW: Combobox lookup refresh Items
Zitat:
Und auch der oben angehängte Screenshot zeigt doch die eigentlich per Definition ausgeschlossene Inkonsistenz zwischen DropDownList und Titelzeile der ComboBox. |
AW: Combobox lookup refresh Items
Zitat:
Aber wie erklärt sich dann das Bild in meinem ScreenShot? |
AW: Combobox lookup refresh Items
Vielleicht liegt es an Delphi 11?
Carsten |
AW: Combobox lookup refresh Items
Ich kann mir schwer vorstellen, dass Versionen vor Delphi 11 solch ein gravierendes und offensichtliches Problem haben. Deshalb suche ich den Fehler noch in meinem Code. Jedenfalls solange hier niemand das Problem (beschrieben in Beitrag #8) mit Version 10.4 nachvollziehen kann.
Hier nochmal die ausführliche Beschreibung (Source ist auch in Beitrag #8 gepostet): Eine FMX-ComboBox ist mit drei Einträgen "00" , "11" , "22" gefüllt. Bei Click auf den Button wird Eintrag 1 (also die "11") geändert indem die Stringlänge angehängt wird. Jetzt enthält die Titelzeile der ComboBox korrekt "112". Wenn man die DropDownListe aufklappt steht dort aber noch "11"! Achtung: Häufig tritt dieser Fehler beim ersten Mal nicht auf sondern erst ab dem zweiten Click auf den Button. Dann also ComboBoxText "1123" und DropDownList-Item1 "112" (wie im Screenshot in Beitrag #8 gezeigt). Kann das jemand nachvollziehen? Habe ich in der ComboBox irgendeine Eigenschaft falsch gesetzt? Anmerkung: In einem VCL-Projekt mit ComboBox-Style=csDropDownList (was der FMX-ComboBox wohl am nächsten kommt) tritt der Fehler nicht auf. |
AW: Combobox lookup refresh Items
Vielleicht solltest du noch dazuschreiben, was du erzeugst. Ich Hab Windwos 32 bit getestet.
Carsten |
AW: Combobox lookup refresh Items
Es gibt ja mehrere Varianten zum Füllen:
* direkt beim Erstellen/Laden der Form und dann unverändert * irgendwann, aber nie während, bzw. kurz bevor aufgepoppt wird * im OnClick, bzw. OnDropDown * während schon offen ist Erstmal zur VCL: * TComboBox kein Problem * TComboBoxEx geht garnicht, sobald ich einmal Items.Clear hatte (im Debugger kommt sogar eine Exception) * erstaunlich, gab es kein Clear und es gab noch nie Items (leer erstellt), dann geht bei Beiden das Dropdown mit einer Leerzeile auf * im FMX geht das DropDown nicht auf, wenn es nichts gibt (hätte ich von Windows auch fast erwartet)
Delphi-Quellcode:
Beim FMX mit TComboBox oder TComboEdit
// ComboBox1.OnDropDown + ComboBoxEx1.OnDropDown
procedure TForm5.ComboBox1DropDown(Sender: TObject); ComboBox1.Items.Clear; ComboBoxEx1.Items.Clear; Timer1.Tag := 10; Timer1.Enabled := True; //Timer1Timer(nil); // egal ob sofort auf, also erstmal ohne einen Eintrag, oder ob nicht leer ... kein Unterschied end; // Timer1.OnTimer mit Timer1.Enabled=False procedure TForm5.Timer1Timer(Sender: TObject); begin //ComboBox1.Items.Add(Timer1.Tag.ToString); //ComboBoxEx1.Items.Add(Timer1.Tag.ToString); SendTextMessage(ComboBox1.Handle, CB_ADDSTRING, 0, Timer1.Tag.ToString); SendTextMessage(ComboBoxEx1.Handle, CB_ADDSTRING, 0, Timer1.Tag.ToString); Timer1.Tag := Timer1.Tag - 1; if Timer1.Tag = 0 then Timer1.Enabled := False; end; // ComboBox1.OnCloseUp + ComboBoxEx1.OnSelect procedure TForm5.ComboBox1CloseUp(Sender: TObject); begin Timer1.Enabled := False; ComboBox1.Items.Clear; ComboBoxEx1.Items.Clear; end; * beim TComboEdit funktioniert auch garnichts * die TComboBox geht nur auf, wenn vor OnPopup Einträge vorhanden waren * * und es ist, kranker Weise, auch garnicht möglich im OnDropDown die Items zu ändern > es werden die alten Items angezeigt Fazit: * vorher DummyItems drin * bei FMX immer vorher füllen, da das OnDropDown absolut nutzloser Schrott ist |
AW: Combobox lookup refresh Items
Zitat:
Es wäre vielleicht am einfachsten wenn wir anhand meines Beispiel-Projektes aus Beitrag#8 diskutieren könnten. Einfach mal herunterladen, erzeugen und den Button clicken. Ich glaube wir haben das Mißverständnis, dass ich mit "Button" von der TButton-Komponente in meinem Beispiel spreche und Du von der DropDown-Schaltfläche an der ComboBox. |
AW: Combobox lookup refresh Items
Liste der Anhänge anzeigen (Anzahl: 1)
.. sieht doch eigentlich ok aus.
Delphi 11 - Windows 10 21H2 Bei zweimaligem betätigen des Buttons steht dort 1123 a) Item[1] 11 b) item{1] 112 - 11 plus Länge von '11' c) Item[1] 1123 112 plus Länge von '112' Grüße Klaus |
AW: Combobox lookup refresh Items
Ja, aber wenn Du mal die ComboBox aufklappst bei den Versuchen a bis c, dann steht dort etwas anderes (siehe Screenshot aus Beitrag #8).
|
AW: Combobox lookup refresh Items
ja, stimmt.
Delphi-Quellcode:
So sollte es funktioneren.
procedure TForm1.Button1Click(Sender: TObject);
begin ComboBox1.Items[1] := ComboBox1.Items[1] + length( ComboBox1.Items[1] ).ToString; Label2.Text := ComboBox1.Items[1]; ComboBox1.ItemIndex := 1; comboBox1.Repaint; end; Nein - auch noch nicht so richtig Grüße Klaus |
AW: Combobox lookup refresh Items
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe das Ganze jetzt mal in den FMX-Sourcen verfolgt:
Jede TComboBox hat ein Flag für den Zustand "ItemsChanged". Dieses Flag wird beim Aufklappen der DropDownListe abgefragt (TCustomComboBox.DropDown -> TCustomComboBox.InitPicker -> TComboBoxHelper.AreItemsChanged) und bei false wird die anzuzeigende Liste nicht aus den ComboBox-Items sondern aus einer Art Cache geholt. Dieses Flag wird aber beim Ändern eines einzelnen ComboBox-Items per Zuweisung nicht gesetzt. So entsteht die inkonsistente Anzeige beim Aufklappen der DropDown-Liste, siehe Screenshot. Die Merkwürdigkeit, dass dieser Fehler idR erst ab der zweiten Zuweisung (zweiter Click auf den Test-Button) auftritt liegt daran, dass von der Initialisierung (Übernahme der Items aus dem FMX-Formular) her das Flag noch auf true steht. Erst mit dem ersten (und jedem weiteren) Aufklappen der DropDownListe wird es auf false gesetzt (TComboBoxHelper.SetItemsChanged). Falls man in meinem Testprogramm vor dem ersten Button-Click schon mal die DropDown-Liste aufgemacht hat tritt der Fehler dann auch schon beim ersten Click auf. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 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