Duda con MDI y oWndClient

Duda con MDI y oWndClient

Postby cuatecatl82 » Sat Dec 05, 2015 8:24 pm

Saludos Colegas:

Estoy trabajando con ventanas MDI y MDIChild, estoy apenas empezando y ya tengo inconvenientes, la verdad nunca me ha gustado trabajar con MDI pero siempre hay una primera vez.. La cuestión es la siguiente:

Intento abrir archivos de texto ya sea arrastrando el archivo a mi aplicación o desde el menu, si el programa ya esta abierto se muestra y abre el archivo, si no se abre desde cero. El problema viene cuando mi programa ya esta abierto e intento abrir otro archivo en una ventana diferente, me aparece el error:

Error BASE/1004 No Exported Method: OWNDCLIENT


Al parecer el objeto oWnd de la ventana padre no la esta reconociendo, porque la detecta como "NIL"

Como corregir este fallo, les dejo el código de lo que tengo..

Code: Select all  Expand view
#include "FiveWin.ch"

#define GW_CHILD        5
#define GW_HWNDNEXT     2
#define SW_RESTORE      9

STATIC oWnd, oFon, oMru, oMenu

#xcommand MENUITEM [ <oMenuItem> PROMPT ] [<cPrompt>] ;
             [ MESSAGE <cMsg> ] ;
             [ <checked: CHECK, CHECKED, MARK> ] ;
             [ <Enable: ENABLED, DISABLED> ] ;
             [ <FILE: FILE, FILENAME, DISK> <cBmpFile> ] ;
             [ <RESOURCE: RESOURCE, RESNAME, NAME> <cResName> ] ;
             [ ACTION <uAction,...> ] ;
             [ BLOCK <bAction> ] ;
             [ <OF: OF, MENU, SYSMENU> <oMenu> ] ;
             [ ACCELERATOR <nState>, <nVirtKey> ] ;
             [ <help: HELP> ] ;
             [ <HelpId: HELP ID, HELPID> <nHelpId> ] ;
             [ WHEN <uWhen> ] ;
             [ <Degrade: DEGRADE> ] ;
             [ <BREAK: BREAK> ] ;
             [ FONT <oFont> ] ;
             [ COLORMENU  <nClrMenu>, <nClrMenutxt> ] ;
             [ COLORBMP  <nClrBkBa>, <nClrToBa> ] ;
             [ COLORSELECT  <nClrHiLi>, <nClrHiLf>, <nClrHitx> ] ;
             [ COLORSEPARATOR  <nClrHiBr> ] ;
             [ <lVert: LINESVERT> ] ;
             [ <lColors: COLORS> ] ;
             [ CHARICON <cCharBmp> ] ;
             [ HSYSBITMAP <hBmp> ] ;
       => ;
          [ <oMenuItem> := ] MenuAddItem( <cPrompt>, <cMsg>,;
             <.checked.>, [ UPPER(<(Enable)>) == "ENABLED" ],;
             [\{|<oMenuItem>|<uAction>\}],;
             <cBmpFile>, <cResName>, <oMenu>, <bAction>, <nState>, <nVirtKey>,;
             <.help.>, <nHelpId>, [<{uWhen}>], <.BREAK.>, ,<.Degrade.>, .F., ;
             <oFont>, <nClrMenu>, <nClrMenutxt>, <nClrBkBa>, <nClrToBa>, ;
             <nClrHiLi>, <nClrHiLf>, <nClrHitx>, <nClrHiBr>, <.lColors.>, ;
             <.lVert.>, <cCharBmp>,,,,, <hBmp> )
             
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
FUNCTION Main(cFileName)    
 
    IF IsExeRunning( cFileName( HB_ARGV( 0 ) ) )
       ShowApplication(cFileName)
   ELSE
       Principal(cFileName)
  ENDIF

RETURN Nil



//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION ShowApplication( cFileName )

LOCAL hWnd:= FindWnd( cFileNoExt("RC_Edit") )

   IF hWnd != Nil
     
      IF IsIconic( hWnd )
         ShowWindow( hWnd, SW_RESTORE )
      ENDIF
     
      SetForeGroundWindow( hWnd )
      AbreRC(cFileName)
     
   ENDIF

RETURN Nil



//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION FindWnd( cTitle )

   LOCAL hWnd := GetWindow( GetDesktopWindow(), GW_CHILD )

   WHILE hWnd != 0
      IF UPPER( cTitle ) $ UPPER( GetWindowText( hWnd ) )
         RETURN hWnd
      ENDIF

      hWnd = GetWindow( hWnd, GW_HWNDNEXT )
   END

RETURN Nil



//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION Principal(cFileName)

LOCAL oIco
 
   DEFINE FONT   oFon NAME "Segoe UI Symbol" SIZE 0, -14 WEIGHT 300
   DEFINE ICON   oIco RESOURCE "00"    
   DEFINE WINDOW oWnd TITLE "RC_Edit - Editor de Recursos RC" ICON oIco MDI MENU MiMenu()
   
   SET MESSAGE OF oWnd TO "Listo" NOINSET CLOCK DATE KEYBOARD 2010
 
   oWnd:bInit:= {|| IF(EMPTY(cFileName) == .F.,(RevisaRC(cFileName)),(SysRefresh()))}
 
   ACTIVATE WINDOW oWnd MAXIMIZED

RETURN Nil



//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION MiMenu()

 
MENU oMenu FONT oFon
  MENUITEM "Archivo"
     MENU
          MENUITEM "Abrir"     RESOURCE "ABRIR"                  ACTION RevisaRC()
          SEPARATOR
          MENUITEM "Nuevo"     RESOURCE "NUEVO"                 //ACTION SysRefresh()
          SEPARATOR
          MENUITEM "Recientes" RESOURCE "RECIENTE"    
          MENU
             MRU oMru FILENAME ".\RcEdit.ini" SECTION  "FILES"  //ACTION SysRefresh()
          ENDMENU  
     ENDMENU    
ENDMENU

 
RETURN oMenu



//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION RevisaRC(cFileName)

IF EMPTY(cFileName)
   cFileName:= cGetFile("Archivo de Recursos en texto     (*.rc)|*.rc|", "Agregar Archivo Recurso", 1,)
ENDIF

IF !EMPTY(cFileName) .AND. LEN(ALLTRIM(cFileNoPath(cFileName))) > 3 .AND. cFileExt(cFileName) == "rc"
    AbreRC(cFileName)
ENDIF

RETURN Nil



//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION AbreRC(cFileName)

LOCAL oWndCh
LOCAL oIco

  DEFINE ICON   oIco   RESOURCE "00"
  DEFINE WINDOW oWndCh TITLE ""+ cFileName +"" MDICHILD OF oWnd ICON oIco
ACTIVATE WINDOW oWndCh

RETURN Nil



Gracias..
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Duda con MDI y oWndClient

Postby cnavarro » Sat Dec 05, 2015 9:04 pm

Victor, has visto como esta hecho en el Fivedit que hizo Antonio?

https://bitbucket.org/fivetech/fivewin- ... ivEdit.zip
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6504
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Duda con MDI y oWndClient

Postby cuatecatl82 » Sun Dec 06, 2015 3:51 am

Saludos Cristobal:

Si lo he revisado, pero lo toma como si fuera una clase, yo intento hacerlo en modo funciónes, no se si sea obligatorio usarlo tal como en el ejemplo que mencionas, lo que no entiendo es: Si ya el objeto oWnd fue creado porque al arrastrar un archivo para abrirlo aparece éste error, le he puesto Msginfo(Valtype(oWnd)) y medice que esta vacio "U", habra forma de capturar el objeto ya creado y poder abrir de la forma que planteo las ventanas hijas..?

Gracias.
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Duda con MDI y oWndClient

Postby cuatecatl82 » Sun Dec 06, 2015 4:26 am

Lo intente pasandolo a Clase, pero no funciona:

Code: Select all  Expand view

#include "FiveWin.ch"

#define GW_CHILD        5
#define GW_HWNDNEXT     2
#define SW_RESTORE      9

STATIC oRCEdit

#xcommand MENUITEM [ <oMenuItem> PROMPT ] [<cPrompt>] ;
             [ MESSAGE <cMsg> ] ;
             [ <checked: CHECK, CHECKED, MARK> ] ;
             [ <Enable: ENABLED, DISABLED> ] ;
             [ <FILE: FILE, FILENAME, DISK> <cBmpFile> ] ;
             [ <RESOURCE: RESOURCE, RESNAME, NAME> <cResName> ] ;
             [ ACTION <uAction,...> ] ;
             [ BLOCK <bAction> ] ;
             [ <OF: OF, MENU, SYSMENU> <oMenu> ] ;
             [ ACCELERATOR <nState>, <nVirtKey> ] ;
             [ <help: HELP> ] ;
             [ <HelpId: HELP ID, HELPID> <nHelpId> ] ;
             [ WHEN <uWhen> ] ;
             [ <Degrade: DEGRADE> ] ;
             [ <BREAK: BREAK> ] ;
             [ FONT <oFont> ] ;
             [ COLORMENU  <nClrMenu>, <nClrMenutxt> ] ;
             [ COLORBMP  <nClrBkBa>, <nClrToBa> ] ;
             [ COLORSELECT  <nClrHiLi>, <nClrHiLf>, <nClrHitx> ] ;
             [ COLORSEPARATOR  <nClrHiBr> ] ;
             [ <lVert: LINESVERT> ] ;
             [ <lColors: COLORS> ] ;
             [ CHARICON <cCharBmp> ] ;
             [ HSYSBITMAP <hBmp> ] ;
       => ;
          [ <oMenuItem> := ] MenuAddItem( <cPrompt>, <cMsg>,;
             <.checked.>, [ UPPER(<(Enable)>) == "ENABLED" ],;
             [\{|<oMenuItem>|<uAction>\}],;
             <cBmpFile>, <cResName>, <oMenu>, <bAction>, <nState>, <nVirtKey>,;
             <.help.>, <nHelpId>, [<{uWhen}>], <.BREAK.>, ,<.Degrade.>, .F., ;
             <oFont>, <nClrMenu>, <nClrMenutxt>, <nClrBkBa>, <nClrToBa>, ;
             <nClrHiLi>, <nClrHiLf>, <nClrHitx>, <nClrHiBr>, <.lColors.>, ;
             <.lVert.>, <cCharBmp>,,,,, <hBmp> )
             
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
FUNCTION Main(cFileName)    
 
    IF IsExeRunning( cFileName( HB_ARGV( 0 ) ) )
       ShowApplication(cFileName)
   ELSE
       oRCEdit:= TRCEdit():NEW(cFileName)
       oRCEdit:ACTIVATE()
  ENDIF

RETURN Nil



//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION ShowApplication( cFileName )

LOCAL hWnd:= FindWnd("RC_Edit")

   IF hWnd != Nil
     
      IF IsIconic( hWnd )
         ShowWindow( hWnd, SW_RESTORE )
      ENDIF
     
      SetForeGroundWindow( hWnd )
      OpenClipboard( GetDesktopWindow() )
      SetClipboardData( 1, cFileName )
      CloseClipboard()
      SendMessage( hWnd, FM_OPENFILE )
     
   ENDIF

RETURN Nil



//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION FindWnd( cTitle )

LOCAL hWnd := GetWindow( GetDesktopWindow(), GW_CHILD )

   WHILE hWnd != 0
      IF UPPER( cTitle ) $ UPPER( GetWindowText( hWnd ) )
         RETURN hWnd
      ENDIF

      hWnd = GetWindow( hWnd, GW_HWNDNEXT )
   END

RETURN Nil



//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
CLASS TRCEdit

DATA oWnd,oIco,oFon,oMenu,oMru

METHOD NEW(cFileName) CONSTRUCTOR
METHOD ACTIVATE()
METHOD MenuRC()
METHOD AbreRC(cFileName)
METHOD MuestraRC(cFileName)

ENDCLASS



//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
METHOD NEW(cFileName) CLASS TRCEdit

   DEFINE FONT   ::oFon NAME "Segoe UI Symbol" SIZE 0, -14 WEIGHT 300
   DEFINE ICON   ::oIco RESOURCE "00"    
   DEFINE WINDOW ::oWnd TITLE "RC_Edit - Editor de Recursos RC" ICON ::oIco MDI MENU ::MenuRC()
   
   SET MESSAGE OF ::oWnd TO "Listo" NOINSET CLOCK DATE KEYBOARD 2010
 
   ::oWnd:bInit:= {|| IF(EMPTY(cFileName) == .F.,(::AbreRC(cFileName)),(SysRefresh()))}
   
RETURN Self



//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
METHOD ACTIVATE() CLASS TRCEdit

ACTIVATE WINDOW ::oWnd MAXIMIZED

RETURN Self


//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
METHOD MenuRC() CLASS TRCEdit

MENU ::oMenu FONT ::oFon
  MENUITEM "Archivo"
     MENU
          MENUITEM "Abrir"     RESOURCE "ABRIR"                  ACTION ::AbreRC()
          SEPARATOR
          MENUITEM "Nuevo"     RESOURCE "NUEVO"                 //ACTION SysRefresh()
          SEPARATOR
          MENUITEM "Recientes" RESOURCE "RECIENTE"    
          MENU
             MRU ::oMru FILENAME ".\RcEdit.ini" SECTION  "FILES"  //ACTION SysRefresh()
          ENDMENU  
     ENDMENU    
ENDMENU
 
RETURN ::oMenu



//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
METHOD AbreRC(cFileName) CLASS TRCEdit

IF EMPTY(cFileName)
   cFileName:= cGetFile("Archivo de Recursos en texto     (*.rc)|*.rc|", "Agregar Archivo Recurso", 1,)
ENDIF

IF !EMPTY(cFileName) .AND. LEN(ALLTRIM(cFileNoPath(cFileName))) > 3 .AND. cFileExt(cFileName) == "rc"
    ::MuestraRC(cFileName)
ENDIF

RETURN Nil



//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
METHOD MuestraRC(cFileName) CLASS TRCEdit

LOCAL oWndCh

::oMru:SAVE(cFileName)

  DEFINE WINDOW oWndCh TITLE ""+ cFileName +"" MDICHILD ICON ::oIco
ACTIVATE WINDOW oWndCh

RETURN Nil
 
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Duda con MDI y oWndClient

Postby cuatecatl82 » Sun Dec 06, 2015 2:46 pm

El detalle esta en la funcion SendMessage( hWnd, FM_OPENFILE ),

En este simple ejemplo no lanza el llamado FM_OPENFILE Que condiciones son necesarias en las funciones para que pueda ser reconocida, lo estoy haciendo mal..? No doy como poderlo hacer, he revisado toda la noche sin suerte en base a fivedit..


alguien que me de una luz.. Gracias.
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México

Re: Duda con MDI y oWndClient

Postby cuatecatl82 » Fri Dec 11, 2015 5:28 pm

Maestro Antonio Como puedo corregir este fallo..?
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
User avatar
cuatecatl82
 
Posts: 625
Joined: Wed Mar 14, 2007 6:49 pm
Location: San Cristobal de las Casas, Chiapas México


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot], jmartial and 43 guests