Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-08-2007
Avatar de paldave
paldave paldave is offline
Miembro
 
Registrado: ago 2007
Ubicación: Uruguay
Posts: 148
Poder: 19
paldave Va por buen camino
Bueno, que [Delphius] tiene razón, está un poco confuso el planteo, pero igual creo que te he entendido.
Por lo que veo creas el frame desde código, no desde el diseñador, lo cual ya es algo raro, ¿no te sería más útil crearlo e insertarlo en tiempo de diseño? Si lo crearas en tiempo de diseño no tendrías este problema, pues el frame se crearía junto con el form y antes de mostrarse ambos.
El problema es que si llamas al procedimiento Create del frame e inmediatamente tratas de acceder a sus propiedades o métodos resulta que no le das tiempo a Windows a crear un identificador para esa ventana, de ahí el error. Si esperas un tiempo prudente (milisegundos) a que finalicen las rutinas de creación del frame no tendrás problemas.
Si no quieres o no puedes crearlo en tiempo de diseño e insistes en utilizar el tiempo de ejecución puedes usar una rutina del tipo try... except... end para comprobar si se han terminado las rutinas de creación, y mantener un bucle hasta que se cumpla esa condición.
Sería algo así:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
label comienzo;
var fallo:boolean;
begin
comienzo:
  fallo:=false;
  try
    resultado:=(Form.pagecontrol1.ActivePage.Controls[0] as   TFRAME1).mMemo.lines.gettext;
  except
    fallo:=True;
  end;
  if fallo then
    goto comienzo;
end;
de forma que si se produce una excepcion se vuelve a intentar hasta que se produzca un resultado válido.
Espero que con esto soluciones tu problema. Saludos.
Responder Con Cita
  #2  
Antiguo 31-08-2007
paubar paubar is offline
Registrado
 
Registrado: ago 2007
Posts: 8
Poder: 0
paubar Va por buen camino
Smile Exelente

Era esto lo que preguntaba.
Para serte sincero estaba pensando en algo similar,... agradezco el detalle del código.
Por otra lado veo, e insisto hay otra manera de hacerlo ? Solo por curiosidad
con esta idea ya me vale..pero si se puede aprender algo más---
Tratare de redactar mejor la proxima vez, gracias a todos.
Responder Con Cita
  #3  
Antiguo 31-08-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Habría que ver qué pasa por ahí... yo acabo de añadir un "Frame" con un botón en un formulario. A continuación he ocupado el evento "OnCreate" del formulario para acceder al "Frame" y deshabilitar el botón que este contiene. Y todo ha ido bien. Es decir, en el evento "OnCreate" del formulario ya se puede acceder al "Frame".

¿Estás creando el "Frame" en tiempo de ejecución? Pero, aunque así fuera, una vez creado el "Frame"... no debería haber problema para acceder al mismo. Ahora bien, si dices que hay algún problema... podrías acaso ser un poco más específico y aportar algo del código que estás usando en el constructor del "Frame" (si lo ocupas)...

En todo caso la solución del compañero paldave no me parece muy acertada, puesto que además de hacer un uso del bloque "try...except" discutible, al menos, el usar un "goto" no creo que sea tampoco lo más natural... no sé... Para eso podría probarse con un bucle "while", o tal vez un "repeat"... pero yo creo que ni eso debe ser necesario.

Si el objeto en cuestión (el "Frame") está creado... ¿qué problema hay para no poder acceder al mismo? Esto es lo que habría que mirar y tratar de solucionar, digo yo.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 31-08-2007
Avatar de paldave
paldave paldave is offline
Miembro
 
Registrado: ago 2007
Ubicación: Uruguay
Posts: 148
Poder: 19
paldave Va por buen camino
Cool

A ver si así les gusta más:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var fallo:boolean;
begin
  repeat
    fallo:=false;
    try
      resultado:=(Form.pagecontrol1.ActivePage.Controls[0] as   TFRAME1).mMemo.lines.gettext;
    except
      fallo:=True;
    end;
  until fallo=false;
end;
Responder Con Cita
  #5  
Antiguo 01-09-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Pues, en mi ignorancia, me sigue pareciendo que se emplea un bloque "try...except" no como debería. De hecho el código anterior no me parece correcto, un bucle "repeat" que "intenta" obtener el texto de un Memo... pero si surge una excepción (cualquier excepción además) al cabo se volverá a intentar... indefinidamente...

Ese código no parece que esté muy bien planteado, pero, no te culpo, puesto que al cabo tampoco sabemos a ciencia cierta qué puede estar ocurriendo. A ver si el compañero se decide a copiar por aquí un poco de código o a explicar de forma pormenorizada su caso.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 01-09-2007
paubar paubar is offline
Registrado
 
Registrado: ago 2007
Posts: 8
Poder: 0
paubar Va por buen camino
Question No funciona la rutina anterior

Aplicar este bucle, no va, me sigue generando un acces violation y no lo puedo controlar con esto, se bloquea la aplicación.
Había pensado en algún evento del Frame para que cuando se mostrará sus componentes este aplicara una variable Boolean y de esta manera acceder a sus elementos, pero no tiene , se podriá leer algún "message" para determinar el pto en que esta todo creado?.
Es decir un procedimiento de este tipo;
procedure TForm1.UMCreateFrame(var msg: TUmCreateFrame);
Var
frame: TFrame;
begin
If msg.tabsheet.Tag <> 0 Then Begin
frame := TFrameclass(msg.tabsheet.Tag).Create(self);
frame.Parent := msg.tabsheet;
frame.Align := alClient;
End;
end;
Esto no me dice nada de sus componentes....
Por otro lado, yo creo los TTabsheet en runtime, y luego asigno el frame a él.
Tab:=TTabSheet.Create(Self);
Tab.PageControl:=suiPageControl1;
Tab.Tag:=Integer(TFrame1);
Tab.OnShow:=TabSheetShow;
Tab.OnHide:=TabSheetHide;
Tab.Caption:='Hola';
Tab.Show;
Los Frame no son creado en runtime si no que los asigno al TTabsheet.
Un salu2
Responder Con Cita
  #7  
Antiguo 01-09-2007
paubar paubar is offline
Registrado
 
Registrado: ago 2007
Posts: 8
Poder: 0
paubar Va por buen camino
Wink Mas codigo

Procedure TForm1.CreateFrame(forTabsheet: TSuiTabSheet);
begin
If GetFrame( forTabsheet ) = nil Then
PostMessage( handle, UM_CREATEFRAME, WPARAM(forTabsheet), 0 );
end;

procedure TForm1.DestroyFrame(forTabsheet: TSuiTabsheet);
begin
getFrame( forTabsheet ).Free;
end;

function TForm1.GetFrame(forTabSheet: TSuiTabsheet): TFrame;
begin
If not Assigned( forTabsheet ) Then
forTabsheet := Suipagecontrol1.activepage;
Result := nil;
If Assigned( forTabsheet ) and
(forTabSheet.ControlCount > 0) and
(forTabSheet.Controls[0] Is TFrame)
Then
result := TFrame(forTabSheet.Controls[0]);
end;

Type
TFrameclass = class of TFrame1;

procedure TForm1.UMCreateFrame(var msg: TUmCreateFrame);
Var
frame: TFrame;
begin
If msg.tabsheet.Tag <> 0 Then Begin
frame := TFrameclass(msg.tabsheet.Tag).Create(self);
frame.Parent := msg.tabsheet;
frame.Align := alClient;
End;
end;
Este es todo el codigo.
Haber si podemos llegar a una solución.
De todas maneras lo que pasa es que no se da tiempo a que windows cree los componentes.
A lo mejor solo se trata de buscar el componentes con FindComponents y haber si es distinto de nil.
Pero lo interesante es encontrar la mejor manera de hacerlo.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Firebird 2.0 se hace esperar Casimiro Noteví Noticias 2 18-08-2006 02:56:21
Cree el EXE en delphi 5 y lo corro en XP , marca error , alguna idea? kamik Varios 10 22-12-2005 17:03:10
Esperar a que termine un proceso felixgo OOP 4 02-06-2004 19:46:45
esperar a que se realicen los cambios aram2r Conexión con bases de datos 2 23-02-2004 18:20:05
Esperar xx segundos Antigol Varios 3 08-12-2003 02:44:11


La franja horaria es GMT +2. Ahora son las 00:10:25.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi