PDA

Ver la Versión Completa : Formlulario Login/Pass y Form Principal


mantraxer21
13-08-2011, 22:45:21
Estimados:

Tengo una muy pequeña aplicación, para poder hacer funcionar Login y Clave y luego de ello que se vaya al Formulario Principal.

Realidad:

FormLogin (fsNormal)
FormPrincipal (fsMDIForm)

Código del Boton Ingresar del Formulario LOGIN


procedure TForm1.IngresarClick(Sender: TObject);
var form : TMainForm;
begin

qLogin.close;
qlogin.ParamByName('txtlogin').AsString:=Login.Text;
qlogin.ParamByName('txtclave').AsString:=Clave.Text;
//Validaciones.Validate;

qlogin.Open;
if qlogin.Eof then begin
MessageDlg('Usuario incorrecto, vuelva a intentarlo.',mtError,[mbOk],0);
exit;
end;
FormPrincipal.Tag:=1;
self.Hide;
FormPrincipal.StatusBar1.Panels[1].text:=qLoginNOMBRE_COMPLETO.text;
Application.MessageBox( 'Bienvenido al Sistema',
MB_ICONINFORMATION );
Application.CreateForm(TFormPrincipal, FormPrincipal);
FormPrincipal.Tag:=0;
Principal.FormPrincipal.show;


En la última línea invoca al formulario Principal, el tema está todo bien, pero en el Formulario Principal, en un botón que llama a un "Formulario Hijo", da un error diciendo que no está activo.

Alguien puede ayudar con esto ???:(:(

Saludos Cordiales

ecfisa
14-08-2011, 00:08:00
Hola mantraxer21.

Correcto. Pero ayudaría más si pusieras la llamada al form hijo y el código mediante el cuál lo mostras.

Un saludo.

mantraxer21
14-08-2011, 02:01:19
Hola, gracias por responder....

Por ejemplo un boton está programado asi.


procedure TFormPrincipal.GraficoClick(Sender: TObject);
Var FormGrafico :TFormGraficoAgenda;
begin

FormGrafico :=TFormGraficoAgenda.Create(Self);
FormGrafico.Show;



:o

ecfisa
14-08-2011, 10:04:05
Hola mantraxer21.

Lo siento, he intentado entender la lógica de la apertura de los forms basándome en tu código y no lo logro. No puedo enteder el papel que juegan Form1, MainForm y Principal.

Es decir, TFormPrincipal es el MDIForm y TFormGraficoAgenda es el MDIChild. ¿ Pero que son Form1, MainForm y Principal ?


Un saludo.

mantraxer21
15-08-2011, 04:00:47
Hola Gracias

El Form1 = Formulario de Login
El MainForm y FormPrincipal = FormPrincipal

La equivocación era por el cambio de código...

Form1 = Login
FormPrincipal = Formulario Principal de Opciones del Sistema
FormGraficoAgenda = Formulario que permite graficar las tenciones agendadas.

Esos participan...

ecfisa
15-08-2011, 16:50:12
Hola mantraxer21.

Entonces si no entiendo mál tenes:

Form1 : fsNormal
FormPrincipal: fsMDIForm
FormGraficoAgenda: fsMDIChild


Lo que hay que tener en claro que en una aplicación MDI, la ventana principal siempre debe ser un MDIForm.
Y si la primera ventana que se crea en tu aplicación es Form1 (es decir que es la ventana principal), no va a funcionar.

Una solución es abrir tu proyecto y organizarlo así:

begin
Application.Initialize;
Application.CreateForm(TFormPrincipal, FormPrincipal); // Crear MDIForm
Application.FormPrincipal:= False; // Ocultar MDIForm
Application.CreateForm(TForm1, Form1); // Crear login
Form1.ShowModal; // Mostrar login
Application.ShowMainForm:= True; // Mostrar MDIForm
Application.Run;
end;


En este enlace (http://www.infonegocio.com/tudela2/delphiladero/docs/mdi/mdi1.htm) vas a encontrar información útil sobre la creación de aplicaciones MDI.

Un saludo.

mantraxer21
15-08-2011, 17:52:05
Gracias...

Revisé el orden que me enviaste, pero la línea de ocultar el FormPrincipal no me permite crearlo...

Dice.


'TApplication' does not contain a member named 'FormPrincipal'


La estructura es así en mi aplicación !


program APlicacionMDI;

uses
Forms,
Login in 'Login.pas' {FormLogin},
AccesoDatos in 'AccesoDatos.pas' {dm: TDataModule},
Pacientes in 'Pacientes.pas' {FormPacientes},
Principal in 'Principal.pas' {FormPrincipal},
Agenda in 'Agenda.pas' {FormAgenda},
visitamedica in 'visitamedica.pas' {FormVisitaMEdica},
Creditos in 'Creditos.pas' {FormCreditos},
Diagnosticos in 'Diagnosticos.pas' {FormDiagnostico},
GraficoAgenda in 'GraficoAgenda.pas' {FormGraficoAgenda};

{$R *.res}

begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(Tdm, dm);//DataModule1
Application.CreateForm(Tdm2, dm2);//DataModule2
Application.CreateForm(TFormPrincipal, FormPrincipal);
Application.FormPrincipal:=false; // aca da error !!!!
Application.CreateForm(TFormLogin, FormLogin);
FormLogin.ShowModal;
Application.ShowMainForm:=true;
Application.Run;
end.

ecfisa
15-08-2011, 18:30:22
Hola mantraxer21.

Mis disculpas, fue una confusión al ir escribiendo el código. Cambiá la línea que te dá error por:

Application.ShowMainForm:= False;

Fijate que en Auto-create forms, Form1 esté después de FormPrincipal.

Saludos.

mantraxer21
16-08-2011, 03:24:16
Sorry, por no escribir antes, efectivamente habia cambiado esa linea de código por la que mensionas, el tema es que ahora en la apliación (FormPrincipal - FormStyle: fsMDIForm) invoco a un Form-Hijo llamado "FormGrafico" (fsMDIForm), pero sólo hace un pequeño pestañeo, creo que está trabajando en segundo plano, capaz de ser visto por mi o visualmente para cualquiera.



procedure TFormPrincipal.GraficoClick(Sender: TObject);
Var FormGrafico :TFormGraficoAgenda;
begin

FormGrafico := TFormGraficoAgenda.Create(Application);
FormGrafico.Show;
end;



El programa NO se cae, ni muestra errores en la consola de mensajes.

Sólo hace que trabaja con un pestañeo en el FormPrincipal, donde estoy llamando al FormHijo !


Gracias

ReiCk_Z
26-08-2011, 20:08:37
mantraxer21, en mí caso para evitar ese pestañeo de la form (que para mí es molesto) es lo siguiente:


begin
Application.Initialize;
Application.CreateForm(TFormPrincipal, FormPrincipal); // Crear MDIForm
Application.ShowMainForm:= False; // Ocultar MDIForm
Application.CreateForm(TForm1, Form1); // Crear login
Form1.ShowModal; // Mostrar login
//Application.ShowMainForm:= True; (Omito esta línea)
Application.Run;
end;


y pongo la form principal en su propiedad visible en false;

después de validar si la clave es correcta entonces cierro la form donde me pide la clave y visualizo la form principal asi:


FClave.close;
Application.ShowMainForm:= True; // Mostrar MDIForm


En case de que apliques mi sugerencia, dime si te funciono.

mantraxer21
29-08-2011, 00:06:19
Muchas gracias por tu respuesta, efectivamente funcionó a la perfección dichas instrucciones y ya no tengo problemas con el login y Pass.

Muchas gracias

Saludos Cordiales

:rolleyes::rolleyes:

DSK25
12-10-2012, 02:11:26
Hola mantraxer21.

Entonces si no entiendo mál tenes:
Form1 : fsNormal
FormPrincipal: fsMDIForm
FormGraficoAgenda: fsMDIChild
Lo que hay que tener en claro que en una aplicación MDI, la ventana principal siempre debe ser un MDIForm.
Y si la primera ventana que se crea en tu aplicación es Form1 (es decir que es la ventana principal), no va a funcionar.

Una solución es abrir tu proyecto y organizarlo así:
Código Delphi [-] (http://www.clubdelphi.com/foros/#)begin Application.Initialize; Application.CreateForm(TFormPrincipal, FormPrincipal); // Crear MDIForm Application.FormPrincipal:= False; // Ocultar MDIForm Application.CreateForm(TForm1, Form1); // Crear login Form1.ShowModal; // Mostrar login Application.ShowMainForm:= True; // Mostrar MDIForm Application.Run; end;


En este enlace (http://www.infonegocio.com/tudela2/delphiladero/docs/mdi/mdi1.htm) vas a encontrar información útil sobre la creación de aplicaciones MDI.

Un saludo.

Se que llego un año tarde, pero ese código donde iría si uso C++ Builder? :)

escafandra
12-10-2012, 08:45:35
Es este hilo (www.clubdelphi.com/foros/showthread.php?t=73718) puedes encontrar lo que buscas.

Saludos.

DSK25
14-10-2012, 02:20:43
He visto el tema y he probado lo que esta ahi, pero al compilar me manda el error "Access violation at adress...", y luego aparace el Login y el formulario principal, como hago para que aparezca solo el login al inicio.

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
Application->Initialize();
Application->CreateForm(TfrmPrincipal, frmPrincipal);
Application->ShowMainForm = false;
Application->CreateForm(TfrmLogin, frmLogin);
frmLogin->ShowModal();
Application->ShowMainForm = true;
Application->Run();
}

escafandra
14-10-2012, 02:26:17
Si miraste la propuesta de abajo, verás que no se puede ejecutar el formularo principal hasta no identificarse correctamente:



WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();

TLogin *Log = new TLogin(0);
if(Log->ShowModal() == mrOk)
Application->CreateForm(__classid(TForm1), &Form1);
delete Log;
Application->Run();
}
//.................................................................
Si la salida del Log->ShowModal el mrOk el programa continua, si no, se termina. TLogin se encargará de gestionar si el usuario se autentificó de forma correcta y en ese caso devolverá mrOK.

void __fastcall TLogin::Button1Click(TObject *Sender)
{
if(Edit1->Text == "1234")
ModalResult = mrOk;
else
ModalResult = mrCancel;
}




Saludos.