FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Raro comportamiento con un dialogo
Posts: 257
Joined: Tue May 16, 2006 04:46 PM

Raro comportamiento con un dialogo

Posted: Wed Aug 17, 2011 11:12 PM
Hola mis cuates,

Estoy haciendo un especie de MSGGet pero que el dialogo se ajuste al tamaño del texto (cuando es extenso). Lo normal seria sencillamente hacer esto:

Code (fw): Select all Collapse
FUNCTION Pregunta(Preg,Resp,Titu,cHelpID) //Pregunta que hara,Respuesta por defecto,Titulo del dialogo,Codigo para enlazarse a la ayuda
 LOCAL oDlg,oBtnXDef,oFnt
 LOCAL Lineas,AnchoMax:=0,Alto,AltoDlg,oPreg,oResp,I,X
 DEFINE FONT oFnt NAME "ARIAL" SIZE 0,15 //Define la letra a usar
 Lineas:=MLCOUNT(Preg,120)+1 //No de renglones que tiene la pregunta considerando esos caracteres por renglon
 DEFINE DIALOG oDlg FROM 5, 5 TO 15, 40 TITLE Titu FONT oFnt
  FOR I:=1 TO Lineas ; AnchoMax:=MAX(oDlg:GetWidth(MEMOLINE(Preg,120,I),oFnt),AnchoMax) ; NEXT //Calcula el ancho maximo
  Alto:=oDlg:nGetChrHeight() //Altura de cada linea
  @ 1,1 BTNBMP oBtnXDef FILENAME ".\BAceptar.BMP" OF oDlg SIZE 58,58 ACTION oDlg:END() TOOLTIP "Aceptar lo que tecleaste"
  @ 59,1 GET Preg MULTILINE OF oDlg SIZE AnchoMax,Lineas*Alto PIXEL WHEN .F. //Muestra la pregunta
  @ ((Lineas+1)*Alto)+58,1 GET oResp VAR Resp OF oDlg SIZE AnchoMax,Alto PIXEL //Toma la respuesta
  ACTIVATE DIALOG oDlg CENTER ;
 ON INIT ( oDlg:nWidth:=AnchoMax+5,oDlg:nHeight:=(Alto*(Lineas+2))+58+53,oDlg:CENTER(),oDlg:REFRESH(),SYSREFRESH() ) //Ajusta el dialogo al texto de la pregunta
 oFnt:END()
RETURN(Resp)


Sin embargo todo me aparece desproporcionado. El boton aparece gigante, las lineas no caben en el dialogo a lo ancho y a lo alto ocupa mucho mas espacio del que deberia al grado de que la respuesta a capturar no aparece.

Que estoy haciendo mal?
RodolfoRBG
FWH 1307, xHarbour123 BCC582
rodolfoerbg@gmail.com
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM

Re: Raro comportamiento con un dialogo

Posted: Thu Aug 18, 2011 01:58 AM

Hola

Los dialogos usan distintas unidades, prueba dividiendo el monto entre 2

Posts: 257
Joined: Tue May 16, 2006 04:46 PM

Re: Raro comportamiento con un dialogo

Posted: Thu Aug 18, 2011 04:48 AM
Mi estimado Daniel, como es costumbre, excelentes tus recomendaciones.

Un poco complicado saber que habia que dividir entre 2 pero a "prueba y error" logre lo que queria. Ya solo me falta un detallito que no logro afinar: No logro que al entrar aqui coloque el foco en la respuesta. Asi quedo el codigo:

Code (fw): Select all Collapse
//=============================================================================
//Hace una pregunta en una caja de dialogo ajustandose al tamaño de la pregunta
//NOTA: Los Dialogos usan algunos valores que se duplican, razon por la cual se divide entre 2 varios valores aqui utilizados y otros los multiplico por 2
FUNCTION Pregunta(Preg,Resp,Formato,Titu,cHelpID) //Pregunta que hara,Respuesta por defecto,Titulo del dialogo,Codigo para enlazarse a la ayuda
 LOCAL oDlg,oBtnXDef,oFnt
 LOCAL Lineas,AnchoPreg,AnchoMax:=0,Alto,oPreg,oResp,I,X
 DEFINE FONT oFnt NAME "ARIAL" SIZE 0,16 //Define la letra a usar
 DEFAULT Formato:=REPL("X",LEN(CVALTOCHAR(Resp))),Titu:="Responde lo siguiente" //Define el formato
 IF VALTYPE(Resp)="D" ; Formato:="##/##/####" ; ENDIF //Si es una fecha
 Lineas:=MLCOUNT(Preg,120)+1 //No de renglones que tiene la pregunta considerando esos caracteres por renglon
 DEFINE DIALOG oDlg FROM 5, 5 TO 15, 40 TITLE Titu FONT oFnt
  AnchoPreg:=oDlg:GetWidth(REPL("M",LEN(CVALTOCHAR(Resp))),oFnt)*1.2 ; AnchoMax:=AnchoPreg
  FOR I:=1 TO Lineas ; AnchoMax:=MAX(oDlg:GetWidth(MEMOLINE(Preg,120,I),oFnt),AnchoMax) ; NEXT //Calcula el ancho maximo
  Alto:=(oDlg:nGetChrHeight()/2) //Altura de cada linea
  @ 1,1 BTNBMP oBtnXDef FILENAME DirSist+"BAceptar.BMP" OF oDlg SIZE 30,30 ACTION oDlg:END() TOOLTIP "Aceptar lo que tecleaste"
  @ 30+1,1 GET Preg MULTILINE OF oDlg SIZE AnchoMax/2,Lineas*Alto PIXEL UPDATE WHEN .F. //Muestra la pregunta
  @ (((Lineas)*Alto)+30+3),1 GET oResp VAR Resp OF oDlg SIZE AnchoPreg/2,Alto*1.6 PIXEL UPDATE PICTURE Formato //Toma la respuesta
  oDlg:bGotFocus:={||oResp:SETFOCUS()} //<---- No funciona
  //oResp:SETFOCUS() aqui o en el "ON INIT" tampoco me funciona <-------------------
  ACTIVATE DIALOG oDlg CENTER ;
 ON INIT ( oDlg:nWidth:=AnchoMax+10,oDlg:nHeight:=((Alto*2)*(Lineas+6))+30,oDlg:CENTER(),oDlg:REFRESH(),SYSREFRESH() ) //Ajusta el dialogo al texto de la pregunta
 oFnt:END()
RETURN(Resp)

Donde esta el error? Salu2
RodolfoRBG
FWH 1307, xHarbour123 BCC582
rodolfoerbg@gmail.com
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM

Re: Raro comportamiento con un dialogo

Posted: Thu Aug 18, 2011 04:58 AM

Rodolfo, prueba con:

oDlg:bInit:={|| oResp:SetFocus() }

ACTIVATE DIALOG oDlg

Saludos.

Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 257
Joined: Tue May 16, 2006 04:46 PM

Re: Raro comportamiento con un dialogo

Posted: Thu Aug 18, 2011 05:09 AM
Don Francisco, gracias por tu respuesta pero tampoco funciono pero ya encontre la solucion, tan tonta como colocar en 1er lugar la linea de instrucciones de la respuesta, luego la del boton y al final la de la pregunta. Al parecer, como en el viejo Clipper, le da preferencia al orden de las instrucciones que das.

Quedo asi:
Code (fw): Select all Collapse
 DEFINE DIALOG oDlg FROM 5, 5 TO 15, 40 TITLE Titu FONT oFnt
  AnchoPreg:=oDlg:GetWidth(REPL("M",LEN(CVALTOCHAR(Resp))),oFnt)*1.2 ; AnchoMax:=AnchoPreg
  FOR I:=1 TO Lineas ; AnchoMax:=MAX(oDlg:GetWidth(MEMOLINE(Preg,120,I),oFnt),AnchoMax) ; NEXT //Calcula el ancho maximo
  Alto:=(oDlg:nGetChrHeight()/2) //Altura de cada linea
  @ (((Lineas)*Alto)+30+3),1 GET oResp VAR Resp OF oDlg SIZE AnchoPreg/2,Alto*1.6 PIXEL UPDATE PICTURE Formato //Toma la respuesta <---En 1er lugar
  @ 1,1 BTNBMP oBtnXDef FILENAME DirSist+"BAceptar.BMP" OF oDlg SIZE 30,30 ACTION oDlg:END() TOOLTIP "Aceptar lo que tecleaste"
  @ 30+1,1 GET Preg MULTILINE OF oDlg SIZE AnchoMax/2,Lineas*Alto PIXEL UPDATE WHEN .F. //Muestra la pregunta
  ACTIVATE DIALOG oDlg CENTER ;
 ON INIT ( oDlg:nWidth:=AnchoMax+10,oDlg:nHeight:=((Alto*2)*(Lineas+6))+30,oDlg:CENTER(),ColocaMB(oBtnXDef),oDlg:REFRESH(),SYSREFRESH() ) //Ajusta el dialogo al texto de la pregunta


Salu2 y gracias, ya me podre ir a dormir un rato
RodolfoRBG
FWH 1307, xHarbour123 BCC582
rodolfoerbg@gmail.com

Continue the discussion