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/)
-   -   Delphi TComboboxEx und ItemIndex (https://www.delphipraxis.net/51892-tcomboboxex-und-itemindex.html)

dahead 21. Aug 2005 16:49


TComboboxEx und ItemIndex
 
Hallo,

ich habe momentan folgendes Problem: ich will einer Combobox (genauer TComboboxEx) den ItemIndex aus einer INI-Datei beim Programmstart (TForm.OnCreate) zuweisen.

Das Problem ist, dass die Combobox den Wert nicht annimmt und immer -1 verwendet.
Ich habe probeweise versucht den ItemIndex im TForm.OnShow mit der selben INI-Lade Prozedur zu laden, damit klappt es. Ebenfalls mit diesem Code, welchen ich beispielsweise über einen Button zur Laufzeit aufrufe:

Delphi-Quellcode:
CB_Type.ItemIndex := 4
Ich habe in TComboboxEx.Style die Eigenschaft auf "csExDropDownList" gestellt. Wenn ich auf "csExDropDown" wechsle, klappt alles wie gewünscht. Auch mit einer 'normalen' TCombobox (ohne Ex) funktioniert alles wie es soll, allerdings _auch_ mit der Eigenschaft "csDropDownList".

Ich verwende die TComboboxEx nur aus dem Grund, da sie von Haus aus Images (TImageList) akzeptiert. Falls ich das nicht bräuchte, würde ich halt einfach eine TCombobox verwenden.

Kann es sein, dass die Komponente TComboboxEx Probleme hat, im OnCreate den ItemIndex zu akzeptieren?

Hinweis: Der ItemIndex wird später in keiner anderen Prozedur/Funktion geändert, das habe ich schon überprüft. Auch wird der ItemIndex korrekt abgespeichert (und korrekt geladen). Die Items wurden zur Designtime erstellt.

Hoffe jemand von euch weiß weiter. Danke.

marabu 21. Aug 2005 17:41

Re: TComboboxEx und ItemIndex
 
Hallo,

ich kenne drei Gründe, aus denen der ItemIndex von ComboBoxEx nach dem Setzen auf -1 steht:

(1) wenn man ihn auf -1 setzt // trivial
(2) wenn die Komponente noch keine Items kennt // by design
(3) wenn alle Items der Komponente eine leere Caption besitzen // by side effect

Du solltest die Fälle (2) und (3) überprüfen...

Grüße vom marabu

dahead 21. Aug 2005 17:50

Re: TComboboxEx und ItemIndex
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

1.) Nein, mache ich nicht.
2.) meine ComboboxEx hat Items zur Designtime erhalten (s. Hinweis-Text im ersten Post).
3.) Leider auch nicht.

Wie gesagt, setze ich den Style auf csDropDown (nicht csDropDownList) funktioniert alles wie es soll.

Ich glaube ich mach mal am besten ein Beispielprojekt und hänge es hier an. Dauert evtl. noch ein bisschen.

Edit: Ok, nachdem ich das Beispielprojekt fertig hatte, ging alles wie es sollte. Irgendwo sonst habe ich wohl noch einen anderen Fehler der den ItemIndex ändert.

Also nochmals danke marabu, nächstes mal werde ich bevor ich einen neuen Thread aufmache, wohl erst ein Beispielprojekt erstellen

Edit2:
Ich hab jetzt auch den Fehler/Auslöse gefunden:

Die folgende Zeile sorgt in meiner Lade-Prozedur dafür, dass die Form entweder die zuletzt verwendeten X,Y Koordinaten verwendet, oder aber zentriert (poScreenCenter) ist. So wie es aussieht ist einzig und allein diese Zeile dafür verantwortlich, dass die ComboboxEx ihren ItemIndex verliert:

Delphi-Quellcode:
TForm.Position := poDesigned;
Edit3: hab jetzt mal das Beispielprojekt angehängt. So wie es aussieht ist der Befehl "SetPosition", welcher "RecreateWnd" aufruft letztendlich dafür verantwortlich, dass der ItemIndex verloren geht.

Ich muss also um mein Problem zu lösen, nur die INI-Ladeprozedur umstrukturieren, so dass zuerst die TForm.Position geladen wird, dann der Rest.

marabu 22. Aug 2005 22:16

Re: TComboboxEx und ItemIndex
 
Wenn du unbedingt Form.Position im OnCreate-Handler setzen möchtest, dann achte darauf, dass es deine erste Aktion ist - die Form wird dadurch on-the-fly neu erzeugt und zerstört alle deine sonstigen Veränderungen an properties, auch bei child controls.

Grüße vom marabu

dahead 23. Aug 2005 10:36

Re: TComboboxEx und ItemIndex
 
Ja, das stimmt, hatte ich in meinem Edit Nr. 3 auch schon bemerkt.
Trotzdem danke für den Hinweis!

shmia 23. Aug 2005 11:08

Re: TComboboxEx und ItemIndex
 
Zitat:

Zitat von dahead
Ich hab jetzt auch den Fehler/Auslöse gefunden:

Die folgende Zeile sorgt in meiner Lade-Prozedur dafür, dass die Form entweder die zuletzt verwendeten X,Y Koordinaten verwendet, oder aber zentriert (poScreenCenter) ist. So wie es aussieht ist einzig und allein diese Zeile dafür verantwortlich, dass die ComboboxEx ihren ItemIndex verliert:
Delphi-Quellcode:
TForm.Position := poDesigned;

Wenn man nachschaut, was dabei passiert:
Delphi-Quellcode:
procedure TCustomForm.SetPosition(Value: TPosition);
begin
  if FPosition <> Value then
  begin
    FPosition := Value;
    if not (csDesigning in ComponentState) then RecreateWnd;
  end;
end;
sieht man, dass RecreateWnd aufgerufen wird.
Dies zerstört das Hauptfenster und alle Childfenster (auch deine ComboBox).
Beim Neuerstellen der ComboBox, ist die Info über den ItemIndex weg, da der ItemIndex an das Handle der comboBox angebunden war.
Ergo -> das Property [TForm].Position darf zur Laufzeit nicht benutzt werden, wenn das Formular schon sichtbar ist oder schon Controls verändert wurden.
Das hätte Borland auch besser machen können (wäre dann wohl mehr Code geworden).

dahead 23. Aug 2005 11:18

Re: TComboboxEx und ItemIndex
 
@shmia:

siehe mein Edit 3. Bereits bekannt.

mirage228 23. Aug 2005 16:38

Re: TComboboxEx und ItemIndex
 
Hi,

ein ähnlicher Fehler im Bezug auf den ItemIndex ist bereits seit über 8 Monaten für Delphi 2005 bekannt:
http://www.delphipraxis.net/internal...ct.php?t=40913

Borland hat es seit dem nicht geschafft, diesen ärgerlichen Bug zu beseitigen...
Aber für dieses Problem gibt es wenigstens einen Workaround...

mfG
mirage228


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