Respuestas de foro creadas
-
AutorEntradas
-
XeviParticipante
Fredy,
He intentado ver donde "casca"
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102PROCEDURE ProvaArrayBrowse()Local aItems := {}Local nFor n:=1 To 50AAdd( aItems, { "Registro " + ToString(n), "Columna2" } )NextWITH OBJECT TWebPage():New():lAlerts := .T.WSeparator():New(:WO):Create()WSeparator():New(:WO):Create()//Un contenedor del BrowseWITH OBJECT WBevel():New(:WO):oStyle:cPadding_left := 0 //No dejo márgenes a la izquierda:oStyle:cPadding_right := 0 //No dejo márgenes a la derechaWITH OBJECT WArrayBrowse():New(:WO):cId := "table":lIncludeArray := .f.:nStyle := xc_Striped // Estilo visual, con pautado pijama:cClrHeadPane := "black" // Color de Fondo a las cabeceras:cClrHeadText := "white" // Color del texto de cabeceras:oStyle:cLine_height := 0 //Quito altura entre registro y registro:cOnClick := "DatosRegistro":cAjaxBevel := "nflcargo":nIndexValue := 1:cCSS += "table.striped>tbody>tr>td { border: 1px solid #dee2e6; }" // Borde al Browse, interlineado y entre columnas:cCSS += "#table_head1 { padding-top: 0px; padding-bottom: 2px; }" // Menos alto título columnas:cCSS += "#table_head2 { padding-top: 0px; padding-bottom: 2px; }" // debo establecerlas a TODAS:cCSS += cssMakeScrollable()// Añadimos ColumnasWITH OBJECT :AddCol( "Col1", xc_Right, xc_Right ) AS WItemColBrowse // texto cabecera, alineacion cabecera, alineacion datos AS wItemColBrowse:nWidth := 25END WITHWITH OBJECT :AddCol( "Col2", xc_Center, xc_Left ) AS WItemColBrowse:lBold := .T.:nWidth := 75END WITH:aItems := AsciiHTML(aItems) // Le alimentamos datos directamente de la consulta:Create()END WITH //ArrayBrowse:Create()END WITH //BeveloCgi:SendPage( :Create() )END WITH //WebPageRETURN//------------------------------------------------------------------------------static FUNCTION cssMakeScrollable()LOCAL cTxt//https://stackoverflow.com/questions/47723996/table-with-fixed-thead-and-scrollable-tbodyTEXT INTO cTxt.table > thead { display:table; width: 100%; background: black; }.table > thead > tr { width: calc(100% - 17px); }.table > thead > tr > th { border-bottom: 1px black solid; }.table > tbody { max-height: 485px; overflow-y: scroll; display: block; }tr { display: table; width: 100%; }ENDTEXTRETURN cTxt//------------------------------------------------------------------------------PROCEDURE DatosRegistro()Local cHtml// Local oRegistro := GetRowValue( oCGI:GetCGIValue( "table" ) )WITH OBJECT WMsgAlert():New():cText := 'Datos Registro':Create()cHtml := :FullHtml()END WITHoCGI:SendScript( cHtml )RETURN//------------------------------------------------------------------------------//Fredy te ha comentado el uso de una función que utiliza, pero que no esta aun incluida en Nefele, estaré en la proxima versión pero por ahora puedes incluirla en tu proyecto.static FUNCTION GetRowValue( cDato )Local eRetorno// En cDato llega en indice (nIndexValue del browse que será el campo clave en la base de datos) y el id html de la linea para poder cambiarlacDato := hb_ATokens( cDato , "|" )WITH OBJECT eRetorno := TExsTruct():New():AddMember( "cValue"):AddMember( "cId"):cValue := cDato[1]:cId := cDato[2]ENDRETURN eRetornoSi descomento la línea que hace la llamada a GetRowValue() muestra el WAlert.
Este es el ejemplo más sencillo que he podido llegar
De esta manera lo puedes probar tu mismo.
Un saludo,
Xevi.
- Esta respuesta fue modificada 4 años, 1 mes por Xevi.
XeviParticipanteUn pequeño detalle.
Borde cabecera y entre columnas cabecera.
:cCSS += "table.striped tr { border: 1px solid #dee2e6; }"
Un Saludo,
Xevi.
XeviParticipante👏👏👏
Si ya lo teneis hecho!!!
Y no podemos actualizar???
jejeje
Un Saludo,
Xevi
XeviParticipanteAhora, pensando y viendo algun browse con TWeb Botstrapp, forma parte de la rabla... se incluye una imagen doble flecha si no orden, flecha hacia arriba si orden ascendente, flecha abajo si orden descendente.
Es una forma "cerrada" del browse, pero no tienes que programar NADA, el browse ya lo lleva incluido.
Como idea para un simple browse, estaría bien.
- Esta respuesta fue modificada 4 años, 1 mes por Xevi.
XeviParticipantePERFECTO!!!
Y ya para dejarlo todavía más mejor...
OnclickHeader, ¿sería posible añadirlo???
Que se recibiera la columna en la que se ha presionado click, y así poder hacer, cosillas como Ordenación A-Z o Z-A
El :cOnClick del WArrayBrowse sirve o actúa cuando se presiona click en un registro... pero igual valdria ese mismo evento si el registro fuera cero o -1 . No se, pienso en voz alta, jejeje
Gracias por vuestro tiempo.
Un Saludo,
Xevi.
XeviParticipanteFredy...
1234:lEdit := .T.:cOnClickEdit := "#alert('De moment... No deixo Modificar')":lDelete := .T.:cOnClickDelete := "#alert('De moment... No deixo Borrar')"Veo que hay o se dispone de 2 botones/iconos...
Pero, por pedir... no seria posible disponer, en lugar de 2 botones establecidos/limitados, "abrirlo" y hacerlo más extensible. Un array de Botones/iconos, y que se pongan los que uno defina.
aButtonsOptions := { { <cIcon>, <cOnClick>, <cAjaxBevel> } }
Así, pues podríamos tener 3, 5, 8 o nuinguno, dependiendo del ArrayButtonsOptions
Yo con PutImage, (como me indicaste) le puedo añadir más, pero no se, es por pedir y hacer más abierto las opciones de incrustar botoncitos... ya que la rueda está inventada, no andar haciendo experimentos mal hechos por nuestra parte, digo. No se.
Un Saludo,
Xevi.
XeviParticipanteEsto, esto, Pedro!!!
Un Saludo,
Xevi.
XeviParticipante123456789101112131415161718PROCEDURE PruebaWSlider()WITH OBJECT TWebPage():New()WITH OBJECT WSlider():New(:WO):AddItem( "http://xevicomas.duckdns.org:8069/images/@Soft/Nefele Logo.jpg" ):AddItem( "http://xevicomas.duckdns.org:8069/images/@Soft/harbour.png" ):aWidth := {4}:nHeight := 250:nTime := 3:nAnimation := 2:lIndicators := .f.:Create()ENDoCgi:SendPage( :Create() )END WITHRETURNLa segunda imagen se "recorta" y no se ve la proa ni las letras "ur"
Seria algo como decirle "Imagen adaptate al tamaño del oParent y sin distorsionar la imagen dejando margenes donde haya que dejarlos. En Xailer tenemos la propiedad lAutoFit, creo recordar en una imagen...
Un Saludo,
Xevi.
XeviParticipanteMario,
Yo no utilizo SQLite, pero utilizo MariaDB y DBFs, con resultados satisfactorios.
123456789101112131415oCgi:Tiempos( "Inici SQL" )WITH OBJECT TMariaDBDataSource():Create():cHost := "192.168.1.2"//AppData:cXCM_DynDNS:cUser := AppData:cUserXCM:cPassword := AppData:cPassXCM:cDataBase := "xevi":lDisplayErrors := .F.oCGI:Console( "Conectado = " + ToString( :Connect()) )If :Connect()aItems := :QueryArray( cSQL ):Disconnect()EndIfEND WITHoCgi:Tiempos( "Final SQL" )Hecha mano de Néfele Console!!!
has probado la conexión???
oCGI:Console( "Conectado = " + ToString( :Connect()) )
Un Saludo,
Xevi.
XeviParticipante¿Como lo haríamos para que las imágenes se "centraran" y ocupasen el espacio del contenedor???
Ya que si tenemos distintas imágenes, con distintos tamaños, unas quedan "cortadas" otras "enormes" y el efecto visual no es "bonito" que digamos.
Alguna propiedad que hace un Resize de la imagen y la adapte a su contenedor???
Un Saludo,
Xevi.
XeviParticipanteSip... con StrToXml() se ven correctamente los caracteres
Lo que me resulta "raro" es que un WLabel u otro control WEdit, WButton... visualize correctamente un Text conteniendo acentos çÇ ñÑ sin necesidad de StrToXml(), y en cambio un control WListView necesite de esa "de/codificación"
el archivo .prg es en format UTF-8, o sea que debe ser por el control en si.
Un Saludo,
Xevi.
XeviParticipantePERFECTO!!!
Un saludo,
Xevi.
XeviParticipanteDaniel,
Se agradece el aporte... ahora bien, por pedir, pediría que los aportes/ejemplos sean básicos (como el que has puesto) pero a poder ser que sean "autosuficientes", vaya, que se pueda ejecutar con el propio código que se muestra/aporta.
Así pues, tu ejemplo...
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849PROCEDURE PruebaDaniel()Local nI, nJLocal aFamilias := { { "1", "Família1 çÇ"}, { "2", "Família2 ñÑ"} }Local aArticulos := { { "R101", "1",, "Descripción Articulo1 çÇ", 101, "Descripción ampliada Artículo R101 çÇ" },;{ "R102", "2",, "Descripción Articulo2 ñÑ", 102, "Descripción ampliada Artículo R102 ñÑ"} }WITH OBJECT TWebPage():New()With Object WLabel():New(:WO):nFontSize := 5:lBold := .T.:cAlign := xc_Center:cText := "Pruebas Néfele4Harbour!!! çÇ ñÑ":Create()End WithWith Object WListView():New(:WO):cType := xc_Expandable:lTitleItem := .T.:cClrPane := "light-blue lighten-4":cClrText := "white":cIconOpen := "keyboard_arrow_up":cIconClose := "keyboard_arrow_down"for nI := 1 to Len(aFamilias)With Object :AddItem(aFamilias[nI,1],,AsciiHTML(aFamilias[nI,2])) As wItemListView:lDefault := .F.With Object WListView():New(:WO):lTitleItem := .T.:cClrPane := "light-blue lighten-5"for nJ := 1 to Len(aArticulos)if aArticulos[nJ,2] == aFamilias[nI,1]With Object :AddItem(nJ,,AsciiHTML(aArticulos[nJ,4]),AsciiHTML(aArticulos[nJ,6])) As wItemListViewWith Object :oBadge As wBadge:cText := LTrim(Transform(aArticulos[nJ,5], "99,999.99"))End WithEnd Withendifnext:Create()End WithEnd Withnext:Create()End WithoCgi:SendPage( :Create() )END WITHRETURNY realmente, tienes razón, al mostrar ListViews, muestra mal los caracteres con acentos o Çç ñÑ
Un Saludo,
Xevi.
- Esta respuesta fue modificada 4 años, 1 mes por Xevi.
XeviParticipanteCoooorrecto, esa línea es la que me faltava... y no la havia visto del otro ejemplo!!!
Errores de principiante.
XeviParticipantePERFECTO!!!
Al no estar documentada, me iba pasando de una página a otra con :aParams...
El poder usar estos métodos, te simplicica y ayuda a hacer la "transición" más a nuestra manera... que igual no es la correcta, pero es la que estamos mas acostumbrados.
Gracias por el trabajo que estais haciendo!!!
La sencillez que transmite Néfele... ¿no tiene límites???
Un Saludo,
Xevi.
XeviParticipanteCon un ejemplo sencillo, también, intento mostrar un mensaje alerta (de los del sample Néfele) y no me muestra el mensaje.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include "Xailer.ch"#include "Nefele.ch"PROCEDURE prueba()With Object TWebPage():New()WITH OBJECT WArrayBrowse():New(:WO):cId := "MiBrowse" // Id que le damos al ArrayBrowse:nStyle := xc_Striped // Estilo visual, con pautado pijama:cClrHeadPane := "#bfccc3" //"red lighten-4" // Le damos color a las cabeceras:cOnClick := "DatosRegistro" // En caso de picar en un elemento del ArrayBrowse:cAjaxBevel := "nflcargo":nIndexValue := 1// Añadimos ColumnasWITH OBJECT :AddCol( "Columna1" ) AS wItemColBrowse:cClrPane := "#bfccc3" //"blue darken-1" // Puedo darle color al fondo de la columna:cClrText := "white" // Y al Texto:cAlign := xc_RightEND WITHWITH OBJECT :AddCol( "Columna2" ) AS WItemColBrowse:lBold := .T. // Podemos asignar la letra en Negrita:cAlign := xc_LeftEND WITH:AddCol( "Columna3",,xc_Left)// Le alimentamos datos directamente:aItems := { { "Registro 1", "Lin1Col2", "Lin1Col3" },;{ "Registro 2", "Lin2Col2", "Lin2Col3" },;{ "Registro 3", "Lin3Col2", "Lin3Col3" } }// Y creamos el ArrayBrowse:Create()END WITHoCgi:SendPage( :Create() )End WithRETURNPROCEDURE DatosRegistro()Local cHtmlLocal oRegistro := GetRowValue( oCGI:GetCGIValue( "MiBrowse" ) )//Esto SI funciona y muestra un mensaje Alert del Navegador* cHtml := Tag("script", "alert('" +AsciiHtml( oRegistro:cValue )+ "')" )//Esto no funciona, no muestra mensajeWITH OBJECT WMsgAlert():New():cText := AsciiHtml( oRegistro:cValue ):Create()cHtml := :FullHtml()END WITHoCGI:SendScript( cHtml )RETURNSi me muestra un mensaje Alert propio del navegador, pero NO el mensaje de los Samples
Alguna cosa estoy haciendo mal!!!
Un saludo,
Xevi.
XeviParticipantesigo con ejemplillos sencillitos, cortos pero que pueda entender para aprender.
No es que los ejemplose de Néfele no estén bien documentados, que lo estan, sinó que a veces con tanto código uno se pierde e igual a más de uno le puede dar por "rendirse" a probar de hacer su propio ejemplillo funcional.
Comparto lo más sencillo de código para tener un Browse con paginación, que podeis probar con un simple copy-paste.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980#include "Xailer.ch"#include "Nefele.ch"PROCEDURE Factures()// Comenzamos instanciando la Página Web que queremos crearwith object TWebPage():New()// Instanciamos un Panel para que sea el contenedor del formulario, permite poner un titulo y tiene un efecto sombraWith Object WPanel():New(:WO)// tenemos que tener un contenedor para recibir la respuesta del AJAXWith Object WBevel():New(:WO):cId := "pages"// Cuando cargamos la primera vez montamos la página 1 del listviewFacturesBrowse( 1, :WO ):Create()End With:Create()end with// Y listo, ya tenemos nuestra página creada, como el :Create() de un tWebPage nos retorna todo el HTML de la página// sobre la marcha hacemos el envio de dicho HTML al navegador que nos ha realizado la conexiónoCgi:SendPage(:Create())end withRETURN//------------------------------------------------------------------------------static FUNCTION FacturesBrowse( nPage, oParent )LOCAL cHtmlLocal n, aItems := {}//Cargamos datos en un Array que se mostraran en el Browse//Podríamos proveer de datos el Array desde cualquier consulta DBF o MariaDBAAdd( aItems, { 1, 20001 } )AAdd( aItems, { 2, 20002 } )AAdd( aItems, { 3, 20003 } )AAdd( aItems, { 4, 20004 } )AAdd( aItems, { 5, 20005 } )DEFAULT nPage TO 1WITH OBJECT WListView():New(oParent):lTitleItem := .T.// Parametros para la Paginación:nItemInPage := 3//7:nPage := nPage:cOnChangePage := "FacturesAjaxChangePage" // Esta es la función a Llamar al cambiar de página:cAjaxPages := "pages" // Este es el wBevel que contiene el wListView y al que hay que enviar la respuesta del AJAXFor n:=1 To Len(aItems)WITH OBJECT :AddItem( aItems[n,1],, "Factura: " + ToString(aItems[n,2]) ) AS wItemListViewEND WithNext:Create()// Como tambien lo podemos llamar por AJAX recuperamos todos el código HTML y JS en una cadenacHtml := :FullHtml()end withRETURN cHtml//------------------------------------------------------------------------------// Esta es el metodo que es llamado por AJAXPROCEDURE FacturesAjaxChangePage()// El Listview nos envia en la llamada tres Parametros de su configuración que podemos// recuperar con oCgi:GetCgiValue// newpage := Próxima página a mostrar// cType := tipo de ListView// lTitleItem := Si se presenta el titulo de las lineas (cuidado devuelve 'true' o 'false')LOCAL nPagina := Val(oCgi:GetCgiValue("newpage", "1")) // Recuperamos la página a mostrar// Montamos el listview con los parametros recibidos y lo enviamos de respuestaoCgi:SendPage( FacturesBrowse(nPagina) )RETURN//------------------------------------------------------------------------------Un Saludo,
Xevi.
- Esta respuesta fue modificada 4 años, 1 mes por Xevi.
XeviParticipanteFunciona PERFECTO!!!
Gracias por tu tiempo.
La verdad, es que estoy realmente sorprendido de lo que con Néfele uno puede llegar a hacer, en pocas líneas!!!
Un Saludo,
Xevi.
XeviParticipanteBien, siguiendo con el Browse...
Me está funcionando correctamente con las indicaciones que me has dado, Pedro.
Un Browse, donde muestro un título, una linea de descripción y una imagen, en la que al "pinchar" en ella, me ejecuta una funcioncilla que lo que hace es mostrar un documento PDF, que previamente debo tener alojado en una ubicación accesible en htdocs/...
Hasta ahí bien!!!
Ahora más... lo que pretendo es, NO tener que duplicar estos archivos que ya dispongo en mi Servidor de mi aplicación de escritorio, sinó que si lo necesito, ir a buscar el archivo en el Servidor y copiarlo en la carpeta htdocs/download o htdocs/tmp para, seguidamente, mostrar el fichero
Muestro el código que tengo funcionando, cortito, pero sencillo para entenderlo...
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768#include "Xailer.ch"#include "Nefele.ch"PROCEDURE ProvaBrowse()Local n, aItems := {}//Cargamos datos en un Array que se mostraran en el Browse//Podríamos proveer de datos el Array desde cualquier consulta DBF o MariaDBAAdd( aItems, { 1, 20180, Date(), "202020180&d2ac1dad64a8b9074583ca4e672b4958ee3d9227" } )AAdd( aItems, { 2, 20181, Date(), "202020181&7101dc5caccff7c0cff55c813786b0c2b1c6f460" } )AAdd( aItems, { 3, 20182, Date(), "202020182&477b1d322a8373a0d53d99f0fa299ea3e0296676" } )With Object TWebPage():New()WITH OBJECT WListView():New(:WO):lTitleItem := .T.For n:=1 To Len(aItems)WITH OBJECT :AddItem( aItems[n,1],, "Factura: " + PadL(ToString(aItems[n,2]),5,"0") ) AS wItemListViewWITH OBJECT wLabel():New(:WO):aWidth := {11}:cText := "Data: " + DToC(aItems[n,3]):Create()END WITHPutImagen("/images/@Soft/PDFview.bmp", aItems[n,4], :WO)END WithNext:Create()END WithoCgi:SendPage( :Create() )End WithRETURN//------------------------------------------------------------------------------FUNCTION PutImagen( cImage, cPdf, oParent )LOCAL cSalidaWith Object WImage():New(oParent):lResponsive :=.T.:cImage := cImage:cCursor := "pointer"//Esto funciona correctamente SI el fichero lo tengo en la carpeta htdocs/download//Abro i muestro el fichero en otra pestaña.// :cOnClick := "#window.open( '/download/" + cPdf + ".pdf' )"//Pero lo que pretendo es ir a buscar el archivo en el Servidor que tengo mi aplicación de escritorio//Copiarlo en la carpeta htdocs/download o htdocs/tmp para, seguidamente, mostrar el fichero:aParams := {{ "cPdf", cPdf }}:cOnClick := "xCopyAndShow":Create()End WithRETURN NilPROCEDURE xCopyAndShow()Local cPdf := oCGI:GetCgiValue("cPdf","")//hasta aquí, funciona correctamente, se copia el fichero en la carpeta htdocs/downloadCopyFile( "\\Server10\c\XeviFTP\Factures\"+cPdf+".pdf", oCgi:GetEnv("DOCUMENT_ROOT")+"\download\"+cPdf+".pdf" )//Pero... no se muestra el documento, se muesta el script en una nueva ventanaoCGI:SendScript( Tag( "script", "window.open( '/download/" +cPdf+".pdf' )" ) )RETURNPero... como comento, no me muestra el documentp, sinó que me muestra el código script en una ventana nueva.
Que hago mal o que me falta ???
Gracias por vuestro tiempo.
Un Saludo,
Xevi.
XeviParticipantePedro,
funcionó perfecto!!!
Y sigo con ello...
Un Browse sencillito para ir haciendo pruebas.
Hay algun componente Néfele para hacer un HiperVínculo???
En una TWebPage puedo poner uno inyectando Html
123With Object TWebPage():New():lValign := .T.:AddHTML( [<a href="pdfdocs/factura00046.pdf" rel="nofollow">Visualitzar Factura 00046.pdf</a>] )Pero en el ejemplo no lo puedo incrustar en una línea de un registro.
123456789101112WITH OBJECT WListView():New(:WO):lTitleItem := .T.WITH OBJECT :AddItem( 46, , "Factura: 00046",) AS wItemListViewWITH OBJECT wLabel():New(:WO):cText := "Fecha: " + DToC(aItems[n,3]):Create()END WITH:AddHTML( [<a href="pdfdocs/factura00046.pdf" rel="nofollow">Visualitzar Factura 00046.pdf</a>] )END With...Un Saludo,
Xevi
XeviParticipanteSiguiendo más...
Estoy con el WListView, ya que no veo que con el WArrayBrowse se pueda hacer multilinea, collapsable...
Intentando el mismo efecto, mostrar una imagen y que ésta me envie a otra página.
Siempre con ejemplos sencillitos, pocas líneas e intentar entender.
12345678910111213141516171819202122232425262728293031PROCEDURE ProvaBrowse()With Object TWebPage():New():lValign := .T.WITH OBJECT WListView():New(:WO):cType := xc_Collapsible:lTitleItem := .T.WITH OBJECT :AddItem( "4", PutImagen("/images/@Soft/PDFview.bmp", "4"), AsciiHTML("Factura Núm."), {AsciiHTML("detalle")}) AS wItemListViewEND With:Create()END WithoCgi:SendPage( :Create() ) // Se crea el HTML final y se envía al navegador saliendo del ejecutable CGIEnd WithRETURN//------------------------------------------------------------------------------FUNCTION PutImagen( cImage, cId )LOCAL cSalidaWith Object WImage():New():lResponsive :=.T.:cImage := cImage:aParams := {{ "cId", cId }}:cOnClick := "VisParam":Create()cSalida := :FullHtml()End WithRETURN cSalidaFUNCIONA el click me envia a VisParam y recojo correctamente el parámetro,
PERO... no visualizo correctamente la imagen y añade un texto debajo de la imagen
Un Saludo,
Xevi
- Esta respuesta fue modificada 4 años, 1 mes por Xevi.
XeviParticipanteOtra cosa...
oCGI:SendCodefCookie("acceso","102",600,600,"2")
oCGI:Console( 'oCGI:GetCodefCookie("acceso") = ' + ToString(oCGI:GetCodefCookie("acceso")) )No devuelve el valor de la cookie
- Esta respuesta fue modificada 4 años, 1 mes por Alfredo Sanz.
XeviParticipanteAsí, pues... a corregir el WIKI!!!
https://nefele.dev/wiki/ocgi/sendcodefcookie
Otra cosa.
12oCGI:SendCodefCookie("acceso","102",600,600,"2")oCGI:Console( 'oCGI:GetCodefCookie("acceso") = ' + ToString(oCGI:GetCodefCookie("acceso")) )No obtengo el valor de la Cookie encriptada!!!
Un Saludo,
Xevi.
XeviParticipanteSiguiendo este hilo/ejemplo...
Intento hacer que el Browse reaccione SOLAMENTE al click de la imagen, por lo que añado :cOnClick al definir la imagen
123456789101112FUNCTION PutImagen( cImage )LOCAL cSalidaWith Object WImage():New():lResponsive :=.T.:cImage := cImage:cOnClick := "VisParam":Create()cSalida := :FullHtml()End WithRETURN cSalidaPero claro... no se en que registro estoy y como recuperar los parámetros de ese registro que he hecho click
Si al definir el Browse pongo :nIndexValue := 1 y :cOnClick := "VisParam" si me retorna el valor de la columna 1 del registro donde he hecho click, pero no es ese el efecto deseado... solo que actúe el OnClick al dar click a la imagen
Un Saludo,
Xevi
(Editado, no me ha dejado añadir un comentario más)
Bien, se me ocurre...
1234567891011121314151617181920//Añadir un identificador para recibirlo en PutImagen:AddRow( { PutImagen("https://sincarta.es/samples_images/aquarius.png", "1"), "Aquarius Naranja", 1.2} ):AddRow( { PutImagen("https://sincarta.es/samples_images/bifrutas.png", "2"), "Bifrutas", 1} ):AddRow( { PutImagen("https://sincarta.es/samples_images/cocacola.png", "3"), "Coca Cola Lata", 1} ):AddRow( { PutImagen("https://sincarta.es/samples_images/colacao.png", "4"), "Colacao", .9} )//Luego, en PutImagen, recibir ese parámetro y sobrecargar :aParamsFUNCTION PutImagen( cImage, cId )LOCAL cSalidaWith Object WImage():New():lResponsive :=.T.:cImage := cImage:aParams := {{ "cId", cId }}:cOnClick := "VisParam":Create()cSalida := :FullHtml()End WithRETURN cSalidaNo se si es la forma más correcta de proceder, pero...
Lo recibo correctamente en VisParam y puedo pues, de esta manera, hacer lo que sea ya con ese dato...
Un saludo,
Xevi
- Esta respuesta fue modificada 4 años, 1 mes por Xevi.
XeviParticipanteQuim,
no hago nada en especial... selecciono el icono <> para insertar código y hago un paste del texto que selecciono de mi prg mismo y le doy al boton añadir...
solo eso.
Un Saludo,
Xevi
123456ElseIf Upper(xcmUser()) == "XEVI":AddItem("Login Bootstrap","LoginBootstrap","lock", xc_SideNavOption):AddItem("ProvaAlert","ProvaAlert","message", xc_SideNavOption):AddItem("ProvaWMsgAlert","ProvaWMsgAlert","message", xc_SideNavOption)ElseXeviParticipanteSi, Quim... a eso me refería. Funciona bien, pero sale un mensaje en la Consola de depuración.
Un Saludo,
Xevi.
XeviParticipanteDaniel,
https://materializecss.com/color.html
Puedes poner el nombre del color white, black, purple lighten-2, indigo darken-3
o puedes poner el "codigo" de color #5e35b1, #ff4081
no necesariamente tienes que escoger un color de la paleta de colores de Materialize, puedes buscar un codigo y utilizarlo, también.
Un Saludo,
Xevi.
XeviParticipantesi incluyo :nAjaxPaginate := 30
12345678910111213141516171819Error en /@SoftEl siguiente error ha ocurrido: Argument errorATBASE 1108Arguments: [ 1] = Tipus: C Valor: / [ 2] = Tipus: U Valor: NILError code: 0Llamado desde AT(0)Llamado desde WARRAYBROWSE:CREATE(97)Llamado desde FITXERS(145)Llamado desde CLIENTS(55)Llamado desde (b)TCGI(55)Llamado desde TCGI:CLIENTS(0)Llamado desde __OBJSENDMSG(0)Llamado desde TCGI:RUN(1243)Llamado desde CGI_INIT(28)Llamado desde MAIN(16)Por favor, anote lo que estaba haciendo cuando este problema ocurrio, para poder identificarlo y corregirlo, gracias.XeviParticipanteFredy,
1 - Que chulo!!!
2 - Ok.
Muchas gracias.
un Saludo,
Xevi.
XeviParticipanteDos cosas...
en el primer video, no veo la forma de "lanzar" o crear ese acceso directo para que me abra el programa en modo ventana.
en el segundo video, cuando en el menu añado en pantalla de inicio, a mi no me pone el Icono que tengo en el Exe/Aplicación. Lo demás SI me funciona correctamente, pero no me pone el icono.
Un Saludo,
Xevi.
XeviParticipanteEmpiezo mi primer proyecto web... ahora creo que SI !!!
pues una de las cosas a tener de entrada, es poder saber quien se conecta y a qué le vas a dar acceso. A partir de ahí, a ver si puedo hacer crecer poco a poco la aplicación.
http://xevicomas.duckdns.org:8069/@Soft
Gracias al equipo Néfele!!!
Un Saludo,
Xevi.
XeviParticipanteFredy,
No iba mal encaminado, veo, buuuuffff!!!
Lo he probado también como <form>, y funciona correctamente en los dos.
Así para form
1234567891011121314151617181920212223242526WITH OBJECT TWebPage():New()WITH OBJECT WForm():New(:WO):cFunction := "xevi2":cAjaxBevel := "nflcargo"WITH OBJECT WEdit():New(:WO):cId := "valor1":cTitle := "Valor1":cHelp := "prueba con aaa o con cualquier otro valor":Create()END WITHWITH OBJECT WButton():New(:WO):cText := "Sin miedo, púlsame":lSubmit := .T.:Create()END WITH:Create()END WITHoCgi:SendPage( :Create() )END WITHGracias por tu tiempo.
Un Saludo,
Xevi.
XeviParticipanteEso, eso mismo!!!
XeviParticipanteFredy,
alguna manera de decirle que en lugar de depositar el ficherete en "descargas" se abra el diálogo de "guardar en..." y así poder seleccionar en que carpeta alojar el fichero y de paso el nombre de fichero a guardar ???
Gracias.
Un Saludo,
Xevi.
XeviParticipantealgo así... pero que me lanze el código... que así lo que hace es mostrarme el código por pantalla
123456789101112131415161718192021222324252627282930313233343536373839PROCEDURE Prueba()WITH OBJECT TWebPage():New()with object WEdit():New(:WO):cId := "valor1":cTitle := "Valor1":Create()end withWITH OBJECT WButton():New(:WO):aParams := { { "key", "#valor1" } }:cText := "Entrar":cOnClick := "Prueba2":lCenter := .T.:Create()END WITHoCgi:SendPage( :Create() )END WITHRETURN//------------------------------------------------------------------------------PROCEDURE Prueba2()Local cHtmlLocal cDato := oCGI:GetCgiValue("key","")oCgi:Console( oCgi:aParams )If cDato == "aaa"cHtml := Tag( "script", "window.location.href = '/miweb?miprocedure'" )oCGI:SendScript( cHtml )ElsecHtml := Tag("script", "alert('Dato NO encontrado')" )oCGI:SendScript( cHtml )EndIfRETURNUn Saludo,
Xevi.
XeviParticipanteEn la versión de Nefele 1.3 debes de quitar la lib wClassNefele del proyecto.
No se si será ese el error.
Un Saludo,
Xevi.
XeviParticipanteBien... un ejemplo lo mas sencillo que he podido, con Ajax que al cambiar contenido de un WEdit(), funciona correctamente ir a otro procedure/página o mensaje de alerta...
123456789101112131415161718192021222324252627282930313233#include "Xailer.ch"#include "Nefele.ch"PROCEDURE Prueba()WITH OBJECT TWebPage():New()with object WEdit():New(:WO):nTimeOut := 1:cAjaxTimeOut := "Prueba2":cTitle := "Valor1":Create()end withoCgi:SendPage( :Create() )END WITHRETURN//------------------------------------------------------------------------------PROCEDURE Prueba2()Local cHtmlLocal cDato := oCGI:GetCgiValue("key","")If cDato == "aaa"cHtml := Tag( "script", "window.location.href = '/miweb?miprocedure'" )oCGI:SendScript( cHtml )ElsecHtml := Tag("script", "alert('Dato NO encontrado')" )oCGI:SendScript( cHtml )EndIfRETURNAhora bien,
¿Cómo consigo esto mismo, pero que no sea al cambiar el contenido de un WEdit, sinó al pulsar un botón???
Osea, rellenar uno, dos WEdits, y otros datos si cabe, pero que no sea hasta pulsar el botón, donde compruebe uno o más de esos campos y ahí se decida si abrir otra página o mostra un mensaje de alerta y retornar donde estava.
Ahí estoy atorado.
Un Saludo,
Xevi.
XeviParticipante12345678910111213141516171819202122232425262728PROCEDURE DatosClte()LOCAL cDato := oCGI:GetCgiValue("key","")LOCAL aClientes := {{"123","Alfredo","Sanz","Pérez"},;{"456","Pedro","Amaro","Perdomo"},;{"789","Fernando","Martín","Regalde"}}LOCAL nIdx := HB_Ascan(aClientes,{|x| x[1]==cDato})LOCAL cHtmlif nIdx > 0cHtml := UpdateValues( aClientes[nIdx,2], aClientes[nIdx,3], aClientes[nIdx,4] )ELSEcHtml := UpdateValues( "", "", "" )IF Val(cDato) > 0cHtml := Tag("script", "alert('Dato no encontrado')" )/* WITH OBJECT WMsgAlert():New():cText := "Dato no encontrado":cType := "error":lModal := .T.:Create()cHtml += :fullhtml()END*/ELSEIF !Empty(cDato)cHtml := Tag("script","window.location.href='https://www.google.es/search?q="+cDato+"'")ENDIFENDIFoCGI:SendScript( cHtml )De esta manera SI lanza el mensaje alert()
Ahora lo que yo intento es que ese comportamiento lo haga al pulsar el botón, NO al modificar un campo...
Con eso voy a probar!!!
Gracias por tu tiempo
Un saludo,
Xevi.
XeviParticipanteFredy,
no funciona como muestras en el video.
el Alert "Dato no encontrado" no se visualiza nunca
SI se abre google con el texto en codigo clte si ése no és un valor numérico, pero si éste no lo localiza, no muestra mensaje.
Un Saludo,
Xevi.
XeviParticipanteNo se como hacerlo...
En mod_harbour, con un script (proceso de loguearse)
12345678910111213141516171819202122232425<script>$('#btn_login' ).click( Validate )function Validate() {var o = new Object()o[ 'action' ] = 'login'o[ 'user' ] = $( '#user' ).val()o[ 'psw' ] = $( '#psw' ).val()$.post( '/@Soft/autenticate', o ).done( function( data ) {if ( data.success )window.location.href = '/@Soft/'elsealert( 'Error autenticate' )})}$("input").keyup(function(event) {if (event.keyCode === 13) { Validate();}});</script>De ahí la inquietud de hacerlo con un script.
Miraré algun ejemplo de Ajax, a ver si aprendo un poco!!!
Un Saludo,
Xevi.
XeviParticipanteFredy,
Creo entender... la funcion decidir(), dependiendo del valor que le retorna la funcion aleatoria random(), si true o false muestra SI o NO.
Esta és mas o menos la idea.
Igual me explico mal, seguro...
Estoy revisando los ejemplos y no encuentro ninguno que sea el caso que busco.
Por ejemplo, tomando el formulario1, "Controles básicos"
Al pulsar el boton, lanzar mifuncion(), ejecutar código, (abrir una dbf, un array) localizar el nombre por ejemplo y si ése nombre lo localiza, solo en ese caso, pasar a la siguiente ventana (en ese caso VisParam)
en caso contrario, mostrar solamente un alert, por ejemplo, "Nombre no localizado" y quedarse en esa misma página.
Gracias por tu tiempo
Un saludo,
Xevi
XeviParticipanteGracias, Fredy,
Y, por pedir... seria muy difícil implementar en Néfele, algo así en un boton???
:cOnClick := "{|| If( mifuncion(), hazesto(), hazestootro() }"
XeviParticipanteEntiendo, creo, que debo de hacer o crear un script
Algo así... pero que al no saber java, no se como hacerlo
123456789<script>function mifuncion() {var mivar = $( '#valor1' ).val()if ( mivar = "SI" )window.location.href = '/@Soft'elsealert( 'NOnoNOnoNOnoNOno' )}</script>luego lo añado a la pagina
:aScript := { MemoRead( oCgi:GetEnv("DOCUMENT_ROOT") + "/miscript.script" ) }
Pero, el valor no lo "pilla" o no se que hago mal, que valor1 tenga el valor que tenga SIEMPRE me lanza window.location.href = '/@Soft'
Un Saludo,
Xevi.
XeviParticipanteSi, eso lo havia leido en el objeto oCgi, pero no encuentro nada más de como tratarla, tiempo de duración, parámetros que se le pueden enviar/recuperar...
De momento es con lo que estoy trabajando, gracias.
Gracias por el estupendo trabajo que estais haciendo. Sin duda, va a ser mi herramienta de trabajo ya para próximos pequeños proyectos. Me siento muy cómodo en este entorno, y con vuestro equipo, más aun.
Un Saludo,
Xevi
XeviParticipanteFredy,
al inspeccionar la página...
Visto
1:cCss := MemoRead( oCgi:GetEnv("DOCUMENT_ROOT") + "\css\login.css" )Te lo carga en la pagina, en la etiqueta <Style>
De la manera que indicas
1AAdd(:aHeadLinks, '<link rel="stylesheet" href="/css/login.css">')No es visible/accesible/manipulable (si más no, más difícil)
Gracias.
Un Saludo,
Xevi.
XeviParticipanteFredy,
Gracias por todas las explicaciones que das.
el ejemplo https://fractality.ddns.net:44444/xacgi?pruebasfredy se ve espectacular!!!Habria manera de poder mostrar más código que teneis hecho, como ejemplo, para ir trasteando. no para hacer nada un poco serio, pero si para poder ir avanzando y aprendiendo.
Gracias por vuestro tiempo.
Un Saludo,
Xevi.
XeviParticipanteMe respondo a mi mismo...
:cCss := MemoRead( oCgi:GetEnv("DOCUMENT_ROOT") + "\css\login.css" )
Un Saludo,
Xevi.
XeviParticipantePerfecto!!!
Pues si, entrava en conflicto y habia algun control, como WEdit que me hacía una mezcla.
Desactivando materialize y a Ok. aunque, no estará de mas probar mezclas, hacer un mix... de eso se va trantando de momento.
Por cierto, añado estilo css con
1:cCss += "#myrebar_logo > img { margin-top: 6px; height: 70% !important;}"o
12345:cCss += "#logo {"+;"height: 50px;"+;"margin-left: -54px;"+;"margin-top: -59px;"+;"}"pero ¿es posible cargar un fichero css ???
Un Saludo,
Xevi.
XeviParticipanteBien, como de pruebas se trata el tema, a parte de ir aprendiendo alguna cosilla...
Néfele me está enganchando, y eso que entiendo poco de programación!!!
Estaba trasteando y me digo... se podrá reutilizar un poco del código que tengo de pruebas de mod_harbour. Utiliza bootstrap en lugar de materialize, pero me digo, vamos a probar.
bootstrap inyectando directamente código por html :AddHTML( cHtml )
Estoy bastante contento con el resultado.
http://xevicomas.duckdns.org:8069/cgi-bin/provanefele.exe?login
Un Saludo,
Xevi.
-
AutorEntradas