delphi - El evento ComboBox OnChange ocurre cuando se cambia la propiedad ItemIndex en el código
events firemonkey (2)
La forma correcta de resolver este problema es primero averiguar de dónde se OnChange controlador OnChange . Esto se está haciendo en el método TCustomComboBox.DoChange() .
Entonces, lo que debes hacer es:
anula el
DoChange()predeterminadoDoChange()para noOnChangemétodo de eventoOnChange.anula el setter de propiedades de
ItemIndexpara usar una lógica diferente que no llamará al métodoDoChange().
Ambos enfoques requieren que crees una nueva clase para tu ComboBox modificado.
Estoy usando FMX en Delphi 10.1 Berlin.
Leo esto (que es el comportamiento que quiero):
https://stackoverflow.com/a/42933567/1343976
Cambiar
ItemIndexprogramación noOnChangeelOnChangeeventoOnChange. Dispara solo en respuesta a la interacción del usuario.
¿Es esto cierto solo para VCL?
Estoy pidiendo esto porque, desafortunadamente para mí, por lo que puedo probar, la modificación de la propiedad ItemIndex en el código desencadena el evento OnChange .
Si esto es cierto, ¿cómo puedo lograr el mismo comportamiento que VCL en FireMonkey?
¿Es esto cierto solo para VCL?
Muchas cosas se manejan de manera diferente en FMX.
Si esto es cierto, ¿cómo puedo lograr el mismo comportamiento que VCL en FireMonkey?
Una solución simple es OnChange propiedad del evento OnChange antes de cambiar el ItemIndex y luego restaurar el evento.
Una rutina simple para hacer esto sería algo así (como se describe en @Remy):
procedure SetItemIndex(ix : Integer; cb: TComboBox);
var
original : TNotifyEvent;
begin
original := cb.OnChange;
cb.OnChange := nil;
try
cb.ItemIndex := ix;
finally
cb.OnChange := original;
end;
end;