Ver Mensaje Individual
  #2  
Antiguo 08-08-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Reputación: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita