Hola,
Una explicación puede verse en el constructor de "TCustomRadioGroup", que es el tipo del que hereda directamente "TRadioGroup":
Código Delphi
[-]
constructor TCustomRadioGroup.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := [csSetCaption, csDoubleClicks, csParentBackground];
FButtons := TList.Create;
FItems := TStringList.Create;
TStringList(FItems).OnChange := ItemsChange;
FItemIndex := -1;
FColumns := 1;
end;
Observa cómo se "castea" la variable "FItems", de tipo "TStrings" para "promoverla" al tipo "TStringsList" y aprovechar así el evento "OnChange" de este último. De ese modo, cuando cambias por código el "ItemIndex" de un "TRadioGroup" se dispara dicho evento "OnChange".
Continuando un poco este es el método que se asigna al evento "OnChange":
Código Delphi
[-]
procedure TCustomRadioGroup.ItemsChange(Sender: TObject);
begin
if not FReading then
begin
if FItemIndex >= FItems.Count then FItemIndex := FItems.Count - 1;
UpdateButtons;
end;
end;
Nótese la llamada a "UpdateButtons", cuya implementación se ve a continuación:
Código Delphi
[-]
procedure TCustomRadioGroup.UpdateButtons;
var
I: Integer;
begin
SetButtonCount(FItems.Count);
for I := 0 to FButtons.Count - 1 do
TGroupButton(FButtons[i]).Caption := FItems[i];
if FItemIndex >= 0 then
begin
FUpdating := True;
TGroupButton(FButtons[FItemIndex]).Checked := True;
FUpdating := False;
end;
ArrangeButtons;
Invalidate;
end;
De todos modos no soy yo el más indicado para tratar estas cosas. Simplemente quería aportar algo y aquí estoy a riesgo de que me contradigan los que sepan/puedan hacerlo.
Creo haber respondido porqué ocurre lo que ocurre cuando cambias mediante código el "ItemIndex" de un "TRadioGroup", pero, no sabría explicar porqué esto ocurre así en algunos controles y no en otros.
Es verdad que ninguno de los tipos de que hereda "TRadioGroup" cuenta con un evento "OnChange". No ocurre así, por ejemplo, con "TComboBox", el cual hereda de "TCustomComboBox" y este de "TCustomCombo" y este de "TCustomListControl", que es quien implementa el evento "OnChange".
En todo caso hay modos de evitar que cuando cambies programáticamente el "ItemIndex" de un "TRadioGroup" y aun de otros controles, se dispare el evento "OnClick", si es esto lo que necesitas. Hace poco salió el tema
aquí mismo.