Page 1 of 1

ANTONIO AYUDA CON SETFOCUS A UN MDI

Posted: Thu Oct 30, 2008 1:56 am
by angstin
Saludos antonio...

Tengo el siguiente problema estoy trabajando con el wbrowse de hernan en un entorno MDI-MDICHILD al momento de editar una celda verifico si el valor de uBuffer esta vacio y si es asi llamo a una funcion que me arma otra mdi con la empresa, de ahi debo seleccionar la empresa y traerme ese valor para luego guardarlo en la celda que tengo en edicion. El detalle esta en que me abre la ventana de empresas pero no me le da el focus ya que me queda en el modo de edicion del wbrowse....

Espero me puedan ayudar gracias.....

Posted: Thu Oct 30, 2008 2:06 am
by Daniel Garcia-Gil
si pudieras publicar el codigo pienso que seria mas facil ayudarte...

Posted: Thu Oct 30, 2008 2:34 am
by angstin
Saludos mcfox... te anexo el codigo...

//este es el browse que utilizo:
TWBrowse():lHScroll:= .F.
@ 6, 2 LISTBOX Brw1 ;
FIELDS "" ;
ALIAS (CALIAS) ;
OF oWndChild ;
UPDATE
Brw1:SetCols( bro_campo, bro_subtit)
Brw1:bDropOver = { | uDropInfo, nRow, nCol, nKeyFlags | ;
Brw1:Add( uDropInfo ), MsgBeep() }
Brw1:lCellStyle = .T.
Brw1:lAutoEdit = .T.
Brw1:lAutoSkip = .T.
Brw1:ladjlastcol:=.F.
Brw1:lDrawFocusRect:=.F.
Brw1:nLineStyle:= 2
Brw1:Set3DStyle()
Brw1:nHeaderHeight := 18
Brw1:nLineHeight := 15
Brw1:bLogicLen = { || ( Brw1:CALIAS ) -> ( adskeycount() ) } // ( ORDKeyCount() )
Brw1:nClrPane := {|| IIF((Brw1:CALIAS)->(adskeyno()) % 2 == 0 ,RGB(193,221,255),RGB(221,245,255) )}
Brw1:SetSize( oWnd:nWidth-80, oWnd:nHeight-200, .t. )
Brw1:bBkColor:= {|nRow,nCol,nStyle| ;
if( nStyle==3 .OR. nStyle=0, if( nCol==1,GetSysColor( COLOR_BTNFACE ),),) }
Brw1:bTextColor:= {|nRow,nCol,nStyle| ;
if( nStyle==3 .OR. nStyle=0, if( nCol==1,RGB( 192,192,192 ),),) }
Brw1:bKeyChar := {|nK| if( nK==VK_RETURN,Brw1:Edit(Brw1:nColAct,.t.),) }
Brw1:bEdit:= {|nCol, cBuffer, lFirstEdit|;
EDICION( Brw1, nCol, cBuffer, CALIAS, lFirstEdit, xCols, oWnd ) }

//la funcion de edicion:
STATIC Function EDICION( Brw1, nCol, cBuffer, CALIAS, lFirstEdit, xCols, oWnd )
LOCAL aResult, uBuffer, lContinue:= .T.
LOCAL bValid, aItems, bAction, nClrFore, nClrBack
nClrFore := RGB(0,0,0)
nClrBack := RGB(149,198,147)

FOR nCol := 1 TO xCols

Do Case
Case nCol == 2 // ID COM
uBuffer := (CALIAS)->id_com
bValid := {|| IF(EMPTY(aResult:=SELECEMPRE(@uBuffer)),.F.,.T.)}

IF lContinue:= Brw1:lEditCol( nCol, @uBuffer, "@!", bValid, nClrFore, nClrBack)
IF !EMPTY(uBuffer)
IF(WndSetFocus("Compañias",oWnd))
REPLACE (Brw1:CALIAS)->id_com WITH uBuffer
ENDIF
ENDIF
ENDIF

ENDDO
NEXT nCol

//la funcion SELECEMPRE() me llama a otra funcion es la que me arma
//la ventana MDI de empresas:

FUNCTION SELECEMPRE( xVar )
LOCAL aRetorno
aRetorno := COMP0101( @xVar )
RETURN aRetorno

// esta funcion la uso para darle el focus al windows por el ctitle
FUNCTION WndSetFocus(cTitle,oWnd)
*------------------------------------------------------*
local i:=0,lSuccess:=.f.
cTitle:=upper(cTitle)
FOR i=1 to len(oWnd:oWndClient:aWnd)
IF upper( oWnd:oWndClient:aWnd[i]:cCaption )=cTitle
oWnd:oWndClient:aWnd[i]:SetFocus()
lSuccess:=.t.
ENDIF
NEXT
RETURN lSuccess

Posted: Thu Oct 30, 2008 2:59 am
by angstin
Aqui anexo una imagen con las ventanas...

Image

Posted: Thu Oct 30, 2008 11:38 am
by Daniel Garcia-Gil
has verificado que FUNCTION WndSetFocus(cTitle,oWnd) este haciendo el trabajo correcto?

puedes ahcer esto:
bValid := {|| IF(EMPTY(aResult:=SELECEMPRE(@uBuffer)),.F.,.T.)}
con aResult no estas haciendo nada ya que esa variable toma el valor de FUNCTION SELECEMPRE( xVar ), has que esta funcion COMP0101( @xVar ) te retorne el Objeto window MDICHILD

Code: Select all | Expand


bValid := {|| IF(EMPTY(oWndEmp:=SELECEMPRE(@uBuffer)),.F.,.T.)}
...

IF lContinue:= Brw1:lEditCol( nCol, @uBuffer, "@!", bValid, nClrFore, nClrBack)
   IF !EMPTY(uBuffer)
      IF (WndSetFocus(oWndEmp:cTitle,oWnd))  //cambia aqui
         REPLACE (Brw1:CALIAS)->id_com WITH uBuffer
      ENDIF
   ENDIF
ENDIF

...
FUNCTION SELECEMPRE( xVar )
LOCAL oWndEmp
oWndEmp := COMP0101( @xVar )
RETURN oWndEmp


o si no... ya que tienes el objeto de la mdichild has oWndEmp:SetFocus() directamente...

espero te sirva

Posted: Thu Oct 30, 2008 11:54 am
by angstin
Ok amigo, Gracias....

Lo pruebo y te aviso.....

Posted: Thu Oct 30, 2008 2:56 pm
by angstin
mcfox...
no me funcion me sigue el mismo problema, el detalle esta en que llamo a comp0101 y el me arma el otro mdi donde debo seleccionar la compañia y devolverme con ese valor, pero despues que llamo a comp0101 el me pasa al siguiente codigo, como hago para que que se me quede en la ventana de compañia hasta que seleccione y luego me devuelva a la ventana donde tengo la celda en edicion....

Posted: Thu Oct 30, 2008 3:46 pm
by Daniel Garcia-Gil
cuando crees el MDI en comp0101 en el comando ACTIVATE en la clausula ON INT dale el foco al wbrowse

ACTIVATE oWndChild ON INIT oBrw:SetFocus()

o sino intenta esto tambien en comp0101

oWndChild:bGotFocus:={|| oBrw:SetFocus() }

oWndChild = el nombre de tu objeto window/dialog
oBrw = nombre de tu objeto Wbrowse

Posted: Thu Oct 30, 2008 4:00 pm
by angstin
mcfox...

El foco me lo hace bien siempre y cuando no deje en modo de edicion la celda en el listbox desde donde lo estoy llamando. y necesito mantenerla en edicion por que a lo que seleccione la compañia me debe traer ese valor y colocarmelo en esa celda....

Posted: Thu Oct 30, 2008 4:07 pm
by Daniel Garcia-Gil
elimina la edicion y asignale el valor a la fila desde donde haces la llamada, es decir, si haces la llamada desde la fila 4, le vas a asignar el valor a la fila 4 y columna 2 ( donde tienes el codigo ), si quieres hablamos por msn...