TComboBox, SelectedItem a OnChange

vložil Radek Červinka 23. května 2012 23:34

Narazil jsem na zajímavý problém a celkem by mne zajímal Váš názor. Jedná se o rozdíl mezi FMX a VCL verzí TComboBox.

Ve VCL při nastavení SelectedItem se událost OnChange nevyvolá. Tato se vyvolá jen a pouze z UI. Ale ve FMX nastavení SelectedItem událost OnChange vyvolá. Narazil jsem na to při konverzi VCL aplikace na FMX verzi. Sranda je, že docwiki.embarcadero.com/Libraries/XE2/en/FMX.ListBox.TComboBox.ItemIndex o tom mlčí.

Osobně si myslím, že toto chování není správné. Nelze změnit property bez vyvolání události - snad jedině přes nějakou variantu BeginUpdate a spol. To jsem ale nezkoumal.

Ke které variantě VCL nebo FMX se přikláníte a proč?


Nabízíme Delphi školení na různá témata, primárně ve Vaší firmě.

Tagy:

FireMonkey | Praxe

Komentáře

24.5.2012 0:34:42 #

<z>

spravne by asi melo byt, ze se udalost vyvola (protoze napr. na to navazuji povoleni/zakazani jinych komponent),
ale je to o tom zvyku a urcite by to chtelo i moznost, kdyz to tu udalost nevyvola
(resp. lze tu udalost odstranit a pak dat zpet - zas prace)

<z>

24.5.2012 8:16:13 #

PetrK

Dle mého názoru je správná varianta, že se událost nevyvolá, protože mám možnost ji vyvolat ručně, ale simulovat nevyvolání je mnohem složitější. Dle mého názoru se události mají volat pouze při změně uživatelem a ne kódem.

PetrK

24.5.2012 8:46:53 #

Leoš

Došlo ke změně hodnoty, je zcela irelevantní jakým způsobem. Proto se událost vyvolat má.

Leoš

24.5.2012 9:31:33 #

Radekc

Hmm, teď jsem zkoušel že i když se hodnota nezmění, tj. stále přiřazuji např. 5 tak se událost vyvolá.

procedure TCustomComboBox.SetItemIndex(const Value: Integer);
begin
  if Assigned(FListBox) then
  begin
    FListBox.ItemIndex := Value;
    if not (csLoading in ComponentState) then
      DoChange;
    UpdateCurrentItem;
    if Assigned(FResourceLink) and (FResourceLink is TControl) then
      TControl(FResourceLink).UpdateEffects;
    Repaint;
  end;
end;

Radekc

24.5.2012 9:32:08 #

Alnath

Také si myslím, že událost by se vyvolat v tomto případě měla - ve VCL jsem ji pak po změně SelectedItem většinou volal ručně. V FMX je tedy situace opačná. Pokud nebudu chtít, aby se událost vyvolala, tak nastavím obsluhu OnChange na nil a po změně hodnoty SelectedItem ji zase vrátím zpět.

Alnath

24.5.2012 10:02:00 #

Leoš

Radek ad opakované vyvolání při stejné hodnotě:
Tam je otázka, co chápat jako OnChange(). Může to být změna na jinou hodnotu a může to nastavení nějaké (byť stejné) hodnoty. Pro oba případy si umím představit stav, kdy to bude správná funkčnost.

Leoš

24.5.2012 10:02:14 #

PetrK

No nevím... U které varianty je jednodušší zápis a ověření funkčnosti?
VCL:

procedure TForm42.ButtonSetWithEventCallClick(Sender: TObject);
begin
  ComboBoxVCL.ItemIndex := 1;
  ComboBoxVCL.OnChange(nil);
end;

procedure TForm42.ButtonSetWithoutEventCallClick(Sender: TObject);
begin
  ComboBoxVCL.ItemIndex := 1;
end;

procedure TForm42.ComboBoxVCLChange(Sender: TObject);
begin
  Beep;
end;

FMX:
procedure TForm43.ButtonChangeWithEventCallClick(Sender: TObject);
begin
  ComboBoxFMX.ItemIndex := 1;
end;

procedure TForm43.ButtonChangeWithoutEventCallClick(Sender: TObject);
var
  e: TNotifyEvent;
begin
  e := ComboBoxFMX.OnChange;
  ComboBoxFMX.OnChange := nil;
  ComboBoxFMX.ItemIndex := 1;
  ComboBoxFMX.OnChange := e;
end;

procedure TForm43.ComboBoxFMXChange(Sender: TObject);
begin
  Beep;
end;

PetrK

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS