FolderEx y DelItem

Re: FolderEx y DelItem (Solucionado)

Postby cnavarro » Tue Feb 24, 2015 12:53 pm

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  Expand view

   DATA      bPrevItemDeleted
   DATA      bPrevItemAdded
   DATA      bPostItemDeleted
   DATA      bPostItemAdded
 


y las he aplicado asi:
Code: Select all  Expand view

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  Expand view


.../...
      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?
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: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: FolderEx y DelItem

Postby Biel EA6DD » Wed Feb 25, 2015 8:37 am

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
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Re: FolderEx y DelItem

Postby Daniel Garcia-Gil » Wed Feb 25, 2015 10:25 am

Saludos

Cristobal, Biel

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

Gracias
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: FolderEx y DelItem

Postby cnavarro » Wed Feb 25, 2015 8:55 pm

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  Expand view


   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  Expand view

.../...

   ::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  Expand view

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  Expand view

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?
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: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: FolderEx y DelItem

Postby Biel EA6DD » Fri Feb 27, 2015 11:12 am

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
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Re: FolderEx y DelItem

Postby cnavarro » Fri Feb 27, 2015 12:05 pm

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
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: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: FolderEx y DelItem

Postby Biel EA6DD » Fri Feb 27, 2015 4:33 pm

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
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Re: FolderEx y DelItem

Postby Daniel Garcia-Gil » Sun Mar 01, 2015 2:44 am

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  Expand view

#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


 
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: FolderEx y DelItem

Postby cnavarro » Sun Mar 01, 2015 11:22 pm

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
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: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: FolderEx y DelItem

Postby Biel EA6DD » Tue Mar 03, 2015 9:23 am

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
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Re: FolderEx y DelItem

Postby Daniel Garcia-Gil » Tue Mar 03, 2015 1:18 pm

Biel

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

en algunos casos 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)
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Previous

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 69 guests