Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Ver el tipo al que pertenece una variable u objeto (https://www.clubdelphi.com/foros/showthread.php?t=68035)

r1d2m3 20-05-2010 20:35:32

Ver el tipo al que pertenece una variable u objeto
 
Hola a todos, tengo el siguiente inconveniente: necesito determinar el tipo de componente que hay en un form para, luego tomar un camino u otro, me explico mejor, el form tiene varios componentes, tsedit, tslabel, tcombobox, etc, etc, cuando reciben el foco debo determinar que tipo de componente recibe el foco, si es un tsedit hago algo, si es un tslabel hago otra cosa, etc,.
Necesitaría algo parecido a VarType pero para analizar el tipo de componente enfocado.

Gracias y saludos.

maeyanes 20-05-2010 21:32:01

Hola...

Para saber de que tipo es cierto objeto puedes usar el operador is:

Código Delphi [-]
// Preguntamos si cierto objeto es un descendiente de TCustomEdit:
if Edit1 is TCustomEdit then
  ShowMessage('Desciende de TCustomEdit');

Espero que te sirva para aclarar tu duda.


Saludos...

elarys 20-05-2010 21:58:23

me ganaste de mano apurado

ecfisa 21-05-2010 03:18:57

Hola.

Tal como dice maeyanes el operador is te permite averiguar que tipo de objeto es el actual,
pero tiene un inconveniente: aceptaría como TButton a un descendiente de él. (Como bién lo
aclara maeyanes en la línea de comentario).
Para saber exactamente cuál es el tipo del componente tendrías que usar ClassType para averiguarlo.

Un ejemplo:
Código:

procedure TForm1.ShowTipoCtrl;
var
  i: Integer;
  TC: TClass;
begin
  for i:= ControlCount -1 downto 0 do
  begin
    TC:= Controls[i].ClassType;
    if TC = TButton  then ShowMessage('TButton');
    if TC = TLabel then  ShowMessage('TLabel');
    if TC = TButtonExt then ShowMessage('TButtonExt')
  end
end;

Saludos.

r1d2m3 21-05-2010 16:02:57

Gracias por las respuestas, les comento como estoy manejando esta cuestión, en el post que envié no había aclarado que lo que me interesaba averiguar es el tipo de componente que dispara un evento, en mi caso, el evento es el OnChange, como saben, el manejador del evento recibe el componente que lo convoca por medio de la variable Sender que es del tipo object. Esta variable tiene una propiedad llamada ClassName que devuelve el tipo de objeto, he utilizado esta propiedad y he resuelto el problema que es muy sencillo, lo que necesitaba poner era un msg al operador que indique la cantidad de caracteres que restan entrar en el campo, pero cuando se trata de un campo tsmemo su comportamiento era diferente, les dejo el código para su revisión.

Código Delphi [-]
procedure TfrmABMDatos.VerLargoCadena(Sender: TObject);
begin
  if Sender.ClassName = 'TsMemo' then
    statusForm.Panels[0].Text := 'Caracter [' + IntToStr(Length(TsEdit(Sender).Text)) + ']'
  else
    statusForm.Panels[0].Text := 'Caracter [' + IntToStr(Length(TsEdit(Sender).Text)) + ' de ' + IntToStr(TsEdit(Sender).MaxLength) + ']';
end;

cuando se trata de un tsmemo, la leyenda que aprece es simplemente la cantidad de caracteres que se han tipeado, pero cuando se trata de un campo tsedit, pongo la cantidad de caracteres disponibles restantes del largo máximo aceptado:

Caracter [2000] o bien Caracter [12 de 50]

Saludos y nuevamente, gracias por las respuestas.


La franja horaria es GMT +2. Ahora son las 01:08:01.

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