Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Combobox lookup refresh Items (https://www.delphipraxis.net/178585-combobox-lookup-refresh-items.html)

DenkDirNix 15. Jan 2022 18:15

AW: Combobox lookup refresh Items
 
Zitat:

Zitat von Carsten Hölscher (Beitrag 1500644)
Edit: Also bei mir geht dsa korrekt unter aktuellem Delphi 11 und Windows 11
Carsten

Das will ich Dir gerne glauben.
Aber wie erklärt sich dann das Bild in meinem ScreenShot?

Carsten Hölscher 15. Jan 2022 18:21

AW: Combobox lookup refresh Items
 
Vielleicht liegt es an Delphi 11?


Carsten

DenkDirNix 16. Jan 2022 08:18

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.

Carsten Hölscher 16. Jan 2022 09:38

AW: Combobox lookup refresh Items
 
Vielleicht solltest du noch dazuschreiben, was du erzeugst. Ich Hab Windwos 32 bit getestet.

Carsten

himitsu 16. Jan 2022 10:27

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:
// 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 FMX mit TComboBox oder TComboEdit
* 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

DenkDirNix 16. Jan 2022 17:46

AW: Combobox lookup refresh Items
 
Zitat:

Zitat von himitsu (Beitrag 1500668)
* * und es ist, kranker Weise, auch garnicht möglich im OnDropDown die Items zu ändern > es werden die alten Items angezeigt

Danke @himitsu. Das gilt nicht nur für Änderungen innerhalb des OnDropDown-Events!

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.

Klaus01 16. Jan 2022 18:03

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

DenkDirNix 16. Jan 2022 18:50

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).

Klaus01 16. Jan 2022 18:59

AW: Combobox lookup refresh Items
 
ja, stimmt.
Delphi-Quellcode:
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;
So sollte es funktioneren.
Nein - auch noch nicht so richtig

Grüße
Klaus

DenkDirNix 17. Jan 2022 10:15

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 06:25 Uhr.
Seite 2 von 2     12   

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