Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Duda con ComponentCout (https://www.clubdelphi.com/foros/showthread.php?t=70312)

Paulao 13-10-2010 16:39:46

Duda con ComponentCout
 
Tengo una Unit en que yo escribo mis fuctions y procedures, para toda mi aplicacion. Que pasa es que i gustaria de esribir mto qmptodo el contenido de una sola vez de los Edits, maskEdit y etc... En el Form donde queda los componentes funciona. Entonces decidir escrivir ellos en una Unit para siempre que fuera usar, no necesito escribir en cada Form que tengo, pero solo llamar la procedure y listo. Pero como mi Unit no tiene componente y ninguno Form, el da erro de:
Undeclared Identifier para ComponentCout. Ya puzo en mi uses varias units, pero como no tengo Component pues es solo una Unit, mi gustaria de saber como hago esto.

Caro 13-10-2010 16:59:05

Hola Paulao, lo que puedes hacer es que uno de tus parámetros de tu procedimiento sea de tipo TForm, en el cual le pasaras el formulario del que quieres que recorra sus componentes:

Código Delphi [-]
unit Unit2;
interface
uses
  Forms, StdCtrls,Dialogs ........;
   procedure Recorrer(formulario : TForm);
 
..........................................................
procedure Recorrer(formulario : TForm);
begin
 for ind:=0 to formulario.ComponentCount-1 do
  begin
   if formulario.Components[ind] is TEdit then
  ......................................................

Saluditos

Paulao 13-10-2010 17:11:27

Yo tenia hecho esto, pero todo se queda congelado, travado y tengo dar un Kill en proceso.
Código Delphi [-]
procedure LimpaEdit(Form: TForm);
var
  i: Integer;
begin
  for i := 0 to Form.ComponentCount - 1 do
  begin
    if(Form.Components[i] is TcxTextEdit) then
      (Form.Components[i] as TcxTextEdit).Clear;

    if(Form.Components[i] is TcxLookupComboBox) then
      (Form.Components[i] as TcxLookupComboBox).Clear;

    if(Form.Components[i] is TcxCalcEdit) then
      (Form.Components[i] as TcxCalcEdit).Text := '0';

    if(Form.Components[i] is TcxDateEdit) then
      (Form.Components[i] as TcxDateEdit).Clear;
  end;
end;

Caro 13-10-2010 18:01:31

Hola de nuevo Paulao, a mi me funciona bien, ¿te sale algún mensaje de error?, no sera que entra en un ciclo infinito, verifica que valor tiene ComponentCount cuando entra a tu procedimiento.

Saluditos

ecfisa 13-10-2010 18:11:43

Hola Paulao.

No tengo esos componentes. Sin embargo ese código debería funcionar bíen usando los componentes standard.

Lo que sí te comento es que no hay necesidad de hacer:
Código Delphi [-]
 if(Form.Components[i] is TcxTextEdit) then 
      (Form.Components[i] as TcxTextEdit).Clear;
Es redundante y degrada el tamaño y velocidad del código.

Mucho mejor es:
Código Delphi [-]
   if (Form.Components[i] is TcxTextEdit) then
    // ya sabemos que es un TcxTextEdit...
      TcxTextEdit(Form.Components[i]).Clear;

Saludos. :)

rgstuamigo 13-10-2010 22:15:33

Cita:

Empezado por ecfisa (Mensaje 379171)
...
Lo que sí te comento es que no hay necesidad de hacer:
Código Delphi [-]
 if(Form.Components[i] is TcxTextEdit) then 
      (Form.Components[i] as TcxTextEdit).Clear;
Es redundante y degrada el tamaño y velocidad del código.

Mucho mejor es:
Código Delphi [-]
   if (Form.Components[i] is TcxTextEdit) then
    // ya sabemos que es un TcxTextEdit...
      TcxTextEdit(Form.Components[i]).Clear;
Saludos. :)

Pues yo no le veo diferencia, ya que en Delphi ambas formas son equivalente:
Código Delphi [-]
if(Form.Components[i] is TcxTextEdit) then 
      (Form.Components[i] as TcxTextEdit).Clear;// se está haciendo un casting usando el operador dinámico "as"
es equivalente a:
Código Delphi [-]
   if (Form.Components[i] is TcxTextEdit) then
      TcxTextEdit(Form.Components[i]).Clear;//Se está haciendo casting sin ningun operador
Lo único que puedo sugerir es que si SOLO se quiere Iterar el ciclo con solo Componentes que son descencientes de TControl, es decir sólo con controles, pues en ese caso sería mejor usar la propiedad ControlCount en lugar de ComponentCount para optimizar la operación ;), ya que la propiedad ComponentCount toma en cuenta tambien todos los componentes que sean o no sean controles, por ejemplo : Los TQuery,TDataSource,TTable,TXPManifest,etc. y como veis en éste caso no necesito incluir ese tipo de componentes en el ciclo.;)
De esa forma el procedimiento Optimizado quedaría así:
Código Delphi [-]
procedure LimpaEdit(Form: TForm);
var
  i: Integer;
begin
  for i := 0 to Form.ControlCount - 1 do
  begin
    if(Form.Controls[i] is TcxTextEdit) then
      (Form.Controls[i] as TcxTextEdit).Clear;

    if(Form.Controls[i] is TcxLookupComboBox) then
      (Form.Controls[i] as TcxLookupComboBox).Clear;

    if(Form.Controls[i] is TcxCalcEdit) then
      (Form.Controls[i] as TcxCalcEdit).Text := '0';

    if(Form.Controls[i] is TcxDateEdit) then
      (Form.Controls[i] as TcxDateEdit).Clear;
  end;
end;
Saludos...:)

ecfisa 13-10-2010 23:19:14

Cita:

Empezado por rgstuamigo (Mensaje 379205)
Pues yo no le veo diferencia, ya que en Delphi ambas formas son equivalente:

Hola.

Descomponiendo as en sus primitivas, sería:
Código Delphi [-]
  if Form.Component[i] is TcxTextEdit then
    TcxTextEdit(Form.Component[i]).Clear
  else
    raise EInvalidCast.Create('Tipo de conversión iválido');

Usando el ejemplo:
Código Delphi [-]
  if(Form.Controls[i] is TcxTextEdit) then
      (Form.Controls[i] as TcxTextEdit).Clear;

Y realizando un reemplazo por su equivalente queda:

Código Delphi [-]
  if Form.Component[i] is TcxTextEdit then
  { línea del as }
   if Form.Component[i] is TcxTextEdit then  // redundante...
     TcxTextEdit(Form.Component[i]).Clear
   else
    raise EInvalidCast.Create('Tipo de conversión iválido');

Saludos. :)

rgstuamigo 13-10-2010 23:39:49

Cita:

Empezado por ecfisa (Mensaje 379214)
Hola.

Descomponiendo as en sus primitivas, sería:
Código Delphi [-]
  if Form.Component[i] is TcxTextEdit then
    TcxTextEdit(Form.Component[i]).Clear
  else
    raise EInvalidCast.Create('Tipo de conversión iválido');
...

Pues, me sorpende tal "descomposición", aunque me gustaría saber ¿de dónde lo has sacado? Podrías darme algun enlace al respecto?
Épale..Cada día se aprende algo nuevo.:rolleyes:;)
Saludos...:)

ecfisa 14-10-2010 00:50:32

Cita:

Empezado por rgstuamigo (Mensaje 379216)
Pues, me sorpende tal "descomposición", aunque me gustaría saber ¿de dónde lo has sacado? Podrías darme algun enlace al respecto?
Épale..Cada día se aprende algo nuevo.:rolleyes:;)
Saludos...:)

Hola.

Si como no. Recordaba haberlo leido en La cara Oculta de Delphi.
Tuve que buscar un poco por que no sabía exactamente donde, pero ya lo ubiqué, está en la página 169.

Cita:

"El operador as se puede descomponer en instrucciones más simples. La primera
instrucción del ejemplo anterior es equivalente a la siguiente secuencia de instruc-
ciones:
if ActiveControl is TButton then
TButton(ActiveControl).Click
else
raise EInvalidCast.Create('Invalid type cast');
..."
Saludos. :)

rgstuamigo 14-10-2010 00:55:50

Pues si...tienes toda la razón amigo ecfisa.;)
En ese caso pues el código final bien Optimizado:D quedaría así:
Código Delphi [-]
procedure LimpaEdit(Form: TForm);
var
  i: Integer;
begin
  for i := 0 to Form.ControlCount - 1 do
  begin
    if(Form.Controls[i] is TcxTextEdit) then
      TcxTextEdit(Form.Controls[i]).Clear;

    if(Form.Controls[i] is TcxLookupComboBox) then
      TcxLookupComboBox(Form.Controls[i]).Clear;

    if(Form.Controls[i] is TcxCalcEdit) then
      TcxCalcEdit(Form.Controls[i]).Text := '0';

    if(Form.Controls[i] is TcxDateEdit) then
      TcxDateEdit(Form.Controls[i]).Clear;
  end;
end;
Saludos...:)


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

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