FolderEx y DelItem

User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: FolderEx y DelItem (Solucionado)

Post by cnavarro »

Daniel Garcia-Gil wrote:
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
He creado estas DATAs, espero haber entendido el alcance de tu comentario :shock:

Code: Select all

   DATA      bPrevItemDeleted
   DATA      bPrevItemAdded
   DATA      bPostItemDeleted
   DATA      bPostItemAdded
 
y las he aplicado asi:

Code: Select all

METHOD AddItem( cItem, cResName, bRedefineControls, cnHelpId )

.../...
   if ValType( ::bPrevItemAdded ) == "B"
      Eval( ::bPrevItemAdded, Self, ::nOption )
   endif

   if Empty( cResName )

.../...

   ::Refresh()

   if ValType( ::bPostItemAdded ) == "B"
      Eval( ::bPostItemAdded, Self, ::nOption )
   endif

RETURN NIL

//------------------------------------------------------------------------//

METHOD DelItem( nOption )

.../...
   if Len( ::aPrompts ) > 0
      if ValType( ::bPrevItemDeleted ) == "B"
         Eval( ::bPrevItemDeleted, Self, nOption, ::nOption )
      endif

.../...


      if ValType( ::bPostItemDeleted ) == "B"
         Eval( ::bPostItemDeleted, Self, nOption, ::nOption )
      endif

   endif
return nil

 
Quizás tambien habria que añadir al Metodo DelItem

Code: Select all


.../...
      ADel( ::aBrightBmp, nOption )
      ASize( ::aBrightBmp, Len( ::aBrightBmp ) - 1 )
      ADel( ::aAlphaLevel, nOption)   //Biel 1404
      ASize( ::aAlphaLevel, Len( ::aAlphaLevel ) - 1 )
      ADel( ::aHasAlpha, nOption )
      ASize( ::aHasAlpha, Len( ::aHasAlpha ) - 1 )
      ADel( ::aAlign, nOption )
      ASize( ::aAlign, Len( ::aAlign ) - 1 )
.../...

 
¿Qué opinas?
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
Biel EA6DD
Posts: 680
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca
Contact:

Re: FolderEx y DelItem

Post by Biel EA6DD »

A la espera de la opinión de Daniel, quizás seria interesante disponer de un array de codeblocks para poder asignar acciones distintas según la pestaña que se cierre. Como comente antes, actualmente suplo esta ausencia colocando el codeblock en el valid del dialogo asociado a la pestaña.
En el additem, creo que no es necesario, con un solo codeblock cumple toda la funcionalidad.
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: FolderEx y DelItem

Post by Daniel Garcia-Gil »

Saludos

Cristobal, Biel

tienen una alta calidad, si ustedes han hecho pruebas y les funciona correctamente, el siguiente paso seria implementar _ expuestos

Gracias
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: FolderEx y DelItem

Post by cnavarro »

Biel EA6DD wrote:A la espera de la opinión de Daniel, quizás seria interesante disponer de un array de codeblocks para poder asignar acciones distintas según la pestaña que se cierre. Como comente antes, actualmente suplo esta ausencia colocando el codeblock en el valid del dialogo asociado a la pestaña.
En el additem, creo que no es necesario, con un solo codeblock cumple toda la funcionalidad.
Que os parece, asi?

Las Datas, serian:

Code: Select all


   DATA      bPrevItemAdded      // Proceso al añadir una pestaña
   DATA      bPostItemAdded      // Idem

   DATA      aPrevItemDeleted   // Procesos individuales para cada pestaña
   DATA      aPostItemDeleted   // Idem
   
 
y el codigo, seria

Method New

Code: Select all

.../...

   ::lTransparent = lTransparent

   ::bPrevItemAdded     := { || .T. }   // New
   ::bPostItemAdded     := { || .T. }   // New

.../...

   ::aDialogs = Array( nLen )
   ::aBitmaps = {}
   ::aBrightBmp = {}
   ::LoadBitmaps( aBitmaps )

   ::aPrevItemDeleted  := Array( nLen )     // New
   AFill( ::aPrevItemDeleted, { || .T. } ) 
   ::aPostItemDeleted  := Array( nLen )    // New
   AFill( ::aPostItemDeleted, { || .T. } ) 

.../...

 
Metodo DelItem

Code: Select all

METHOD DelItem( nOption ) CLASS TFolderEx

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

   DEFAULT nOption := ::nOption

   if Len( ::aPrompts ) > 0

      if ValType( ::aPrevItemDeleted[ nOption ] ) == "B"             // New
         Eval( ::aPrevItemDeleted[ nOption ], Self, nOption, ::nOption )
      endif

      ADel( ::aPrompts, nOption )
      ASize( ::aPrompts, Len( ::aPrompts ) - 1 )
      ADel( ::aHelps, nOption )
      ASize( ::aHelps, Len( ::aHelps ) - 1 )
      ADel( ::aEnable, nOption )
      ASize( ::aEnable, Len( ::aEnable ) - 1 )
      ADel( ::aVisible, nOption )
      ASize( ::aVisible, Len( ::aVisible ) - 1 )
      ADel( ::aBitmaps, nOption )
      ASize( ::aBitmaps, Len( ::aBitmaps ) - 1 )
      ADel( ::aBrightBmp, nOption )
      ASize( ::aBrightBmp, Len( ::aBrightBmp ) - 1 )
      ADel( ::aAlphaLevel, nOption)   //Biel 1404
      ASize( ::aAlphaLevel, Len( ::aAlphaLevel ) - 1 )
      ADel( ::aHasAlpha, nOption )
      ASize( ::aHasAlpha, Len( ::aHasAlpha ) - 1 )
      ADel( ::aAlign, nOption )
      ASize( ::aAlign, Len( ::aAlign ) - 1 )
      ADel( ::aPrevItemDeleted , nOption )                                   // New
      ASize( ::aPrevItemDeleted , Len( ::aPrevItemDeleted ) - 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
      if ValType( ::aPostItemDeleted[ nOption ] ) == "B"                            // New
         Eval( ::aPostItemDeleted[ nOption ], Self, nOption, ::nOption )
      endif
      ADel( ::aPostItemDeleted[ nOption ] , nOption )                              // New
      ASize( ::aPostItemDeleted , Len( ::aPostItemDeleted ) - 1 )
      ::Default()

   endif
Return nil
 
Method AddItem

Code: Select all

METHOD AddItem( cItem, cResName, bRedefineControls, cnHelpId ) CLASS TFolderEx

   local oDlg
   local nLen
   local n
   local oThis := Self

   if ValType( ::bPrevItemAdded ) == "B"         // New
      Eval( ::bPrevItemAdded, Self, ::nOption )
   endif

   if Empty( cResName )
      DEFINE DIALOG oDlg OF oThis STYLE nOR( WS_CHILD, If( ! ::oWnd:IsKindOf( "TDIALOG"), WS_CLIPCHILDREN, 0 ) ) ;
      BRUSH ::oBrush
   else
      DEFINE DIALOG oDlg OF oThis STYLE nOR( WS_CHILD, If( ! ::oWnd:IsKindOf( "TDIALOG"), WS_CLIPCHILDREN, 0 ) ) ;
         NAME cResName brush ::oBrush
   endif

   AAdd( ::aDialogs, oDlg )
   AAdd( ::aPrompts, cItem )
   AAdd( ::aHelps, cnHelpId )
   AAdd( ::aEnable, .t. )
   AAdd( ::aVisible, .t. )
   AAdd( ::aBitmaps, { 0, 0, 0 } )
   AAdd( ::aBrightBmp, 0 )
   AAdd( ::aAlphaLevel,255)   //Biel 1404
   AAdd( ::aHasAlpha, .F. )
   AAdd( ::aAlign, AL_LEFT )

   AAdd( ::aPrevItemDeleted , { || .T. } )
   AAdd( ::aPostItemDeleted , { || .T. } )

   if ValType( bRedefineControls ) == "B"
      Eval( bRedefineControls, oDlg )
   endif
   if ValType( ::bPostItemAdded ) == "B"      // New
      Eval( ::bPostItemAdded, Self, ::nOption )
   endif

   ::Default()

   oDlg:Hide()

   ::SetOption( Len( ::aDialogs ) )
   ::Refresh()

RETURN NIL
 
Biel, Daniel, qué os parece?
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
Biel EA6DD
Posts: 680
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca
Contact:

Re: FolderEx y DelItem

Post by Biel EA6DD »

Buen trabajo Cristobal, yo lo veo perfecto. Ahora ando un poco justo de tiempo, pero en cuanto pueda lo pruebo en profundidad.

Aunque no es problema, no veo la necesidad de iniciar los codeblocks a {||.t.}, puesto que antes de evaluar el codeblock revisas el tipo de de dato, y si no ha sido asignado, simplemente no lo evaluará.
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: FolderEx y DelItem

Post by cnavarro »

Biel, eso ya lo he quitado y alguna modificacion mas
A lo largo del fin de semana pongo el definitivo, pero como sabes, me gustaria que lo probaras cuando puedas
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
Biel EA6DD
Posts: 680
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca
Contact:

Re: FolderEx y DelItem

Post by Biel EA6DD »

METHOD AddItem( cItem, cResName, bRedefineControls, cnHelpId, bPrevItemDeleted, bPostItemDeleted) CLASS TFolderEx //Dos nuevos parámetros

local oDlg
local nLen
local n
local oThis := Self

if ValType( ::bPrevItemAdded ) == "B" // New
Eval( ::bPrevItemAdded, Self, ::nOption )
endif

if Empty( cResName )
DEFINE DIALOG oDlg OF oThis STYLE nOR( WS_CHILD, If( ! ::oWnd:IsKindOf( "TDIALOG"), WS_CLIPCHILDREN, 0 ) ) ;
BRUSH ::oBrush
else
DEFINE DIALOG oDlg OF oThis STYLE nOR( WS_CHILD, If( ! ::oWnd:IsKindOf( "TDIALOG"), WS_CLIPCHILDREN, 0 ) ) ;
NAME cResName brush ::oBrush
endif

AAdd( ::aDialogs, oDlg )
AAdd( ::aPrompts, cItem )
AAdd( ::aHelps, cnHelpId )
AAdd( ::aEnable, .t. )
AAdd( ::aVisible, .t. )
AAdd( ::aBitmaps, { 0, 0, 0 } )
AAdd( ::aBrightBmp, 0 )
AAdd( ::aAlphaLevel,255) //Biel 1404
AAdd( ::aHasAlpha, .F. )
AAdd( ::aAlign, AL_LEFT )

AAdd( ::aPrevItemDeleted , bPrevItemDeleted ) //NEW
AAdd( ::aPostItemDeleted , bPostItemDeleted ) //NEW

if ValType( bRedefineControls ) == "B"
Eval( bRedefineControls, oDlg )
endif
if ValType( ::bPostItemAdded ) == "B" // New
Eval( ::bPostItemAdded, Self, ::nOption )
endif

::Default()

oDlg:Hide()

::SetOption( Len( ::aDialogs ) )
::Refresh()

RETURN NIL
Añadir como parámetros los codeblocks de cierre de pestaña, si no se pasan se añadirá NIL al array con lo que no se evaluarán, y si el parámetros es un codeblock, se ejecutar al cerrar la pestaña.
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: FolderEx y DelItem

Post by Daniel Garcia-Gil »

Saludos

me gustaba mas de la forma inicial

sin usar el arreglo para los "delete", siento que pierde un poco la homogeneidad con el "add" al ser distintos tipos de datos, uno es un codeblock y el otro un arreglo de codeblock (aunque tiene bastante logica), dejo un ejemplo sencillo de como seria la implementacion usando solo codeblock directos sin los arreglos, para explicar un poco mi punto

Code: Select all

#include "FiveWin.ch"


function main()
   local oWnd, i
   local oFld
   local aBitmaps := { "..\bitmaps\alphabmp\exit.bmp",;
                      "..\bitmaps\alphabmp\exit.bmp",;
                      "..\bitmaps\alphabmp\exit.bmp",;
                      "..\bitmaps\alphabmp\exit.bmp",;
                      "..\bitmaps\alphabmp\exit.bmp",;
                      "..\bitmaps\alphabmp\exit.bmp" }
  local hPreDeleteItem := {=>}
  local hPosDeleteItem := {=>}
  local cDeleting
   
   DEFINE WINDOW oWnd TITLE "TFolderex - Testing -"
     
   @ 3, 3 FOLDEREX oFld PIXEL ADJUST;
          PROMPT  "Opction 1", "Option 2", "Option 3", "Option 4", "Option 5", "Option 6";//          
          BITMAPS aBitmaps;
          ACTION( ::DelItem( nOption ) );
          TOP ALIGN FLDBMP_RIGHT, FLDBMP_RIGHT, FLDBMP_RIGHT, FLDBMP_RIGHT, FLDBMP_RIGHT, FLDBMP_RIGHT

   FOR i = 1 TO Len( oFld:aPrompts )
      oFld:SetBrightBmp( "..\bitmaps\alphabmp\exit2.bmp", i )
      hPreDeleteItem[ Upper( oFld:aPrompts[i] ) ] = {| o, nLast, nCurrent | cDeleting := o:aPrompts[nLast] }
      hPosDeleteItem[ Upper( oFld:aPrompts[i] ) ] = {| o, nLast, nCurrent | MsgInfo( Sprintf( "Destroyed Item %s", cDeleting ) ) }
   NEXT

   oFld:bPrevItemDeleted = {|o, nLast, nCurrent |
     local cPrompt := Upper( o:aPrompts[ nLast ] )
     Eval( hPreDeleteItem[cPrompt], o, nLast, nCurrent )
     return nil
   }

   oFld:bPostItemDeleted = {|o, nLast, nCurrent |
     local cPrompt := Upper( o:aPrompts[ nLast ] )
     Eval( hPosDeleteItem[cPrompt], o, nLast, nCurrent )
     return nil
   }
   
   ACTIVATE WINDOW oWnd
   
RETURN NIL


 
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: FolderEx y DelItem

Post by cnavarro »

Si, esa fue mi primera idea
Dejar los dos codeblocks del DelItem y asignar a esos codeblocks las acciones que se necesiten para cada pestaña
La idea de Biel tampoco me pareció mala, por eso lo implementé también, pero, evidentemente, tienes razón en el tema de la homogeneidad en los metodos AddItem y DelItem en cuanto a las nuevas datas se refiere
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
Biel EA6DD
Posts: 680
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca
Contact:

Re: FolderEx y DelItem

Post by Biel EA6DD »

Yo la ventaja que le veía a los arrays es que la funcionalidad quedaba encapsulada en la clase, y de esta forma queda externa y en manos del usuario.
Pero la realidad es que se consigue la misma funcionalidad manteniendo la homogeneidad, personalmente la propuesta de Daniel me parece buena, y en el fondo él es el creador de la clase, por lo que se merece el voto de calidad.

De paso es un buen ejemplo del uso de Hash y Extended Codeblocks, características poco usadas por la mayoría.
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: FolderEx y DelItem

Post by Daniel Garcia-Gil »

Biel

Soy adicto a los Hash, para mi me eliminaron los DO CASE, SWITCH

en _ cuando quiero pasar muchos parametros a una funcion, los envio en forma de hash y se envia un solo parametro

para el extend codeblock, son extremadamente practicos para ejecutar codigo que involucra pocas lineas, si el codigo que va dentro del codeblock es muy extenso ya lo paso a una funcion, por lo general trato de hace un tiempo para aca, que mis funciones no me ocupen mas lineas de las que puedo ver en pantalla, me ha ayudado mucho al mantenimiento y el DRY (dont repeat yourself)
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Post Reply