Page 2 of 2
Re: FolderEx y DelItem (Solucionado)
Posted:
Tue Feb 24, 2015 12:53 pm
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
- 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?
Re: FolderEx y DelItem
Posted:
Wed Feb 25, 2015 8:37 am
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.
Re: FolderEx y DelItem
Posted:
Wed Feb 25, 2015 10:25 am
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 los cambios expuestos
Gracias
Re: FolderEx y DelItem
Posted:
Wed Feb 25, 2015 8:55 pm
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 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?
Re: FolderEx y DelItem
Posted:
Fri Feb 27, 2015 11:12 am
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á.
Re: FolderEx y DelItem
Posted:
Fri Feb 27, 2015 12:05 pm
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
Re: FolderEx y DelItem
Posted:
Fri Feb 27, 2015 4:33 pm
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.
Re: FolderEx y DelItem
Posted:
Sun Mar 01, 2015 2:44 am
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 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
Re: FolderEx y DelItem
Posted:
Sun Mar 01, 2015 11:22 pm
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
Re: FolderEx y DelItem
Posted:
Tue Mar 03, 2015 9:23 am
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.
Re: FolderEx y DelItem
Posted:
Tue Mar 03, 2015 1:18 pm
by Daniel Garcia-Gil
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)