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 noOnChange
método de eventoOnChange
.anula el setter de propiedades de
ItemIndex
para 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
ItemIndex
programación noOnChange
elOnChange
eventoOnChange
. 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;