Hola , es mi primera incursion en gambas y necesito mas que una soga un bote salvavidas.
1) como hago para definir un registro de largo fijo como en VB5
ej
type mireg
nombre as string * 50
apellido as string * 50
global regi as mireg
'para cargar todo el registro y guardar todo el registro desde una sola variable
2) como bajo una pagina desde internet para leerlo en forma de texto.
quiero bajar por ejemplo www.dolarhoy
leer la pagina guardada y encontrar una cadena determinada.
Estoy usando gambas 2.16
Desde ya muchas gracias
renovarse es vivir
Registro Con Campos Definidos
Objetivo: Re: Registro Con Campos Definidos
última edición por shordi el Martes, 17 Noviembre 2009, 18:05; editado 1 vez
Un error y la respuesta de abajo se me duplica... excuse me.
última edición por shordi el Martes, 17 Noviembre 2009, 18:05; editado 1 vez
Objetivo: Re: Registro Con Campos Definidos
última edición por shordi el Martes, 17 Noviembre 2009, 18:04; editado 1 vez
En lo relativo al tipo de dato, puedes crear un nuevo archivo de clase llamado persona, por ejemplo, que contenga:
Luego en tu código, formulario o módulo creas una instancia de esa clase y alimentas las propiedades de la instacia
También puedes crear métodos constructores en tu clase (_new) que te alimenten valores por defecto, longitudes, etc.
En lo relativo al fichero de internet, descárgalo con el comando externo wget y luego lo cargas en un string y buscas, dentro de gambas, o buscas con comandos externos como grep, y sólo cargas en gambas el resultado. Las posibilidades son muchas.
Luego en tu código, formulario o módulo creas una instancia de esa clase y alimentas las propiedades de la instacia
También puedes crear métodos constructores en tu clase (_new) que te alimenten valores por defecto, longitudes, etc.
En lo relativo al fichero de internet, descárgalo con el comando externo wget y luego lo cargas en un string y buscas, dentro de gambas, o buscas con comandos externos como grep, y sólo cargas en gambas el resultado. Las posibilidades son muchas.
última edición por shordi el Martes, 17 Noviembre 2009, 18:04; editado 1 vez
Objetivo: Re: Registro Con Campos Definidos
Mira este código:
PRIVATE _downloadAsyncKey AS NEW HttpClient AS "_DownloadKey"
PRIVATE _downloadAsyncData AS NEW HttpClient AS "_DownloadData"
PRIVATE downloadBufferKey AS String
PRIVATE downloadBufferData AS String
PRIVATE csgn AS String
'****PROPERTIES******
PRIVATE $qerror AS String
PRIVATE $qcall AS String
PRIVATE $fname AS String
PRIVATE $name AS String
PRIVATE $addr1 AS String
PRIVATE $addr2 AS String
PRIVATE $country AS String
PRIVATE $state AS String
PRIVATE $grid AS String
PRIVATE $county AS String
PRIVATE $qslmgr AS String
PRIVATE $email AS String
PROPERTY READ qcall AS String
PROPERTY READ name AS String
PROPERTY READ fname AS String
PROPERTY READ qerror AS String
PROPERTY READ addr1 AS String
PROPERTY READ addr2 AS String
PROPERTY READ country AS String
PROPERTY READ state AS String
PROPERTY READ grid AS String
PROPERTY READ county AS String
PROPERTY READ qslmgr AS String
PROPERTY READ email AS String
'*************** QRZ.com Web method ***************
PRIVATE _download AS NEW HttpClient AS "Download"
PRIVATE downloadBuffer AS String
PRIVATE $finished AS Boolean = TRUE
PUBLIC SUB getQRZcomWeb(URL AS String)
downloadBuffer = ""
IF $finished = TRUE THEN
_download.Async = TRUE
_download.TimeOut = 5
_download.URL = URL
_download.Get()
ENDIF
END
PUBLIC SUB Download_Read()
DIM buffer AS String
$finished = FALSE
READ #LAST, buffer, Lof(LAST)
downloadBuffer &= buffer
END
PUBLIC SUB Download_Error()
_download.Close
DEBUG "Error downloading " & _download.Status
END
PUBLIC SUB Download_Finished()
extractData(downloadBuffer)
$finished = TRUE
FMain.updateFields()
END
PRIVATE FUNCTION stripField(s AS String) AS String
IF s THEN
s = Trim(s)
s = Mid(s, InStr(s, "p>") + 2, InStr(s, "</") - (InStr(s, "p>") + 2))
ENDIF
RETURN s
END
PUBLIC SUB extractData(S AS String)
DIM calldata, callsign, id AS String
DIM regex AS Regexp
DIM i, j AS Integer
DIM sArr AS NEW String[]
IF InStr(S, "<!-- begin calldata") THEN
i = InStr(S, ")\">")
j = InStr(S, "style=\"margin-top:1.5em;")
IF j > i THEN calldata = Mid(S, i, (j - i))
sArr = Split(calldata, "\n", "", TRUE)
callsign = Replace(sArr[0], ")\"", "p", 1) 'to match stripField() function
$qcall = stripField(callsign)
$fname = stripField(sArr[1])
$addr1 = stripField(sArr[2])
$addr2 = stripField(sArr[3])
$country = stripField(sArr[4])
sArr.Clear
ELSE
$qcall = ("Not Found")
ENDIF
IF InStr(S, "Info:") THEN $qslmgr = stripField(Upper(Mid(S, InStr(S, "Info:") + 24)))
IF InStr(S, "Square:") THEN $grid = Upper(Mid(S, InStr(S, "Square:") + 27, 6))
CATCH
Message.Error(Error.Text & "\n" & Error.Where)
END
'**********PROPERTY METHODS***************
PRIVATE FUNCTION name_Read() AS String
RETURN $name
END
PRIVATE FUNCTION fname_Read() AS String
RETURN $fname
END
PRIVATE FUNCTION qerror_Read() AS String
RETURN $qerror
END
PRIVATE FUNCTION addr1_Read() AS String
RETURN $addr1
END
PRIVATE FUNCTION addr2_Read() AS String
RETURN $addr2
END
PRIVATE FUNCTION state_Read() AS String
RETURN $state
END
PRIVATE FUNCTION grid_Read() AS String
RETURN Upper($grid)
END
PRIVATE FUNCTION county_Read() AS String
RETURN $county
END
PRIVATE FUNCTION qslmgr_Read() AS String
RETURN Upper($qslmgr)
END
PRIVATE FUNCTION email_Read() AS String
RETURN Lower($email)
END
PRIVATE FUNCTION qcall_Read() AS String
RETURN Upper($qcall)
END
PRIVATE FUNCTION country_Read() AS String
RETURN $country
END
El código completo incluyendo otro método específico para XML lo puedes ver aquí: http://dfhlog.googlecode.com/svn/trunk/QRZ.class
Lo que hago es usar el método asíncrono para descargar una página (la ventaja es que de esta forma, la página se baja por trozos, impidiendo la congelación de la GUI ) y luego es procesada para extraer los datos de interés.
Espero que te sirva, cualquier duda estaré encantado de ayudarte.
Eduardo escribió: [Ver mensaje]
Mira este código:
PRIVATE _downloadAsyncKey AS NEW HttpClient AS "_DownloadKey"
PRIVATE _downloadAsyncData AS NEW HttpClient AS "_DownloadData"
PRIVATE downloadBufferKey AS String
PRIVATE downloadBufferData AS String
PRIVATE csgn AS String
'****PROPERTIES******
PRIVATE $qerror AS String
PRIVATE $qcall AS String
PRIVATE $fname AS String
PRIVATE $name AS String
PRIVATE $addr1 AS String
PRIVATE $addr2 AS String
PRIVATE $country AS String
PRIVATE $state AS String
PRIVATE $grid AS String
PRIVATE $county AS String
PRIVATE $qslmgr AS String
PRIVATE $email AS String
PROPERTY READ qcall AS String
PROPERTY READ name AS String
PROPERTY READ fname AS String
PROPERTY READ qerror AS String
PROPERTY READ addr1 AS String
PROPERTY READ addr2 AS String
PROPERTY READ country AS String
PROPERTY READ state AS String
PROPERTY READ grid AS String
PROPERTY READ county AS String
PROPERTY READ qslmgr AS String
PROPERTY READ email AS String
'*************** QRZ.com Web method ***************
PRIVATE _download AS NEW HttpClient AS "Download"
PRIVATE downloadBuffer AS String
PRIVATE $finished AS Boolean = TRUE
PUBLIC SUB getQRZcomWeb(URL AS String)
downloadBuffer = ""
IF $finished = TRUE THEN
_download.Async = TRUE
_download.TimeOut = 5
_download.URL = URL
_download.Get()
ENDIF
END
PUBLIC SUB Download_Read()
DIM buffer AS String
$finished = FALSE
READ #LAST, buffer, Lof(LAST)
downloadBuffer &= buffer
END
PUBLIC SUB Download_Error()
_download.Close
DEBUG "Error downloading " & _download.Status
END
PUBLIC SUB Download_Finished()
extractData(downloadBuffer)
$finished = TRUE
FMain.updateFields()
END
PRIVATE FUNCTION stripField(s AS String) AS String
IF s THEN
s = Trim(s)
s = Mid(s, InStr(s, "p>") + 2, InStr(s, "</") - (InStr(s, "p>") + 2))
ENDIF
RETURN s
END
PUBLIC SUB extractData(S AS String)
DIM calldata, callsign, id AS String
DIM regex AS Regexp
DIM i, j AS Integer
DIM sArr AS NEW String[]
IF InStr(S, "<!-- begin calldata") THEN
i = InStr(S, ")\">")
j = InStr(S, "style=\"margin-top:1.5em;")
IF j > i THEN calldata = Mid(S, i, (j - i))
sArr = Split(calldata, "\n", "", TRUE)
callsign = Replace(sArr[0], ")\"", "p", 1) 'to match stripField() function
$qcall = stripField(callsign)
$fname = stripField(sArr[1])
$addr1 = stripField(sArr[2])
$addr2 = stripField(sArr[3])
$country = stripField(sArr[4])
sArr.Clear
ELSE
$qcall = ("Not Found")
ENDIF
IF InStr(S, "Info:") THEN $qslmgr = stripField(Upper(Mid(S, InStr(S, "Info:") + 24)))
IF InStr(S, "Square:") THEN $grid = Upper(Mid(S, InStr(S, "Square:") + 27, 6))
CATCH
Message.Error(Error.Text & "\n" & Error.Where)
END
'**********PROPERTY METHODS***************
PRIVATE FUNCTION name_Read() AS String
RETURN $name
END
PRIVATE FUNCTION fname_Read() AS String
RETURN $fname
END
PRIVATE FUNCTION qerror_Read() AS String
RETURN $qerror
END
PRIVATE FUNCTION addr1_Read() AS String
RETURN $addr1
END
PRIVATE FUNCTION addr2_Read() AS String
RETURN $addr2
END
PRIVATE FUNCTION state_Read() AS String
RETURN $state
END
PRIVATE FUNCTION grid_Read() AS String
RETURN Upper($grid)
END
PRIVATE FUNCTION county_Read() AS String
RETURN $county
END
PRIVATE FUNCTION qslmgr_Read() AS String
RETURN Upper($qslmgr)
END
PRIVATE FUNCTION email_Read() AS String
RETURN Lower($email)
END
PRIVATE FUNCTION qcall_Read() AS String
RETURN Upper($qcall)
END
PRIVATE FUNCTION country_Read() AS String
RETURN $country
END
El código completo incluyendo otro método específico para XML lo puedes ver aquí: http://dfhlog.googlecode.com/svn/trunk/QRZ.class
Lo que hago es usar el método asíncrono para descargar una página (la ventaja es que de esta forma, la página se baja por trozos, impidiendo la congelación de la GUI ) y luego es procesada para extraer los datos de interés.
Espero que te sirva, cualquier duda estaré encantado de ayudarte.
Objetivo: Re: Registro Con Campos Definidos
Gracias por las respuestas y la rapidez
Voy a revisarlas , estudiarlas, comprenderlas y luego les cuento.
Que dificil se hace perder los vicios.
Amplio un poquito, entonces si tengo que guardar todo mi registro de persona en un archivo solo me basta abrirlo para escritura hacer un print Persona y cerrarlo? o tengo que concatenar per.nombre & per.apellido?
Sigo en la lucha
Voy a revisarlas , estudiarlas, comprenderlas y luego les cuento.
Que dificil se hace perder los vicios.
Amplio un poquito, entonces si tengo que guardar todo mi registro de persona en un archivo solo me basta abrirlo para escritura hacer un print Persona y cerrarlo? o tengo que concatenar per.nombre & per.apellido?
Sigo en la lucha
Objetivo: Re: Registro Con Campos Definidos
Pues tendrás que concatenarlo, supongo, que una clase es, básicamente, una colección de punteros y no será imprimible de una... pero no lo he probado nunca.
Prueba y nos cuentas.
Prueba y nos cuentas.
Objetivo: Re: Registro Con Campos Definidos
Tendrás que poner print per.nombre y luego print per.apellido. No puedes poner print per.
Pero eso es igual en vb.
Tendrás que poner print per.nombre y luego print per.apellido. No puedes poner print per.
Pero eso es igual en vb.
Objetivo: Re: Registro Con Campos Definidos
Empezare probando
Son dos los temas por ahora, pero primero tengo que resolver el de base de datos en archivo texto con largo fijo
Soplo en Vb con utilizar Put regi , es suficiente pq engloba todos lo registros (Fijate en mi ejemplo).
Si hay que concatenar se podria hacer una funcion que devuelva el largo del registro ya concatenado habiendole pasado cada uno de los campos ( no haria falta pasar las variables como parametros pq podrian ser publicas y ya estar cargadas)
Algo asi
Public function concatenonombres as string
returns ( v1 & v2& v3........)
end
entonces al guardar solo me quedaria
Print concatenonombres
Que opinan?
Me estan haciendo pensar..... Eso es bueno y me gusta.... El facilismo oxida
Son dos los temas por ahora, pero primero tengo que resolver el de base de datos en archivo texto con largo fijo
Soplo en Vb con utilizar Put regi , es suficiente pq engloba todos lo registros (Fijate en mi ejemplo).
Si hay que concatenar se podria hacer una funcion que devuelva el largo del registro ya concatenado habiendole pasado cada uno de los campos ( no haria falta pasar las variables como parametros pq podrian ser publicas y ya estar cargadas)
Algo asi
Public function concatenonombres as string
returns ( v1 & v2& v3........)
end
entonces al guardar solo me quedaria
Print concatenonombres
Que opinan?
Me estan haciendo pensar..... Eso es bueno y me gusta.... El facilismo oxida
Objetivo: Re: Registro Con Campos Definidos
Si hay que concatenar se podria hacer una funcion que devuelva el largo del registro ya concatenado habiendole pasado cada uno de los campos
Exactamente esa es la solución adecuada, salvo que no tienes que pasar cada variable. Puedes pasar la clase entera
Dato=concatenar(per)
Un saludo
Exactamente esa es la solución adecuada, salvo que no tienes que pasar cada variable. Puedes pasar la clase entera
Dato=concatenar(per)
Un saludo
Objetivo: Re: Registro Con Campos Definidos
Soplo
Si per es Publica , no necesitaria siquiera pasarla porque ya esta en memoria o me equivoco
Si per es Publica , no necesitaria siquiera pasarla porque ya esta en memoria o me equivoco
Página 1 de 2
No puede crear mensajesNo puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario
Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.
Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo
Página generada en:: 0.5341s (PHP: -37% SQL: 137%)
Consultas SQL: 25 - Debug off - GZIP Activado