que tal amigos, q tal don antonio.. he seguido el hilo y a mi tambien me paso algo parecido, cuando queria matar un control para pasar a otro dialogo, o simplemente para poner otro en lugar del anterior, la aplicacion se ponia algo lenta.. luego me di cuenta q el arreglo aControls crecia sin parar cada vez que hacia una nueva llamada, esto lo pude subsanar, llamando al metodo Hide() en vez de End() y condicionando la ejecucion, si necesitaba llamar de nuevo a un control determinado, preguntaba si ya existia y le hacia un Show(), aparte de eso no asigno variables a los controles, por ejemplo
[code]
/////////////////////////////
// PRUEBA PARA FORO FWPPC
// Luis Santeliz - 12/06/2006
//
luissanteliz@cantv.net//
#include "fwce.ch"
#include "colors.ch"
#include "winapi.ch"
FUNCTION Main()
LOCAL aPict, aCampos
PUBLIC _oWnd, oContenedor, oFnt
#DEFINE data curdir()+"\data"
#DEFINE bitmaps curdir()+"\bitmaps"
DEFINE FONT oFnt NAME "Arial" SIZE 0,12
DEFINE FONT oFnt2 NAME "Arial" SIZE 0,12 BOLD
DEFINE WINDOW _oWND TITLE "Prueba Foro FWPPC"
USE (data+"\clientes.dbf") ALIAS "CLI" INDEX (data+"\clientes") NEW
DEFINE DIALOG oContenedor OF _oWND STYLE nor(WS_CHILD, WS_BORDER) ;
FROM 296, 2 TO 317, 200 PIXEL
ACTIVATE DIALOG oContenedor NOWAIT
#DEFINE oBrw _oWnd:aControls[1]
aPicture:={NIL,"999.99"}
aCampos:={"CLI_NOMBRE","CLI_DESCUE"}
@ 1,1 LISTBOX FIELDS (ContenedorSay(CLI->CLI_CODIGO), OemToAnsi(LEFT(CLI->CLI_NOMBRE,30))), TRANSFORM(CLI->CLI_DESCUE,aPicture[2]) ALIAS "CLI" ;
HEAD "Nombre","Desc" SIZE 240,200 PIXEL OF _oWnd ;
ON CLICK (EditCelda(oBrw,aPicture,aCampos)) ;
FONT oFnt
oBrw:lCellStyle:=.t. // por celda
oBrw:aJustify:={.f.,.t.} // Justifica el texto a la derecha o ala izquierda de cada campo
ACTIVATE WINDOW _oWND
RETURN (.T.)
////////////////////////
// Editar celda
// oxBrw : objeto TWBrowse
// aPict : arreglo con el PICTURE del get, si es NIL no hara el get, si es un codeblock se evaluara, pero aceptara solo valores caracter o NIL
// aCampos : arreglo con los nombres de los campos del alias del browse
//
FUNCTION EditCelda(oxBrw,aPict,aCampos)
#DEFINE nColActual oxBrw:nColAct
#DEFINE nLargo oxBrw:aColSizes[nColActual]
#DEFINE cPict IIF( ValType(aPict[nColActual])="B", Eval(aPict[nColActual]) , aPict[nColActual] )
#DEFINE cSay rtrim(oxBrw:aHeaders[nColActual])
#DEFINE nPosCampo FieldPos(aCampos[nColActual])
#DEFINE nAncho 15
LOCAL uVar:=NIL
// #DEFINE oCantidad oFld:aDialogs[2]
#DEFINE oContenedorSay oContenedor:aControls[1]
#DEFINE oContenedorGet oContenedor:aControls[2]
#DEFINE oContenedorBtnBmp1 oContenedor:aControls[3]
#DEFINE oContenedorBtnBmp2 oContenedor:aControls[4]
IF cPict=NIL
ContenedorSay("No se puede editar.")
RETURN NIL
ENDIF
uVar:=FieldGet(nPosCampo)
oContenedor:EraseBkGnd( oContenedor:GetDC() )
oContenedor:ReleaseDC()
//
// AQUI ES DONDE HAGO LA LLAMADA AL PROCEDIMIENTO Show()
//
IF Len(oContenedor:aControls)>2
oContenedorGet:cText(uVar)
oContenedorGet:Refresh()
oContenedorGet:SetFocus()
// AEval(oContenedor:aControls,{|a,i| a:Show()},3)
oContenedorGet:Show()
oContenedorSay:Show()
oContenedorBtnBmp1:Show()
oContenedorBtnBmp2:Show()
RETURN uVar
ENDIF
//
// Panel para la presentacion del get que obtiene la cantidad luego de seleccionar el articulo para el documento
//
@ 1, 0 SAY cSay+":" SIZE (len(cSay)*6)+1, nAncho PIXEL FONT oFNT2 DIALOG oContenedor
@ oContenedorSay:nTop, oContenedorSay:nRight+1 GET uVar SIZE (len(cPict)*6), nAncho PIXEL PICTURE cPict FONT oFnt RIGHT DIALOG oContenedor
@ oContenedorSay:nTop-2,oContenedorGet:nRight+2 BTNBMP FILE bitmaps+"\si16x16.bmp", bitmaps+"\si16x16_.bmp" ;
SIZE 18,18 PIXEL ACTION (oxBrw:cAlias)->(FieldPut(nPosCampo,uVar)),oContenedorBtnBmp2:Hide(),oContenedorBtnBmp1:Hide() DIALOG oContenedor
@ oContenedorSay:nTop-2,oContenedorBtnBmp1:nRight+1 BTNBMP FILE bitmaps+"\no16x16.bmp", bitmaps+"\no16x16_.bmp" ;
SIZE 18,18 PIXEL ACTION oContenedorBtnBmp1:Hide(),oContenedorBtnBmp2:Hide() DIALOG oContenedor
oContenedorGet:bGotFocus :={||ShowKeyboard() }
oContenedorGet:bLostFocus:={||HideKeyboard(),oContenedorSay:Hide(),oContenedorGet:Hide(), oxBrw:Refresh() }
oContenedorGet:SetFocus()
// EraseBkGnd( hDC )
RETURN
/////////////////////////
// Pinta un mensaje en el contenedor, (y literalmente pinta)
//
FUNCTION ContenedorSay(cMsg)
oContenedor:EraseBkGnd( oContenedor:GetDC() )
oContenedor:ReleaseDC()
oContenedor:Say(1,2,cMsg,CLR_BLACK,CLR_WHITE,oFnt,.T.)
RETURN .T.
/////////////////////////////////////
// convierte texto de msdos en ansi
//
function OemToAnsi( cText )
local cOem := "¤¥‚¡¢£