• Lunes 29 de Abril de 2024, 01:14

Autor Tema:  Commondialog De Forma No Modal  (Leído 1071 veces)

elmango80

  • Miembro MUY activo
  • ***
  • Mensajes: 149
  • Nacionalidad: ve
    • Ver Perfil
Commondialog De Forma No Modal
« en: Miércoles 9 de Marzo de 2005, 19:57 »
0
Saludos a todos los participantes de este foro!

Estoy utilizando el objeto CommonDialog y tengo un problema, el cual radica en que este objeto cuando abre las ventanas de dialogo, lo hace de forma modal. Resulta que durante la ejecucion de mi programa estoy recibiendo constantemente datos por el puerto serial y siempre debo estar pendiente de esto, pero como sabran cuando se presenta un formulario de forma modal el programa deja de ejecutar cualquier codigo que pertenezca a otro formulario hasta que este se cierre.

Bueno agradeceria mucho si alguien me puede ayudar con este problema.

 :devil:  ----------- o -----------  :angel:
Citar
No soy bueno, tampoco soy malo sino todo lo contrario...

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Commondialog De Forma No Modal
« Respuesta #1 en: Sábado 12 de Marzo de 2005, 08:55 »
0
Hola elmango80.

Nuevamente la solución es usar un thread distinto. Usa un nuevo proceso para realizar la lectura del puerto:

Crea un programa independiente para atender la lectura del puerto. Luego llama una función de este estilo pasándo como parámetro la ruta y nombre de tal ejecutable:

Código: Text
  1.  
  2. Option Explicit
  3.  
  4. Private Const STILL_ACTIVE = &H103
  5. Private Const PROCESS_QUERY_INFORMATION = &H400
  6. Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
  7. Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
  8. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  9.  
  10. Public Sub LeerPuerto(Byval ExeLeerPuerto as string)
  11.  
  12.     On Error GoTo Err_Sinc
  13.    
  14.     Dim l1 As Long, lRc As Long
  15.     l1 = OpenProcess(PROCESS_QUERY_INFORMATION, False _
  16.     , Shell(ExeLeerPuerto, vbMinimizedNoFocus))
  17.     Do
  18.         GetExitCodeProcess l1, lRc
  19.         Sleep 100
  20.         DoEvents
  21.     Loop While lRc = STILL_ACTIVE
  22.    
  23.     MsgBox "Finalizó la lectura del puerto"
  24.  
  25.     Exit Sub
  26.    
  27. Err_Sinc:
  28.     MsgBox "Fallo al intentar arrancar lectura del puerto." & String(2, vbCrLf) _
  29.     & "(" & Err.Number & ") " & Err.Description, vbCritical, "Sincronizar"
  30.  
  31. End Sub
  32.  
  33.  
Si quieres también puedes eliminar el ciclo y una vez lanzado el programa olvidarte.

Eso sí, si necesitas comunicación entre los dos programas... tendrás que currártelo. Mira si quieres este post por si te sirve http://foros.solocodigo.com/index.php?showtopic=13730 aunque roxiii aún no lo ha cerrado...

Suerte.