2011-04-29 12 views
7

estoy creando código para un diálogo con un grupo de radio como parte de un formulario de preferencias. Parte de nuestro código es que cuando se abre el formulario de preferencias, se hace clic en el grupo de radio, que configura un montón de cosas (es decir, si el botón de opción está "desactivado", se ocultan un montón de cosas de configuración).¿Cómo identificar el tipo de objeto para el remitente en Delphi?

Lo que quiero saber es cuando el usuario realmente hace clic en el grupo de radio en lugar de que se dispare cuando se abre el cuadro de diálogo de preferencias.

Así que el código es el siguiente:

(open preferences)... 
rgMyGroupClick(nil) 

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject) 

if sender <> nil then 
begin 
//do something useful 
end; 

Pero este código también se ejecuta cuando se abre el diálogo de preferencias. ¿Qué debería poner allí para ejecutar solo cuando el usuario realmente hace clic con el mouse en el botón?

Gracias

Respuesta

16

Prueba de su emisor

Puede comprobar que el remitente de dos maneras:

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject) 
begin 
    if sender = RadioButton1 then //do action 
    else if sender = RadioButton2 then .... 

o puede probar el tipo de un remitente.

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject) 
begin 
    if sender is TRadioButton then //do action 
    else if sender is TForm then .... 

Los is pruebas de palabra clave para ver si un objeto es de un cierto tipo.
Tenga en cuenta que la prueba if AObject is TObject es siempre cierta porque cada objeto se deriva de TObject.

Más diversión con encasillamiento

El hecho de que is pruebas para el tipo de objeto y todos los antepasados ​​pueden ser utilizados para otros propósitos también:

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject) 
begin 
    //TObject does not have a 'tag' property, but all TControls do... 
    if (sender is TControl) and (TControl(Sender).Tag = 10) then .... 

Debido a short-circuit boolean evaluation Delphi comprobará primero (sender is TControl) y solo continuar si eso es cierto. Haciendo la prueba siguiente (TControl(Sender).Tag = 10) segura de usar.

Si no entiende el constructo TControl(Sender), puede leer sobre encasillado.
aquí: http://delphi.about.com/od/delphitips2007/qt/is_as_cast.htm
y aquí: http://delphi.about.com/od/oopindelphi/a/delphi_oop11.htm

9

Si te estoy entendiendo correctamente que hacen clic en sus radiogroup mediante programación para configurar el estado inicial de la forma, pero tiene código adicional en el controlador de clic que usted no desea ejecutar?

Si ese es el caso, quizás desee eliminar el código que establece el estado del formulario en su propio método y luego llamarlo desde el evento de clic de radio y desde la inicialización/demostración/creación de su formulario.

De esta forma puede usar el mismo código para establecer el formulario al estado requerido de un clic del usuario y establecerlo programáticamente sin hacer ninguna lógica adicional requerida cuando un usuario está interactuando con el diálogo. O tal vez he entendido mal por completo su problema ...

algo como esto:

// (open preferences)... 
SetStateOfFormForSelectedGroup(); 

procedure TdlgPreferences.SetStateOfFormForSelectedGroup() 
begin 
    //do all setting of form for selected group here. 
end; 

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject) 
begin 
    SetStateOfFormForSelectedGroup(); 
    //do something useful 
end; 
+0

Yu p, un caso clásico de refactorización. –

+0

+1 esta es la solución correcta –

3

Pruebe algunas funciones o propiedades, como:

Sender.classtype 
InheritedFrom() 

Nota: cuando se usa el transmisor obj del ButtonClick(sender:TObject) (por ejemplo) remitente = clase de botón en el clic => TButton

Así, TButton(Sender).properties o métodos etc ...

Cuestiones relacionadas