Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Mensaje de error al ejecutar el programa (https://www.clubdelphi.com/foros/showthread.php?t=16193)

Luli 18-11-2004 23:09:13

Mensaje de error al ejecutar el programa
 
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:

Código Delphi [-]
  
 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^.InfoMov 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

ListBox1.Items.Add(Edit1.Text);
 
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?
Código Delphi [-]
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

aqui esta el procedimiento
 
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

ya
 
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?

Cita:

Empezado por Luli
ya se resolvio el problema pero no entiendo porqué...

Ni yo.
Cita:

Empezado por Luli
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

Cita:

Empezado por jhonny
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

Cita:

Empezado por jhonny
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


La franja horaria es GMT +2. Ahora son las 08:05:24.

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