Ya probe con ventanas MDI y me sale el mismo error.
Voy a poner todo mi c贸digo (donde da error), y una imagen para q tengan una idea mas clara:
FUNCTION Bitacora()
#include "Fivewin.ch"
#include "RichEdit.ch"
#define FW_BOLD 聽 聽 聽 聽 700
LOCAL oFont, oFont2, oGet, hDLL := LoadLibrary( "Riched20.dll" )
PRIVATE oDlg, oPrueba1, cDatos:=cResultados:="", dFecha:=CToD(" 聽/ 聽/ 聽 聽"), m_FILE:=SPACE(8), oFont3
PRIVATE oRtf, oBtn[7], lBold, lItalic, lUnderline
SET _3DLOOK ON
* Lectura de datos y resultados del d铆a de hoy
IF FILE(RUTRES+"BITACORA.DBF")
聽 聽 USE &RUTRES.BITACORA
聽 聽 INDEX ON DIA TO &RUTRES.BITACORA
聽 聽 IF DBSeek( DATE() )
聽 聽 聽 聽 cResultados=RESULTADOS
聽 聽 聽 聽 cDatos=DATOS
聽 聽 ELSE
聽 聽 聽 聽 cResultados=""
聽 聽 聽 聽 cDatos=""
聽 聽 ENDIF
ELSE
聽 聽 MsgInfo("No existe el archivo de bit谩cora"+CRLF+"Volveremos al men煤 principal", "Atenci贸n")
聽 聽 FreeLibrary(hDLL)
聽 聽 DBCloseArea()
聽 聽 RETU .T.
ENDIF
DEFINE FONT oFont 聽NAME "Arial" 聽 聽 聽 聽 SIZE 0,-14
DEFINE FONT oFont2 NAME "Ms Sans Serif" SIZE 0,-11
DEFINE FONT oFont3 NAME "Ms Sans Serif" SIZE 0,-12
* Define dialogo
DEFINE DIALOG oDlg OF oVent FROM 10,10 TO 417,762 PIXEL TITLE "Bit谩cora de SicefWin"
聽 聽 oDlg:nStyle := nOr( oDlg:nStyle, 4 )
聽 聽 * Control MiCalendario
聽 聽 oPrueba1:= TMiCalendario(): New ( 5, 5,120,120, oDlg, oFont)
聽 聽 oPrueba1:FijaClrDomingo( {rgb( 255, 255, 255),; 聽 //Color borde superior 聽 // Para pintar los domingos de otro color...
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 rgb( 220, 220, 220),; 聽 //Color relleno
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 rgb( 128, 128, 128),; 聽 //Color borde inferior
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 rgb( 聽 0, 聽 0, 聽 0) } ) //color texto....
聽 聽 oPrueba1:bAction := { |dFechaControl| (LeeResultados(dFechaControl), oRtf:LoadAsRTF(cDatos), ;
聽 聽 聽 聽 oRtf:SetText(cDatos), oDlg:Update() ) }
聽 聽 oPrueba1:bCambioMes := { || FijarFestivos( oPrueba1 ) } 聽 聽 聽 聽// Al cambiar de mes... se asignan nuevos festivos...
聽 聽 * Say y Gets con los resultados en el d铆a seleccionado
聽 聽 @ 4,130 SAY "Resultados en el d铆a seleccionado:" PIXEL SIZE 100,10 OF oDlg COLOR CLR_RED,GetSysColor(15)
聽 聽 @ 11,130 GET oGet VAR cResultados MEMO OF oDlg READONLY PIXEL SIZE 240,55 UPDATE FONT oFont2 ;
聽 聽 聽 聽 COLOR RGB(0,0,0), RGB(231,235,222)
聽 聽 聽 聽 oGet:cToolTip := "Resultados en el d铆a seleccionado"
聽 聽 @ 68,130 SAY "HECHOS relevantes del d铆a seleccionado:" PIXEL SIZE 120,10 OF oDlg COLOR CLR_RED,GetSysColor(15)
聽 聽 * Editor de texto RichEdit para detalles o cronicas
聽 聽 @ 89,130 RICHEDIT oRtf VAR cDatos OF oDlg FILE cDatos PIXEL SIZE 240,99 FONT oFont3
聽 聽 聽 聽 *ON CHANGE IF( oRtf:IsModify(), oBtn[1]:Enable(), oBtn[1]:Disable() )
聽 聽 聽 聽 *ON CHANGE ( RefreshButtonBar(oDlg), IF( oRtf:IsModify(), oBtn[1]:Enable(), oBtn[1]:Disable() ) )
聽 聽 聽 聽 oRtf:cToolTip:="Vista de los hechos relevantes del d铆a seleccionado"
聽 聽 聽 聽 oRtf:nClrText:=CLR_GRAY
聽 聽 聽 聽 oRtf:SetFontName("Ms Sans Serif")
聽 聽 聽 聽 oRtf:SetFontSize(11)
聽 聽 * Botones de control
聽 聽 @ 188,310 BUTTONBMP oBtn[1] PROMPT " 聽 聽 &Grabar Datos" BITMAP "SAVE" TEXTRIGHT OF oDlg PIXEL SIZE 60,12 FONT oFont ;
聽 聽 聽 聽 ACTION IF( oRTF:IsModify(), (cDatos:=oRTF:SaveAsRTF(), GrabaBtcr(oPrueba1:dFechaControl)), ;
聽 聽 聽 聽 MsgInfo("No ha habido cambios en el texto","Atenci贸n") )
聽 聽 聽 聽 oBtn[1]:cToolTip="Graba datos del campo Hechos relevantes del d铆a"
聽 聽 聽 聽 oBtn[1]:Disable()
聽 聽 @ 147,5 BUTTON oBtn[2] PROMPT "Seleccionar &d铆a" OF oDlg PIXEL SIZE 54,12 FONT oFont ;
聽 聽 聽 聽 ACTION IF( oRTF:IsModify(), IF( MsgYesNo("驴Pierde los cambios que realiz贸 en Hechos?","Atenci贸n"), ;
聽 聽 聽 聽 (IF( MsgGet("Seleccionar d铆a","Ingresar d铆a a consultar:",@dFecha,), oPrueba1:IrFecha( dFecha ), ), ;
聽 聽 聽 聽 LeeResultados(dFecha), oRTF:LoadAsRTF(cDatos), oRTF:SetText(cDatos), oDlg:Update()), ), ;
聽 聽 聽 聽 (IF( MsgGet("Seleccionar d铆a","Ingresar d铆a a consultar:",@dFecha,), oPrueba1:IrFecha( dFecha ), ), ;
聽 聽 聽 聽 LeeResultados(dFecha), oRTF:LoadAsRTF(cDatos), oRTF:SetText(cDatos), oDlg:Update()) )
聽 聽 聽 聽 oBtn[2]:cToolTip="Seleccionar un d铆a espec铆fico"
聽 聽 @ 147,70 BUTTON oBtn[3] PROMPT "&Ir al d铆a de hoy" OF oDlg PIXEL SIZE 54,12 FONT oFont ;
聽 聽 聽 聽 ACTION IF( oRTF:IsModify(), IF( MsgYesNo("驴Pierde los cambios que realiz贸 en Hechos?","Atenci贸n"), ;
聽 聽 聽 聽 (oPrueba1:IrFecha(Date()), LeeResultados(Date()), oRTF:LoadAsRTF(cDatos), oRTF:SetText(cDatos), oDlg:Update()), ), ;
聽 聽 聽 聽 (oPrueba1:IrFecha(Date()), LeeResultados(Date()), oRTF:LoadAsRTF(cDatos), oRTF:SetText(cDatos), oDlg:Update()))
聽 聽 聽 聽 oBtn[3]:cToolTip="Ir al d铆a de hoy"
聽 聽 @ 166,5 BUTTON oBtn[4] PROMPT "D铆a &anterior" OF oDlg PIXEL SIZE 54,12 FONT oFont ;
聽 聽 聽 聽 ACTION IF( oRTF:IsModify(), IF( MsgYesNo("驴Pierde los cambios que realiz贸 en Hechos?","Atenci贸n"), ;
聽 聽 聽 聽 (oPrueba1:IrFecha(oPrueba1:dFechaControl-1), LeeResultados(oPrueba1:dFechaControl), ;
聽 聽 聽 聽 oRTF:LoadAsRTF(cDatos), oRTF:SetText(cDatos), oDlg:Update()) , ), ;
聽 聽 聽 聽 (oPrueba1:IrFecha(oPrueba1:dFechaControl-1), LeeResultados(oPrueba1:dFechaControl), ;
聽 聽 聽 聽 oRTF:LoadAsRTF(cDatos), oRTF:SetText(cDatos), oDlg:Update()) )
聽 聽 聽 聽 oBtn[4]:cToolTip="Pasa al d铆a anterior"
聽 聽 @ 166,70 BUTTON oBtn[5] PROMPT "D铆a si&guiente" OF oDlg PIXEL SIZE 54,12 FONT oFont ;
聽 聽 聽 聽 ACTION IF( oRTF:IsModify(), IF( MsgYesNo("驴Pierde los cambios que realiz贸 en Hechos?","Atenci贸n"), ;
聽 聽 聽 聽 (oPrueba1:IrFecha(oPrueba1:dFechaControl+1), LeeResultados(oPrueba1:dFechaControl), ;
聽 聽 聽 聽 oRTF:LoadAsRTF(cDatos), oRTF:SetText(cDatos), oDlg:Update()) , ), ;
聽 聽 聽 聽 (oPrueba1:IrFecha(oPrueba1:dFechaControl+1), LeeResultados(oPrueba1:dFechaControl), ;
聽 聽 聽 聽 oRTF:LoadAsRTF(cDatos), oRTF:SetText(cDatos), oDlg:Update()) )
聽 聽 聽 聽 oBtn[5]:cToolTip="Pasa al d铆a siguiente"
聽 聽 @ 185,5 BUTTON oBtn[6] PROMPT "&Regrabar resultados" OF oDlg PIXEL SIZE 68,12 FONT oFont ;
聽 聽 聽 聽 ACTION MsgMeter({|oMet,oText,oDlg,lEnd| RegrabaRes(oMet,oText,oDlg,@lEnd)},"Procesando...", "Por favor, espere")
聽 聽 聽 聽 oBtn[6]:cToolTip="Regraba todos los resultados hist贸ricos de todos los torneos"
聽 聽 @ 185,79 BUTTONBMP oBtn[7] PROMPT " 聽 聽 聽 聽 聽 聽&Salir" BITMAP "CANCELAR" TEXTRIGHT OF oDlg PIXEL SIZE 45,12 FONT oFont ;
聽 聽 聽 聽 ACTION IF( oRTF:IsModify(), IF( MsgYesNo("驴Pierde los cambios que realiz贸 en Hechos?","Atenci贸n"), ;
聽 聽 聽 聽 oDlg:End(2), (cDatos:=oRTF:SaveAsRTF(), GrabaBtcr(oPrueba1:dFechaControl), oDlg:End(1)) ), oDlg:End(2) )
聽 聽 聽 聽 oBtn[7]:cToolTip="Salir"
聽 聽 oDlg:bInit 聽:= { || RefreshBar() }
聽 聽 *oDlg:bValid := { || RefreshBar() }
聽 聽 oDlg:oClient = oRtf
聽 聽 *oDlg:lHelpIcon:= .F. 聽// comentado al probar con Window
ACTIVATE DIALOG oDlg CENTERED ON INIT (oDlg:SetIcon(oApp:cIcono), Centra(oDlg), CargaBarra(oDlg), ;
聽 聽 oRtf:LoadAsRTF(cDatos), oRtf:SetText(cDatos), 聽;
聽 聽 oRtf:bChange:={ || ( RefreshButtonBar(oDlg), IF( oRtf:IsModify(), oBtn[1]:Enable(), oBtn[1]:Disable() ) ) }, ;
聽 聽 Eval( oRtf:bChange ), oRtf:SetFocus(), .F.)
聽 聽 *oRtf:LoadAsRTF(cDatos), oRtf:SetText(cDatos), oRtf:bChange:={ || RefreshButtonBar(oDlg) }, Eval( oRtf:bChange ), ;
聽 聽 // el valor .F. al final en ON INIT es para q cambie el focus inicial grabado en los recursos
聽 聽 // la Button Bar en los dialog se carga a trav茅s de ON INIT
IF oDlg:nResult=1
聽 聽 MsgInfo("Datos se grabaron con 茅xito","Atenci贸n")
ENDIF
RELEASE FONT oFont
RELEASE FONT oFont2
RELEASE FONT oFont3
FreeLibrary(hDLL)
DBCloseArea()
Return nil
*FDF Bitacora
STATIC FUNCTION RefreshBar()
聽 聽 LOCAL oBar := oDlg:oBar:aControls
聽 聽 IF Len( oDlg:oWndClient:aWnd ) == 1
聽 聽 聽 聽 AEval( oBar, { |x, y| If( y == 1, x:Enable(), x:Disable() ) }, 1, 0 ) 聽 // no hace nada, porq la barra de botones est谩 reducida, sin los primeros botones Save, ...
聽 聽 聽 聽 AEval( oBar, { |x| x:Refresh() }, 1, 0 )
聽 聽 ENDIF
RETURN .t.
STATIC FUNCTION RefreshButtonBar( oDlg )
聽 聽 LOCAL oBar 聽 := oDlg:oBar:aControls
聽 聽 LOCAL aChar 聽:= REGetCharFormat( oRtf:hWnd )
聽 聽 LOCAL nAlign := REGetParaFormat( oRtf:hWnd )
聽 聽 oBar[ 6]:lPressed := lBold 聽 聽 聽:= aChar[5] == FW_BOLD
聽 聽 oBar[ 7]:lPressed := lItalic 聽 聽:= aChar[6]
聽 聽 oBar[ 8]:lPressed := lUnderline := aChar[7]
聽 聽 oBar[ 9]:lPressed := nAlign == PFA_LEFT
聽 聽 oBar[10]:lPressed := nAlign == PFA_CENTER
聽 聽 oBar[11]:lPressed := nAlign == PFA_RIGHT
聽 聽 oBar[12]:lPressed := nAlign == PFA_JUSTIFY
聽 聽 oBar[13]:VarPut( aChar[14] ) 聽 聽 聽 聽 聽 聽 聽 聽 // Font
聽 聽 oBar[14]:VarPut( aChar[ 1] ) 聽 聽 聽 聽 聽 聽 聽 聽 // Tama帽o del font, es 9 por omisi贸n
聽 聽 AEval( oBar, { |x| IF( x:lWhen(), x:Enable(), x:Disable() ), x:Refresh() }, 1, 14 )
RETU .T.
*FDF RefreshButtonBar
STATIC FUNCTION CargaBarra(oDlg)
LOCAL oBar, oCursor, hDC, aFonts, oClp, oBold, oItalic, oUnderline, oItem, cFont, oSize, nSize:=10
hDC 聽 聽:= GetDC( oDlg:hWnd )
aFonts := ASort( GetFontNames( hDC ) )
ReleaseDC( oDlg:hWnd, hDC )
DEFINE CURSOR oCursor HAND
DEFINE CLIPBOARD oClp OF oDlg FORMAT TEXT
* Controles de la ButtonBar
@ 150,260 BUTTONBAR oBar OF oDlg 3DLOOK SIZE 480,27 BUTTONSIZE 24,24 TOP
聽 聽// 1
聽 聽 DEFINE BUTTON RESOURCE "Cut" OF oBar MESSAGE "Cortar" NOBORDER ;
聽 聽 聽 聽 WHEN ( ! Empty( oRtf:GetSel() ) .and. ! oRtf:lReadOnly ) ACTION ( oRtf:Cut(), oRtf:SetFocus() ) ;
聽 聽 聽 聽 TOOLTIP "Cierra archivo abierto" TRANSPARENT CENTER
聽 聽// 2
聽 聽 DEFINE BUTTON RESOURCE "Copy" OF oBar MESSAGE "Copiar" NOBORDER ;
聽 聽 聽 聽 WHEN ( ! Empty( oRtf:GetSel() ) ) ACTION ( oRtf:Copy(), oRtf:SetFocus() ) ;
聽 聽 聽 聽 TOOLTIP "Copiar" TRANSPARENT CENTER
聽 聽// 3
聽 聽 DEFINE BUTTON RESOURCE "Paste" OF oBar MESSAGE "Pegar" NOBORDER ;
聽 聽 聽 聽 WHEN ( ! Empty( oClp:GetText() ) .and. ! oRtf:lReadOnly ) ACTION ( oRtf:Paste(), oRtf:SetFocus() ) ;
聽 聽 聽 聽 TOOLTIP "Pegar" TRANSPARENT CENTER
聽 聽// 4
聽 聽 DEFINE BUTTON RESOURCE "Undo" OF oBar MESSAGE "Deshacer" NOBORDER ;
聽 聽 聽 聽 WHEN ( oRtf:SendMsg( EM_CANUNDO ) != 0 ) ACTION ( oRtf:Undo(), oRtf:SetFocus() ) ;
聽 聽 聽 聽 TOOLTIP "Deshacer" TRANSPARENT CENTER
聽 聽// 5
聽 聽 DEFINE BUTTON RESOURCE "Redo" OF oBar MESSAGE "Rehacer" NOBORDER ;
聽 聽 聽 聽 WHEN ( oRtf:SendMsg( EM_CANREDO ) != 0 ) ACTION ( oRtf:Redo(), oRtf:SetFocus() ) ;
聽 聽 聽 聽 TOOLTIP "Rehacer" TRANSPARENT CENTER
聽 聽// 6
聽 聽 DEFINE BUTTON oBold RESOURCE "Bold" OF oBar MESSAGE "Negrita" NOBORDER ;
聽 聽 聽 聽 ACTION ( lBold := !lBold, oBold:lPressed := lBold, oBold:Refresh(), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oRtf:SetBold( lBold ), oRtf:SetFocus() ) ;
聽 聽 聽 聽 TOOLTIP "Negrita" TRANSPARENT CENTER
聽 聽// 7
聽 聽 DEFINE BUTTON oItalic RESOURCE "Italic" OF oBar MESSAGE "Italica" NOBORDER ;
聽 聽 聽 聽 ACTION ( lItalic := !lItalic, oItalic:lPressed := lItalic, oItalic:Refresh(), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oRtf:SetItalic( lItalic ), oRtf:SetFocus() ) ;
聽 聽 聽 聽 TOOLTIP "Italica" TRANSPARENT CENTER
聽 聽// 8
聽 聽 DEFINE BUTTON oUnderline RESOURCE "Underline" OF oBar MESSAGE "Subrayado" NOBORDER ;
聽 聽 聽 聽 ACTION ( lUnderline := !lUnderline, oUnderline:lPressed := lUnderline, oUnderline:Refresh(), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oRtf:SetUnderline( lUnderline ), oRtf:SetFocus() ) ;
聽 聽 聽 聽 TOOLTIP "Subrayado" TRANSPARENT CENTER
聽 聽// 9
聽 聽 DEFINE BUTTON RESOURCE "Left" OF oBar MESSAGE "Alinea a la izquierda" NOBORDER ;
聽 聽 聽 聽 ACTION ( oRtf:SetAlign( PFA_LEFT ), oRtf:SetFocus() ) ;
聽 聽 聽 聽 TOOLTIP "Alinea a la izquierda" TRANSPARENT CENTER
聽 聽// 10
聽 聽 DEFINE BUTTON RESOURCE "Center" OF oBar MESSAGE "Alinea al centro" NOBORDER ;
聽 聽 聽 聽 ACTION ( oRtf:SetAlign( PFA_CENTER ), oRtf:SetFocus() ) ;
聽 聽 聽 聽 TOOLTIP "Alinea al centro" TRANSPARENT CENTER
聽 聽// 11
聽 聽 DEFINE BUTTON RESOURCE "Right" OF oBar MESSAGE "Alinea a la derecha" NOBORDER ;
聽 聽 聽 聽 ACTION ( oRtf:SetAlign( PFA_RIGHT ), oRtf:SetFocus() ) ;
聽 聽 聽 聽 TOOLTIP "Alinea a la 聽derecha" TRANSPARENT CENTER
聽 聽// 12
聽 聽 DEFINE BUTTON RESOURCE "Justify" OF oBar MESSAGE "Justifica a ambos lados" NOBORDER ;
聽 聽 聽 聽 ACTION ( oRtf:SetAlign( PFA_JUSTIFY ), oRtf:SetFocus() ) ;
聽 聽 聽 聽 TOOLTIP "Justifica a ambos lados" TRANSPARENT CENTER
聽 聽// 13
聽 聽 @ 153,561 COMBOBOX oItem VAR cFont ITEMS aFonts OF oDlg:oBar PIXEL SIZE 133,120 FONT oFont3 ;
聽 聽 聽 聽 ON CHANGE ( oRtf:SetFontName( oItem:VarGet() ), oRtf:SetFocus() )
聽 聽 聽 聽 oItem:cToolTip := "Nombre de fuente"
聽 聽// 14
聽 聽 @ 153,695 GET oSize VAR nSize OF oDlg:oBar FONT oFont3 PIXEL SIZE 21,21 PICTURE "99" SPINNER MIN 6 MAX 99 RIGHT ;
聽 聽 聽 聽 ON CHANGE ( oRtf:SetFontSize( oSize:VarGet() ), oRtf:SetFocus() )
聽 聽 聽 聽 oSize:Set3DLook()
聽 聽 聽 聽 oSize:cToolTip := "Tama帽o de fuente"
聽 聽 AEval( oBar:aControls, { |x| x:nLeft += 226, x:nRight += 226 }, 14 )
聽 聽 oBar:bLClicked := { || nil }
聽 聽 oBar:bRClicked := { || nil }
聽 聽 AEval( oBar:aControls, { |x| x:oCursor := oCursor } )
聽 聽 * Solo para comprobar cuantos elementos tienen la barra
聽 聽 ? "Elementos de la barra: "+Str( Len( oBar:aControls ), 3 )
RETU .T.
*FDF CargaBarra
Descripci贸n de error: Error BASE/1004 Class: 'NIL' has no exported method: ACONTROLS
Como ver谩n es un dialogo, donde inserto un control MiCalendario y un control RichEdit, con la ButtonBar ubicada del medio a la derecha.