Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Evento OnClick (https://www.clubdelphi.com/foros/showthread.php?t=24080)

vtdeleon 08-08-2005 05:40:28

Evento OnClick
 
Saludos

Tengo algo curioso:confused:

En el evento onclick de un RadioGroup tengo asignado uno codigo(cualquiera), supongo que esto debe ejecutarse al hacer Click en este componente. Pero resulta que al cambiar un Item por codigo tambien llama a este evento:eek:.

Pueden darme alguna explicacion?:confused:

Nt: Me ha pasado con otros componentes pero al tener evento Onchance no le di importancia:rolleyes:

dec 08-08-2005 06:23:15

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.

vtdeleon 08-08-2005 19:03:33

Saludos

Gracias dec por la explicacion.

Vi el hilo que pusiste, aunque no me gusta esa manera, tendra que ser asi. Trate de capturar y crear eventos del componente y mensajes de Windows para el proposito, si exito.:(

Hasta Luego:D

dec 08-08-2005 19:31:47

Hola,

Cita:

Empezado por vtdeleon
Vi el hilo que pusiste, aunque no me gusta esa manera, tendra que ser asi.

Es posible que halla una forma mejor de hacerlo, pero, sinceramente, no encuentro nada "malo" en hacerlo de ese modo, porque, lo que se hace es perfectamente "normal". ¿Puede saberse porqué te ha caído gorda esa solución? ;)

vtdeleon 08-08-2005 23:40:18

Saludos

Jeje, vi tan simple la solucion qeu hasta me cayo mal:p y yo matandome la cabeza:D.

Gracias a dios y a usted, todo solucionado:)


La franja horaria es GMT +2. Ahora son las 02:00:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi