PDA

Ver la Versión Completa : Manipular TEdit de un Form desde una Unit


scigliano
29-11-2015, 00:33:23
Hola, un saludo a todos... :)

Les comento que tengo una Unit que utilizo para guardar los procedimientos y funciones que son comunes a varios formularios de la aplicacion.

El hecho es que estoy tratando de mover a esta Unit (que la he llamado UGlobal), un procedimiento que tengo en el Formulario que me permite pasar a Enabled:=False todos los Edit que encuentra en el Formulario.

En el Formulario, el procedimiento que tengo es el siguiente: (Funciona bien)


procedure TfrmGrupoUsuario.InactivarCampo;
var
i: Word;
begin
//*** Desactiva los campos del formulario
for i := 0 to self.ComponentCount - 1 do
begin
if (self.Components[i] is TEdit) then
TEdit(self.Components[i]).Enabled := False;
end;
end;



Cuando coloco el procedimiento anterior en la Unit y lo llamo desde el Formulario, arroja un error de Access Violation, sin mas detalles, intente pasarle el Name del Formulario como parametro, pero sigue el mismo error.
Pregunta: Que estoy haciendo mal ?? :confused:


procedure InactivarCampo(NameForm:TForm);
var
i: Word;
begin
//*** Desactiva los campos del formulario
for i := 0 to NameForm.ComponentCount - 1 do
begin
if (NameForm.Components[i] is TEdit) then
TEdit(NameForm.Components[i]).Enabled := False;
end;
end;


Gracias anticipadas por sus comentarios... :rolleyes:

wilcg
29-11-2015, 02:46:34
Hola scigliano,
Para lo que quieres hacer, yo lo hago de esta manera espero te sirva.

OPCION 1
- Habilitar y desabilitar los controles deseados del FORM

procedure TFode.OnOfCtrl(const Enabled: Boolean; Ctrls: array of TControl);
var
i: Integer;
begin
for i:= Low(Ctrls) to High(Ctrls) do
Ctrls[i].Enabled:= Enabled;
end;

USO:
Habilitar
Fode.OnOfCtrl(True,[Edit1,Edit2,Edit3,.....]);
Desabilitar
Fode.OnOfCtrl(False,[Edit1,Edit2,Edit3,.....]);

OPCION 2
Habilitar & desabilitar todos los controles que hay en un FORM

procedure TFode.OnOfForms( Enabled: Boolean; F :TForm );
var
Lista: TList;
i :integer;
begin
Lista := TList.Create;
try

F.GetTabOrderList(Lista);
for i := 0 to Lista.Count - 1 do
if TWinControl(Lista[i]) is TEdit then
TEdit(Lista[i]).Enabled := Enabled
else
if TWinControl(Lista[i]) is TcxTextEdit then
TcxTextEdit(Lista[i]).Enabled := Enabled
else
// mas..... Aqui indica con que controles quieres que funcione

finally
Lista.Free;
end;
end;

USO:
Habilitar
Fode.OnOfForms( True, Form1 );
Desabilitar
Fode.OnOfForms( False, Form1 );

Puedes adaptarle a lo que necesitas, espero sea útil.

AgustinOrtu
29-11-2015, 05:25:55
Este es un tipico caso de herencia.. donde todos tus forms tienen que hacer lo mismo..

Podrias hacer algo asi:



unit UBaseForm;

interface

uses
Forms,
Controls;

type
TBaseForm = class(TForm)
public
procedure ToggleControls(const IsEnabled: Boolean); overload; virtual;
procedure ToggleControls(const IsEnabled: Boolean; const ControlClass: TControlClass); overload; virtual;
end;

implementation

{ TBaseForm }

procedure TBaseForm.ToggleControls(const IsEnabled: Boolean);
var
I: Integer;
begin
for I := 0 to ControlCount - 1 do
Controls[I].Enabled := IsEnabled;
end;

procedure TBaseForm.ToggleControls(const IsEnabled: Boolean; const ControlClass: TControlClass);
var
I: Integer;
begin
for I := 0 to ControlCount - 1 do
if Controls[I].ClassType = ControlClass then
Controls[I].Enabled := IsEnabled;
end;


Ejemplo de uso:



unit Main;

interface

uses
UBaseForm,
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls;

type
TForm1 = class(TBaseForm) // --> Ahora tu ancestro es TBaseForm
Edit1: TEdit;
Memo1: TMemo;
btnDisable: TButton;
btnEnable: TButton;
Button1: TButton;
Edit2: TEdit;
procedure btnDisableClick(Sender: TObject);
procedure btnEnableClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnDisableClick(Sender: TObject);
begin
// deshabilitar todos los controles
ToggleControls(False);

// este boton lo dejo siempre habilitado, sino no puedo hacer mas nada
btnEnable.Enabled := True;
end;

procedure TForm1.btnEnableClick(Sender: TObject);
begin
// Habilitar todos los controles
ToggleControls(True);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
// solo Edits, invertir el valor
ToggleControls(not Edit1.Enabled, TEdit);
end;

end.

scigliano
01-12-2015, 21:38:55
Gracias a los amigos Wilcg y AgustinOrtu, era justo lo que necesitaba... :)
Ya tengo las ideas mucho mas claras...

Agradecido!! ^\||/