PDA

Ver la Versión Completa : Mensaje de error al ejecutar el programa


Luli
18-11-2004, 23:09:13
hola, tengo problemas para ejecutar un programa, cuando lo quiero correr me sale este mensaje de error:


project proyecto1.exe raised exception class EInvalid Operation with message 'cannot focus a disabled or invisible window'. Process stopped.

El codigo del programa es este:



unit programita1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
//procedure Button2Click(Sender: TObject);
//procedure Button3Click(Sender: TObject);
//procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TApunt=^TNodo;
TNodo=record
Info: String;
Liga: TApunt;
end;

var
Form1: TForm1;
Inicio,Fin: TApunt;
implementation
{$R *.dfm}
//AGREGAR ELEMENTO
procedure Agregar(Elem: String);
Var Aux: TApunt;
begin
Inicio:=Nil;
New(Aux);
Aux^.Liga:=Nil;
Aux^.Info:=Elem;
if Inicio=Nil then Inicio:=Aux
else Fin^.Liga:=Aux;
Fin:=Aux;
end;
//ORDENAR ELEMENTO
//procedure Ordenar; {Ordenación por el método de Selección}
{Var Mov,Posicion,Menor: TApunt;
Aux: String;
begin
Mov:=Inicio;
if Inicio<>Fin then {Esto garantiza que hay mas de un elemento}
{repeat
Posicion:=Mov;
Menor:=Mov;
repeat
if Posicion^.Info<Menor^.Info then Menor:=Posicion;
Posicion:=Posicion^.Liga;
until Posicion=Nil;
if Menor<>Mov then {Si es necesario el intercambio}
{begin
Aux:=Menor^.Info;
Menor^.Info:=Mov^.Info;
Mov^.Info:=Aux;
end;
Mov:=Mov^.Liga;
until Mov=Fin;
end; }
//DESTRUIR ELEMENTO
{procedure Destruir;
begin
While Inicio<>Nil do
begin
Fin:=Inicio^.Liga;
dispose(Inicio);
Inicio:=Fin;
end;
end;}
procedure TForm1.Button1Click(Sender: TObject);
begin
if Edit1.Text<>' ' then {Garantiza que hay algo escrito}
begin
Agregar(Edit1.Text);
ListBox1.Items.Add(Edit1.Text);
Edit1.Clear;
//Edit1.SetFocus;
end;
end;


{procedure TForm1.Button2Click(Sender: TObject);
Var Aux: TApunt;
begin
Ordenar;
ListBox1.Clear;
Aux:=Inicio;
while Aux<>Nil do
begin
ListBox1.Items.Add(Aux^.Info);
Aux:=Aux^.Liga;
end;
end; }

{procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end; }
procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.Clear;
Edit1.Clear;
Edit1.SetFocus;
end;

{procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Destruir;
end; }

end.



No sé cual es el problema, me gustaria que me ayudaran

Muchas gracias

jhonny
18-11-2004, 23:32:37
Puede que sea dificil de descubrir el problema, como tambien puede que sea facil, en otras palabras...

Yo le apostaria a que es el Edit.SetFocus que tienes en el OnCreate de la forma, Incluso tambien podrian ser las otras dos lineas... No se pude garantizar que estos objetos esten creados cuando sea "Disparado" el evento OnCreate.


Una solución podria ser poner las 3 lineas el el evento OnShow.


Espero te sirva ;)

Luli
18-11-2004, 23:49:24
hola gracias por responder, efectivamente hace rato comenté las lineas de Edit1.SetFocus; y ya funcionó pero ahora quiero que lo que escriba en el edit se vea en el list box y eso es con esta linea :

ListBox1.Items.Add(Edit1.Text); pero nada, no se ve y en eso estoy ahorita, si me puedes ayudar te lo agradeceria mucho y si no, de todos modos gracias por el tiempo

jhonny
19-11-2004, 00:00:10
Y donde tienes este codigo?

ListBox1.Items.Add(Edit1.Text);

Esque asi deberia funcionar pero deberia estar dentro de algun evento o algun otro metodo llamarlo o algo asi...

Luli
19-11-2004, 00:09:13
ah es que esta en el codigo grandote que esta en el primer mensaje, mira el procedimiento es este:


procedure TForm1.Button1Click(Sender: TObject);
begin
if Edit1.Text<>' ' then {Garantiza que hay algo escrito}
begin
Agregar(Edit1.Text);
ListBox1.Items.Add(Edit1.Text); //esta es la linea
Edit1.Clear;
//Edit1.SetFocus;
end;
end;

y asi como esta no funciona, en el formulario esta un edit, un list box y tres botones, el usuario escribe algo en el edit y oprime el button1, entonces lo que escribio debe verse en el list box, ahora, no sé si debe referenciar algo en los eventos del list box o del edit del object inspector pero como que no se me hace, la verdad no se mucho de delphi ni de pascal... gracias

Luli
19-11-2004, 00:37:20
hola, comenté estas lineas:

procedure TForm1.FormCreate(Sender: TObject);
begin
//ListBox1.Clear;
//Edit1.Clear;
//Edit1.SetFocus;
end;

ya se resolvio el problema pero no entiendo porqué... al comentar esas lineas lo que escribo en el edit ya se ve en el listbox...

jhonny
19-11-2004, 15:08:13
No son acaso esas las tres lineas que te recomende que quitaras en mi anterior Post?

ya se resolvio el problema pero no entiendo porqué...
Ni yo.

procedure TForm1.FormCreate(Sender: TObject);
begin
//ListBox1.Clear;
//Edit1.Clear;
//Edit1.SetFocus;
end;
Solo he escrito este Post para decirte que si lo que pretendes es que el primer foco lo tome el Edit1 Solo basta con que pongas Edit1 en la proiedad ActiveControl del Formulario.

roman
19-11-2004, 17:16:13
Solo he escrito este Post para decirte que si lo que pretendes es que el primer foco lo tome el Edit1 Solo basta con que pongas Edit1 en la proiedad ActiveControl del Formulario.

O bien colocarlo al principio del orden de tabulación. Salvo contadas excepciones, en mis formularios el ActiveControl es siempre el primero en la tabulación.

También hago la observación de que en principio, las sentencias ListBox1.Clear y Edit1.Clear son innecesarias en el evento OnCreate. La única forma de que tengan datos previos es que no hayan sido borrados durante el diseño.

Y para puntualizar un poco, respecto de este comentario


No se pude garantizar que estos objetos esten creados cuando sea "Disparado" el evento OnCreate


de hecho sí se puede garantizar, al menos mientras la propiedad OldCreateOrder del formulario sea false (el valor por defecto).

Antiguamente (Delphi <= 3) el evento OnCreate se lanzaba desde el mismo constructor del formulario pero ahora se lanza desde el método AfterConstruction que se ejecuta una vez que se ha terminado completamente la construcción del formulario- y por tanto de todas sus subcomponentes.

Lo que sucedió en este caso, es que el formulario- si bien ya construído -aún no es visible y por ello, cambios de foco como Edit1.SetFocus deben hacerse en el evento OnShow que ocurre después de que el formulario se ha hecho visible.

// Saludos