Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Desabilitar algunos componentes del formulario (https://www.clubdelphi.com/foros/showthread.php?t=73587)

Thoma 03-05-2011 16:35:37

Desabilitar algunos componentes del formulario
 
He estado buscando como desabilitar algunos componentes del formulario (de momento los TEdit) y solo he encontrado algo parecido pero con Labels. He intentado ajustarlo para que me funcione con los Edits, pero no habido forma de hacerlo funcionar.
Me explico:
dentro del formulario tengo varios paneles con sus componentes correspondientes y lo que quiero conseguir es que cuando el formulario entre en el estado de Consultas, no se pueda tener acceso a unos componentes determinados.
¿Alguna sugerencia de como puedo conseguirlo?.

procedure TFrm1.DesactivarEdit;
var i:Integer;
begin
for I := 0 to ControlCount - 1 do
if Controls[i] is TEdit then
TEdit(Controls[i]).Enabled := False;
end;

oscarac 03-05-2011 16:37:26

has probado con la propiedad enable ?


Código Delphi [-]
 
Componente.Enable := False;

esto hara que no se pueda tener acceso

Thoma 03-05-2011 16:42:39

te he puesto el codigo que tengo y algo debo de tener mal porque no me hace ni caso

oscarac 03-05-2011 16:57:12

ohh ya

prueba de esta manera

Código Delphi [-]
Procedure BloquearEdits (Form :TForm);
Var i :Integer;
Begin
   for i := 0 to (Form.ComponentCount - 1) do
    begin
     if (Form.Components[i]) is TEdit then
         TEdit(Form.Components[i]).Enabled := False;
     end;
end;

Thoma 03-05-2011 18:13:31

perdona, pero no acabo de entender el porque "(Form :TForm)"

y para llamar a la procedure?.. tendria que poner el nombre del formulario ?

oscarac 03-05-2011 18:21:44

es que el procedimiento que te he colocado funciona mas o menos de esta manera

Código Delphi [-]
BloquearEdits(frmDatos)

este procedimiebnto lo tengo en una unidad donde tengo librerias y procedimientos standard

Thoma 03-05-2011 18:40:25

me he puesto el procedimiento en la unidad donde tengo las funciones y las procedures.

hago la llamada
BloquearEdits(FrForm1);

y me da el siguiente error:

[DCC Error] FrForm1.pas(238): E2029 '.' expected but ')' found

ecfisa 03-05-2011 18:48:18

Cita:

Empezado por Thoma (Mensaje 398718)
te he puesto el codigo que tengo y algo debo de tener mal porque no me hace ni caso

Hola Thoma.

El código que adjuntaste funciona bién. Lo único que podría decir es que el cast es innecesario (pero igual funciona) ya que la clase TControl tiene la propiedad Enabled, es decir que podrías hacer:
Código Delphi [-]
procedure TFrm1.DesactivarEdit;
var
   i:Integer;
begin
  for i := 0 to ControlCount - 1 do
    if Controls[i] is TEdit then
        Controls[i].Enabled := False;
end;

Si querés que sólo los TEdits y no sus descendientes se desactiven sería:
Código Delphi [-]
procedure TFrm1.DesactivarEdit;
var
   i:Integer;
begin
  for i := 0 to ControlCount - 1 do
    if Controls[i].ClassType = TEdit then
        Controls[i].Enabled := False;
end;

El código de oscarac también es correcto y funcionará sin errores, revisá si copiaste bién.


Saludos.

Thoma 03-05-2011 19:05:04

Tengo que daros las gracias tanto a oscarac como a ecfisa.
Algo debo de tener mal porque no me funciona. Poniendo un punto de ruptura en el bucle me dice que el ControlCount = 1 y parece ser que no es un edit por que se sale de inmediato del bucle. ¿Tendra algo que ver que los TEdit esten dentro de paneles?

oscarac 03-05-2011 19:09:30

podrias colocar el codigo que estas usando?
no te olvides de colocar [delphi] [ /DELPHI] (sin el espacio despues del corchete)

Thoma 03-05-2011 19:12:39

Código Delphi [-]
procedure Frm1.DesactivarEdit;
var
   i:Integer;
begin
  for i := 0 to ControlCount - 1 do
    if Controls[i].ClassType = TEdit then
        Controls[i].Enabled := False;
end;

este es el codigo que estoy usando

el de oscarac me parece mas eficiente porque me podria servir para otros formularios pero no acabo de cogerle el truco.

oscarac 03-05-2011 20:10:26

pero esta claro...
imagina que tienes un formulario llamado frmDatos (ojo el nombre del form no el nombre de la unidad)

dentro de ese formulario tienes varios edits

entonces lo unico que haces es

Código Delphi [-]
BloquearEdits (frmdatos);

y debe funcionar bien

que problemas tienes

Thoma 03-05-2011 20:29:00

Código Delphi [-]
 
unit Rutinas;
const
    sFileDai='C:\file.INI';
  Procedure BloquearEdits (Form :TForm);
implementation
uses frAccesoDatos;
Procedure BloquearEdits (Form :TForm);
Var i :Integer;
Begin
   for i := 0 to (Form.ComponentCount - 1) do
    begin
     if (Form.Components[i]) is TEdit then
         TEdit(Form.Components[i]).Enabled := False;
     end;
end;
........................
unit FrFormulario;
type
  TFrFormulario= class(TForm)
    edtTitulo              : TEdit;
    edtValor               : TCurrencyEdit;
    lblValor               : TsLabel;
 
implementation
uses FrAccesoDatos, Rutinas;
 
procedure TFrFormulario.FormCreate(Sender: TObject);
begin
   BloquearEdits(TFrFormulario);
end;
....................

E2010 Incompatible types: 'TForm' and 'class of TFrmFormulario'

Al compilar me saca este error de incompatibilidad (algo se me escapa de las manos).


el nombre del formulario es "frmFormulario"
si pongo:
BloquearEdits(frmFormulario);

me dice el siguiente error:
E2003 Undeclared identifier: 'FrmFormulario'

ecfisa 03-05-2011 20:29:55

Cita:

Empezado por Thoma (Mensaje 398746)
¿Tendra algo que ver que los TEdit esten dentro de paneles?

Por supuesto que si. Al estar dentro de un TPanel el Parent de los Edits no es el form si no el TPanel, en ese caso sería:
Código Delphi [-]
procedure TFrm1.DesactivarEdits(AControl: TWinControl);
var
   i:Integer;
begin
  with AControl do
   for i := 0 to ControlCount - 1 do
    if Controls[i].ClassType = TEdit then
        Controls[i].Enabled := False;
end;

Llamada:
Código Delphi [-]
 DesactivarEdits(TuPanel);


Saludos.

beginner01 03-05-2011 20:31:38

Cita:

Empezado por Thoma (Mensaje 398737)
me he puesto el procedimiento en la unidad donde

tengo las funciones y las procedures.

hago la llamada
BloquearEdits(FrForm1);

y me da el siguiente error:

[DCC Error] FrForm1.pas(238): E2029 '.' expected but ')' found

ciertamente esta usando el nombre de la unidad y no el de el formulario

la llamada deberia de ser


Código Delphi [-]
 
BloquearEdits(Frm1);

que es el nombre de el formulario.

oscarac 03-05-2011 20:39:51

ejemplo
 
te pongo un ejemplo de como lo uso cuando tengo que eliminar un dato

Código Delphi [-]
procedure TfrmIngresoMercaderiaD.btnEliminaClick(Sender: TObject);
begin
  if Not TblDetalle.Eof then
    Begin
      Tbldetalle.edit;
      _Accion := 2;
      frmIngresoMercaderiaDDato := TfrmIngresoMercaderiaDDato.Create(Self);
      frmIngresoMercaderiaDDato.btnOk.Caption := '&Eliminar';
      BloquearEdits (frmIngresoMercaderiaDDato);
      frmIngresoMercaderiaDDato.Show;
    End;
end;

y cuando se activa el form.... todos los edits estan deshabilitados

Thoma 03-05-2011 20:45:10

Buenoooo... por fin.
Gracias ecfisa, de este modo me ha funcionado, repito !!!Gracias¡¡¡

Beginner01, lo habia probado de muchas formas pero ahora ya se que la culpa la tenia el dichoso Tpanel.

¡¡¡ gracias a todos por vuestra paciencia !!!

oscarac. Gracias a ti tambien.


La franja horaria es GMT +2. Ahora son las 10:41:07.

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