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 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
  #2  
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
  #3  
Antiguo 02-09-2007
Avatar de rcarrillom
[rcarrillom] rcarrillom is offline
Miembro Premium
 
Registrado: dic 2004
Ubicación: UK / North Sea / Norway / Golfo de México / Frente a mi Laptop
Posts: 220
Poder: 22
rcarrillom Va por buen camino
Saludos al foro

Viendo tu código rápidamente (dificil de leer sin las etiquetas [ DELPHI ][ /DELPHI ]), veo que utilizas PostMessage para enviar el mensaje de crear, ignoro que motivo tengas para usar este método, yo mandaría llamar directamente a UMCreateFrame sin más.
Tu método tendría un defecto fundamental según mis escasos conocimientos teórico-técnicos , PostMessage inserta el mensaje al final de la cola, pudiendo existir cientos pendientes antes de ejecutar la creación, es decir al regresar de la llamada
Código Delphi [-]
    PostMessage( handle, UM_CREATEFRAME, WPARAM(forTabsheet), 0 );
NO se ha creado el frame. Si usas SendMessage, manda el mensaje inmediatamente (que alguien me corrija si he cometido una barbaridad con semejante afirmación) y creo que sí se crea elcomponente al regresar de la llamada. De todas maneras, te recomiendo que cambies tu metodología y no dependas del sistema de mensajes para la creación de componentes, a menos que tengas una razón muy muy poderosa.
__________________
eLcHiCoTeMiDo - Rompecorazones profesional
Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos?
Salva a un nylon, usa prendas de piel de foca
Responder Con Cita
  #4  
Antiguo 02-09-2007
paubar paubar is offline
Registrado
 
Registrado: ago 2007
Posts: 8
Poder: 0
paubar Va por buen camino
Unhappy Solucion

Bueno he encontrado una solución, que es poner luego de la sentecia show.
lo siguiente:
Sleep(1);
Con eso es suficiente, pero ahora me encuentro en el dilema de quiero
crear un control PageControl, con Tabsheet en tiempo de ejecucion, y a cada uno de ello asignarles el mismo Frame1,Los controles de mi Frame1 son unicos?
Es decir una vez que cree Frame:=Frame1.Create(Self), no puedo hacer mas copias, esto funcionaba antes , porque en el evento hide se eliminaba mediante free, y no daba el error de que la Frame1 ya existía.
Antes quedaban todos los tabsheet con su frame, pero cada vez que se mostraban se borra el texto del Mmemo que contiene, un rollo,es decir te lo ponia igual que al principio.A mi me interesa que ademas pueda hacer los cambios y perduren.
Se puede hacer lo que quiero o no ?
Responder Con Cita
  #5  
Antiguo 02-09-2007
Avatar de paldave
paldave paldave is offline
Miembro
 
Registrado: ago 2007
Ubicación: Uruguay
Posts: 148
Poder: 19
paldave Va por buen camino
Puedes insertar el archivo ".pas" o el proyecto completo zipeado? Sería de gran ayuda para ayudarte.
Responder Con Cita
  #6  
Antiguo 02-09-2007
paubar paubar is offline
Registrado
 
Registrado: ago 2007
Posts: 8
Poder: 0
paubar Va por buen camino
Smile Todo solucionado

Bueno:

1) Use Sleep(1) para dar tiempo a que se creen los controles, no me convence demasiado pero funciona, por otro lado se me habia ocurrido enviar
un SendMessage y esperar a que me conteste, pero no se que mensaje enviar a un TFrame, creo que esa sería la opcion.

2) El segundo problema era solo un error de código, cambie la manera de crear un array de Frame1.
Tab:=TSuiTabSheet.Create(Self);
Tab.PageControl:=Form1.suiPageControl1;
Tab.Tag:=Integer(TFrame1);
Tab.Caption:=RemotoName;
Form1.CreateFrame( Tab as TSuiTabsheet );
Tab.Show;
Sleep(1);
Aqui se crea el TabSheet

Llamo directo al metodo CreateFrameProcedure TForm1.CreateFrame(forTabsheet: TSuiTabSheet);
Var
Frame: TFrame;

begin
Frame := TFrame1.Create(Self);
with Frame do
begin
Parent := Self;
Visible := True;
frame.Parent := forTabsheet;
frame.Align := alClient;
Name := 'FFrames' + IntToStr(pIndex);
inc(pIndex);
end;
pIndex es global

Comentarios:

El usar Sendmessage y posTmessage no obtuve cambio niguno, por lo menos perceptible.Los dos funcionaban igual aunque son distintos métodos.

El error de código era porque desde el evento show se llamaba a createFrame y era que entonces al cambiar de pestaña se colocaba una frame nueva.

Un saludo para todos y haber si podemos encontrar una solución mejor para el pto 1.
Ciao
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 01:48:20.


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