Page 1 of 2

FolderEx y DelItem

Posted: Mon Feb 16, 2015 11:15 am
by cnavarro
Buenos dias
Me ocurre una cosa muy curiosa que he investigado durante unos dias y no he podido descubrir por qué, ya que la misma metodologia e instrucciones con Folder funciona como espero.
Elimino un dialogo con la instrucción oFld:DelItem( nOp ) y, a partir de ahi en el resto de dialogos que quedan a su derecha, puedo acceder a ellos pero no me permite pulsar click sobre el control, aunque si me funciona el mousewheele dentro de él. Los diálogos (pestañas) que quedan a la izquierda del diálogo eliminado siguen funcionando correctamente.

A ver si a algun compañero le ha ocurrido algo similar y me puede orientar por donde puede ir el tema para intentar buscar una solucion porque ya no se qué mirar o comprobar.

Code: Select all

.../...

      if !Empty( At( "FOLDEREX", oFld:ClassName() ) )
         oFld:DelItem( oFld:nOption ) //nF )
      else
         oFld:DelItemPos( oFld:nOption )
      endif
      aEditors[ nF ] := Nil
      ADel( aEditors, nF )
      ASize( aEditors, Len( aEditors ) - 1 )

      oEditor:End()

.../...
 
Cada diálogo solo tiene un control "Scintilla"

Re: FolderEx y DelItem

Posted: Wed Feb 18, 2015 8:10 am
by Antonio Linares
Cristobal,

Y te permite escribir en ellos ?

Prueba a hacer oScintilla:Enable()

Daniel es quien puede ayudarnos aqui, como padre de TFolderEx. Yo lo acabo de mirar pero no le veo nada mal.

Re: FolderEx y DelItem

Posted: Wed Feb 18, 2015 9:17 am
by cnavarro
Antonio Linares wrote:Cristobal,

Y te permite escribir en ellos ?

Prueba a hacer oScintilla:Enable()

Daniel es quien puede ayudarnos aqui, como padre de TFolderEx. Yo lo acabo de mirar pero no le veo nada mal.
Yo tampoco veo nada mal, y llevo 4 o 5 dias mirandolo
No me deja pinchar en el (el cursor no cambia), pero si me situo encima si me deja actuar con la rueda y los cursores funcionan y tambien me deja escribir
Debo estar ciego :shock: , porque no veo el problema

Re: FolderEx y DelItem

Posted: Fri Feb 20, 2015 2:08 pm
by Daniel Garcia-Gil
Saludos

cambia el metodo DelItem

Code: Select all

METHOD DelItem( nOption ) CLASS TFolderEx

   local nLen, oDlg

   DEFAULT nOption := ::nOption

   if Len( ::aPrompts ) > 0
      ::aPrompts = ADel( ::aPrompts, nOption )
      ::aPrompts = ASize( ::aPrompts, Len( ::aPrompts ) - 1 )
      ::CalPos()
      ::aDialogs[ nOption ]:bValid = { || .t. }
      ::aDialogs[ nOption ]:End()
      ::aDialogs = ADel( ::aDialogs, nOption )
      ::aDialogs = ASize( ::aDialogs, Len( ::aDialogs ) - 1 )
      ::aHelps = ADel( ::aHelps, nOption )
      ::aHelps = ASize( ::aHelps, Len( ::aHelps ) - 1 )
      ::aEnable = ADel( ::aEnable, nOption )
      ::aEnable = ASize( ::aEnable, Len( ::aEnable ) - 1 )
      ::aVisible = ADel( ::aVisible, nOption )
      ::aVisible = ASize( ::aVisible, Len( ::aVisible ) - 1 )
      ::aBitmaps = ADel( ::aBitmaps, nOption )
      ::aBitmaps = ASize( ::aBitmaps, Len( ::aBitmaps ) - 1 )

      ::nOption = Min( ::nOption, Len( ::aPrompts ) ) //Biel 1404
      
      ::Default()
   endif

return nil
 

Re: FolderEx y DelItem

Posted: Fri Feb 20, 2015 2:48 pm
by cnavarro
Daniel, gracias

Solucionado
En las pruebas que he realizado ahora, funciona correctamente

por otra parte, creo que quizás esa linea debería ser asi:

Code: Select all

.../...

      ::nOption = Min( nOption, Len( ::aPrompts ) ) //Biel 1404
      
      ::Default()
   endif

return nil
 
qué opinas?

Re: FolderEx y DelItem (Solucionado)

Posted: Fri Feb 20, 2015 3:49 pm
by Daniel Garcia-Gil
Cristóbal

Hablando de memoria y siguiendo el codigo, creo que si lo hacemos como sugieres imagina que estés en el folder 1 y quieres borrar el 3 (de 5 folder total) entonces el folder cambiaría a la posición 3 cuando realmente estas en la 1

Ahora piensa en esta posible utilidad, agregar un codeblok que se ejecute cuando se borre/agregue un ítem bOnItemDeleted / bOnItemAdded

Re: FolderEx y DelItem (Solucionado)

Posted: Fri Feb 20, 2015 4:49 pm
by Biel EA6DD
Con permiso, ya que fui yo quien sugirió el cambio, para mi tal cual esta es correcto.

Code: Select all

::nOption = Min( nOption, Len( ::aPrompts ) )
Si cerramos la pestaña que tiene foco, no tiene incidencia, pero si cerramos una pestaña teniendo el foco en otra, esta implementación forzara el cambio de pestaña.

Tengo 4 pestañas y desde la pestaña 1 (foco actual) cierro la 4, ::nOption pasará a ser 3, cambiando a pestaña 3.

Code: Select all

::nOption = Min( ::nOption, Len( ::aPrompts ) )
Mismo caso, se eliminará pestaña 4, pero el foco permanecerá en la 1.

Re: FolderEx y DelItem (Solucionado)

Posted: Fri Feb 20, 2015 4:50 pm
by Biel EA6DD
Hemos escrito el mensaje al unísono :lol: :lol:

Re: FolderEx y DelItem (Solucionado)

Posted: Fri Feb 20, 2015 6:51 pm
by cnavarro
Daniel, Biel, totalmente de acuerdo
Mi sugerencia era solo con el planteamiento de borrar la pestaña activa
Evidentemente, eso no es siempre asi

Re: FolderEx y DelItem (Solucionado)

Posted: Fri Feb 20, 2015 7:19 pm
by Daniel Garcia-Gil
Daniel Garcia-Gil wrote:Cristóbal
Ahora piensa en esta posible utilidad, agregar un codeblok que se ejecute cuando se borre/agregue un ítem bOnItemDeleted / bOnItemAdded

Re: FolderEx y DelItem (Solucionado)

Posted: Fri Feb 20, 2015 7:25 pm
by cnavarro
Daniel,
Gracias de nuevo, aunque no lo he comentado antes, me he fijado "muy mucho" :D :D :D :shock: en tu comentario al respecto
Precisamente lo estaba mirando.

Re: FolderEx y DelItem (Solucionado)

Posted: Mon Feb 23, 2015 8:47 am
by Biel EA6DD
Esta modificación del método DelItem, me genera errores.
Adjunto ejemplo, prueba a crear pestañas nuevas con el botón, y después eliminarlas con la x de la pesataña.

Code: Select all

#include "FiveWin.ch"

STATIC oWnd, oFld
function main()

   DEFINE WINDOW oWnd TITLE "TFolderex - Testing -"
  @ 1, 1 FOLDEREX oFld OF oWnd PIXEL ADJUST ;
          PROMPT "vACIO";
          ACTION( ::DelItem( nOption ) );
          TAB HEIGHT 30 ROUND 3

   ACTIVATE WINDOW oWnd  ON INIT CrtBtn( oFld:aDialogs[1] )

RETURN NIL
//-------------------------------------
STATIC FUNCTION CrtBtn( oDlg )
   @ 01,05 BUTTON oBtn PROMPT "New Tab" OF oDlg  SIZE 64, 20 ACTION NewTab()
RETURN NIL
//------------------------------------
STATIC FUNCTION NewTab()
   LOCAL nFld
   oFld:AddItem( ' New Tab')
   nFld:=Len(oFld:aDialogs)
   oFld:SetBitMap("exit.bmp",nFld)
   oFld:SetBrightBmp( "exit2.bmp", nFld)
   oFld:aAlign[nFld]:=1 //Right
RETURN NIL
Error occurred at: 02/23/15, 09:46:09
Error description: Error BASE/1132 Bound error: array access
Args:
[ 1] = A { ... } length: 1
[ 2] = N 2

Stack Calls
===========
Called from: Source\tfoldex.prg => TFOLDEREX:PAINTTB( 1543 )
Called from: Source\tfoldex.prg => TFOLDEREX:PAINT( 1168 )
Called from: Source\tfoldex.prg => (b)TFOLDEREX( 117 )
Called from: Source\tfoldex.prg => TFOLDEREX:DISPLAY( 0 )
Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT( 1699 )
Called from: Source\tfoldex.prg => TFOLDEREX:HANDLEEVENT( 963 )
Called from: .\source\classes\WINDOW.PRG => _FWH( 3450 )
Called from: => DIALOGBOXINDIRECT( 0 )
Called from: .\source\classes\DIALOG.PRG => TDIALOG:ACTIVATE( 286 )
Called from: .\source\function\ERRSYSW.PRG => ERRORDIALOG( 420 )
Called from: .\source\function\ERRSYSW.PRG => (b)ERRORSYS( 23 )
Called from: Source\tfoldex.prg => TFOLDEREX:PAINTTB( 1543 )
Called from: Source\tfoldex.prg => TFOLDEREX:PAINT( 1168 )
Called from: Source\tfoldex.prg => (b)TFOLDEREX( 117 )
Called from: Source\tfoldex.prg => TFOLDEREX:DISPLAY( 0 )
Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT( 1699 )
Called from: Source\tfoldex.prg => TFOLDEREX:HANDLEEVENT( 963 )
Called from: .\source\classes\WINDOW.PRG => _FWH( 3450 )
Called from: => SYSREFRESH( 0 )
Called from: .\source\classes\DIALOG.PRG => TDIALOG:END( 526 )
Called from: Source\tfoldex.prg => TFOLDEREX:DELITEM( 753 )
Called from: Source\Folderex.prg => (b)MAIN( 10 )
Called from: Source\tfoldex.prg => TFOLDEREX:LBUTTONDOWN( 1033 )
Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT( 1720 )
Called from: Source\tfoldex.prg => TFOLDEREX:HANDLEEVENT( 963 )
Called from: .\source\classes\WINDOW.PRG => _FWH( 3450 )
Called from: => WINRUN( 0 )
Called from: .\source\classes\WINDOW.PRG => TWINDOW:ACTIVATE( 1152 )
Called from: Source\Folderex.prg => MAIN( 12 )

Re: FolderEx y DelItem

Posted: Mon Feb 23, 2015 3:18 pm
by cnavarro
Biel, efectivamente daba error

Asi, lo he probado y funciona bien, aunque aun no he tenido tiempo de ver si se puede optimizar

Code: Select all

METHOD DelItem( nOption ) CLASS TCFolderEx

   local nLen  := Len( ::aDialogs )
   local oDlg

   DEFAULT nOption := ::nOption

   if Len( ::aPrompts ) > 0
      ::aPrompts = ADel( ::aPrompts, nOption )
      ::aPrompts = ASize( ::aPrompts, Len( ::aPrompts ) - 1 )
      ::aHelps = ADel( ::aHelps, nOption )
      ::aHelps = ASize( ::aHelps, Len( ::aHelps ) - 1 )
      ::aEnable = ADel( ::aEnable, nOption )
      ::aEnable = ASize( ::aEnable, Len( ::aEnable ) - 1 )
      ::aVisible = ADel( ::aVisible, nOption )
      ::aVisible = ASize( ::aVisible, Len( ::aVisible ) - 1 )
      ::aBitmaps = ADel( ::aBitmaps, nOption )
      ::aBitmaps = ASize( ::aBitmaps, Len( ::aBitmaps ) - 1 )

      ::aSizes   = ADel( ::aSizes, nOption )
      ::aSizes   = ASize( ::aSizes, Len( ::aSizes ) - 1 )
      ::aPos     = ADel( ::aPos, nOption )
      ::aPos     = ASize( ::aPos, Len( ::aPos ) - 1 )

      if nOption < nLen
         ::CalPos()
         ::aDialogs[ nOption ]:bValid = { || .t. }
         ::aDialogs[ nOption ]:End()
         ::aDialogs = ADel( ::aDialogs, nOption )
         ::aDialogs = ASize( ::aDialogs, Len( ::aDialogs ) - 1 )
         ::nOption = Min( ::nOption, Len( ::aPrompts ) ) //Biel 1404
      else
         ::nOption = Min( ::nOption, Len( ::aPrompts ) ) //Biel 1404
         ::CalPos()
         ::aDialogs[ nOption ]:bValid = { || .t. }
         ::aDialogs[ nOption ]:End()
         ::aDialogs = ADel( ::aDialogs, nOption )
         ::aDialogs = ASize( ::aDialogs, Len( ::aDialogs ) - 1 )
      endif
      ::Default()
   endif

return nil
 

Re: FolderEx y DelItem

Posted: Tue Feb 24, 2015 11:06 am
by Biel EA6DD
Si, así a mi también me funciona bien, gracias Cristobal.
El único pero a esta implementación para mi es el

Code: Select all

::aDialogs[ nOption ]:bValid = { || .t. }
 
ya que yo utilizo este codeblock para asignar acciones que se ejecutan al cerrar la pestaña.

Re: FolderEx y DelItem

Posted: Tue Feb 24, 2015 11:15 am
by cnavarro
Biel, aun no me termina de convencer
Sigo haciendo pruebas.
Lo del bValid, creo que no es imprescindible ponerlo

Estoy buscando la Function CalPos que es llamada desde el metodo del mismo nombre pero no la encuentro :shock: