FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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. |
#2
|
||||
|
||||
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 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 |
#3
|
|||
|
|||
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 ? |
#4
|
||||
|
||||
Puedes insertar el archivo ".pas" o el proyecto completo zipeado? Sería de gran ayuda para ayudarte.
|
#5
|
|||
|
|||
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 |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Firebird 2.0 se hace esperar | Casimiro Notevi | 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 |
|