Mode Martínez Palenzuela - 11-03-2007 16:41:47 | Categoria:
General
El 3en1 más bonito que se ha diseñado jamás: el iPhone.
Hace unas semanas
Steve Jobs, el gurú de
Apple, nos deleitó en la
Macworld con la presentación del último invento tecnológico de la empresa de la manzana. El
3en1 más bonito que se ha diseñado jamás: el
iPhone. Para caldear el ambiente anunció que iba a presentar tres novedades en la feria tecnológica de Mac: un teléfono móvil, una TabletMac y un nuevo iPod. Pero dejó boquiabiertos a los presentes y a los fans de Apple de todo el mundo cuando mostró su nuevo
gadget: el iPhone, que combina estos tres dispositivos en uno y todo bajo la supervisión del Sistema Operativo Mac OS X (sí, sí, el mismo S.O. de los Mac’s), lo que supone una garantía de un perfecto funcionamiento bajo un diseño espectacular.
Leer +
Anotación por Mode Martínez Palenzuela a las
16:41:47
|
Comentarios (0)
Guardado en la categoría
General
|
Referencias (0)
Mode Martínez Palenzuela - 13-10-2006 20:19:21 | Categoria:
Flash
Si tenemos la última versión del reproductor de Macromedia, el famoso flash Player, comprobaremos que los links hechos con
getURL() que antes nos funcionaban han dejado de hacerlo. Esto es así por las nuevas medida de seguridad que ha insertado Adobe en el reproductor. Al parecer un usuario malintencionado se podía infiltrar en nuestro ordenador a través de un archivo swf. Pero claro, muchos menús animados están hechos en Flash, y esta medida nos deja "
con las patas colgando".
Hay una manera de solucionarlo y es añadiendo el tag
<param name="allowScriptAccess" value="always"> al tag
<object> con el objeto de que se permita la ejecución de ActionScript hacia fuera. Pero ojo, si sólo añadimos este tag la cosa no va a funcionar. Además debemos añadir el mismo atributo al tag
<embed> . Para que lo veais más claro echadle un vistazo a este código:
En vez de "always" podemos utilizar "sameDomain" para restringir el funcionamiento de getURL a películas cargadas desde el mismo sitio. Aunque "always" nos asegura el funcionamiento casi en todo caso, la seguridad puede resentirse.
Anotación por Mode Martínez Palenzuela a las
20:19:21
|
Comentarios (0)
Guardado en la categoría
Flash
|
Referencias (0)
Mode Martínez Palenzuela - 05-09-2006 13:40:44 | Categoria:
General
Estuvimos de Vacaciones y ... convalencientes.
Os pido disculpas a aquellos que habeis solicitado ayuda en esta bitácora durante el mes de Agosto y no habeis recibido respuesta, pero además de que estaba supuestamente de vacaciones tuve un problemilla con la moto y no estaba cómodo tecleando con el brazo escayolado

Pero bueno, ya sin escayola y poniéndome las pilas para volver a empezar, esta vez en mi ciudad, espero ir resolviendo cuestiones y de esa manera poder aprender más junto con vosotros.
Anotación por Mode Martínez Palenzuela a las
13:40:44
|
Comentarios (5)
Guardado en la categoría
General
|
Referencias (0)
Mode Martínez Palenzuela - 13-07-2006 12:16:29 | Categoria:
.NET
Definimos nuestros propios comandos de ataque a la BD.
Cuando usamos un
DataSet que maneja sólo una tabla, los comandos para realizar las inserciones, eliminaciones y actualizaciones de la base de datos podemos generarlos directamente con
CommandBuilder. Por ejemplo, para una Base de Datos SQL haríamos:
Private comandos As SQLCommandBuilder(miAdaptador)
Siendo
miAdaptador un objeto instanciado de la clase SQLAdapter (podemos comprobar la sentencia que genera VB accediendo a la propiedad
CommandText de los distintos comandos:
MsgBox(comandos.InsertCommand.CommandText)
MsgBox(comandos.UpdateCommand.CommandText)
MsgBox(comandos.DeleteCommand.CommandText)
Pero si vamos a manejar más de una tabla en el DataSet comprobaremos que al intentar realizar alguna de las operaciones anteriores obtenemos un error. Esto es así porque los comandos generados automáticamente con
CommandBuilder sólo afectan a una tabla. En el caso de manejar más de una tabla tenemos que especificar obligatoriamente los comandos correspondientes. Por ejemplo, para una BD Access:
Private cmdINSERT As OleDbCommand
Private cmdUPDATE As OleDbCommand
Private cmdDELETE As OLEDBCommand
…
cmdINSERT = New OleDbCommand(“INSERT INTO Socios (IdSocio, Nombre, Telefono) _
VALUES (?,?,?)”, miConexion)
cmdUPDATE = New OleDbCommand(“UPDATE Socios SET Socios.Nombre=?, _
Socios.Telefono=? WHERE IdSocio=?”, miConexion)
cmdDELETE = New OleDbCommand(“DELETE * FROM Socios WHERE IdSocio=?”, miConexion)
Donde los caracteres “?” representan los parámetros que se le pasan a los comandos (
si la BD es SQL Server deberemos sustituir estos caracteres por el carácter “@”). Cuando demos orden de ejectuar alguno de estos comandos, VB sustituirá estos parámetros con los valores correspondientes que nosotros le suministraremos. Por ejemplo, para el comando de inserción:
cmdINSERT.Parameters.Add(New OleDbParameter(“IdSocio”, txtCodigoSocio))
cmdINSERT.Parameters.Add(New OleDbParameter(“Nombre”, txtNombre))
cmdINSERT.Parameters.Add(New OleDbParameter(“Telefono”, txtTelefono))
Teniendo en cuenta que
txtCodigoSocio, txtNombre y txtTelefono son cuadros de texto con los valores correspondientes.
Ahora sólo nos queda ejecutar el comando:
cmdINSERT.ExecuteNonQuery()
El método
ExecuteNonQuery() se utiliza para ejecutar un comando SQL sobre una base de datos siempre que dicho comando no devuelva como resultado un conjunto de filas. Es decir, para realizar una acción concreta que no genera información de salida, como es el caso de una inserción, una actualización o una eliminación. Si queremos ejecutar un comando que nos devuelva una o más filas afectadas (por ejemplo una consulta) deberemos utilizar
ExecuteReader() , que devuelve un objeto
DataReader.
Ejemplo con SQL en un mantenimiento tipo:
Partimos de:
conn.ConnectionString = cadConn
miAdaptador = New OleDbDataAdapter("SELECT * FROM SOCIOS INNER JOIN CARGOS ON _
SOCIOS.IDCARGO=CARGOS.CODCARGO ORDER BY codigo", cadConn)
miAdaptadorCargos = New OleDbDataAdapter("SELECT * FROM CARGOS ORDER BY_
codCargo", cadConn)
Creamos los comandos:
insertCommand = New OleDbCommand("INSERT INTO Socios (codigo, dni, nombre, _
direccion, poblacion, IdCargo) VALUES (@CLAVE, @DNI, @NOM, @DIR, @POB, @CAR)", conn)
deleteCommand = New OleDbCommand("DELETE * FROM Socios WHERE_
codigo = @CLAVE", conn)
updateCommand = New OleDbCommand("UPDATE Socios SET nombre=@NOM, dni=@DNI, _
direccion=@DIR, poblacion=@POB, IdCargo=@CAR WHERE codigo=@CLAVE", conn)
Definimos los parámetros:
deleteCommand.Parameters.Add(New SqlParameter("@CLAVE", OleDbType.BigInt))
With insertCommand.Parameters
.Add(New OleDbParameter("@CLAVE", SqlType.BigInt))
.Add(New OleDbParameter("@DNI", SqlType.Char))
.Add(New OleDbParameter("@NOM", SqlType.Char))
.Add(New OleDbParameter("@DIR", SqlType.Char))
.Add(New OleDbParameter("@POB", SqlType.Char))
.Add(New OleDbParameter("@CAR", SqlType.BigInt))
End With
With updateCommand.Parameters
.Add(New OleDbParameter("@CLAVE", SqlType.BigInt))
.Add(New OleDbParameter("@DNI", SqlType.Char))
.Add(New OleDbParameter("@NOM", SqlType.Char))
.Add(New OleDbParameter("@DIR", SqlType.Char))
.Add(New OleDbParameter("@POB", SqlType.Char))
.Add(New OleDbParameter("@CAR", SqlType.BigInt))
End With
Asignamos valor a los parámetros (en el caso de una inserción):
With insertCommand.Parameters
.Item("@CLAVE").Value = CInt(txtCodigo.Text)
.Item("@DNI").Value = txtDNI.Text
.Item("@NOM").Value = txtNombre.Text
.Item("@DIR").Value = txtDireccion.Text
.Item("@POB").Value = txtPoblacion.Text
.Item("@CAR").Value = cmbCargos.SelectedIndex + 1
End With
Ejecutamos el comando:
insertCommand.ExecuteNonQuery()
Anotación por Mode Martínez Palenzuela a las
12:16:29
|
Comentarios (0)
Guardado en la categoría
.NET
|
Referencias (0)
Mode Martínez Palenzuela - 13-07-2006 12:13:00 | Categoria:
.NET
Campos Imagen y Controles PictureBox.
Podemos utilizar dos caminos diferentes para incorporar imágenes a nuestros registros. Uno de ellos es definir un campo cadena que almacenará la ruta donde se encuentra la imagen y el otro es, directamente grabar la imagen en la base de datos como una cadena binaria. Elegiremos uno u otro en base a nuestras necesidades y al proveedor de datos utilizado, ya que no todos poseen un tipo de campo que permita almacenar imágenes.
Almacenando la ruta en la base de datos.
Es el método más sencillo. Basta con almacenar en el campo correspondiente de la Tabla una cadena con la ruta a visualizar y usar el método
FromFile() del objeto
Image para cargar la imagen correspondiente en un
PictureBox. De esta forma el tamaño de la base de datos no crece de forma exponencial, pero a cambio
nos obliga a tener todas las imágenes perfectamente organizadas y a transportarlas junto con nuestro proyecto. Además, si algún usuario elimina por error una imagen de la carpeta correspondiente, la aplicación no podrá mostrarla y se generará una excepción que deberemos tener en cuenta.
Recuperar la imagen de la Base de Datos.
Suponiendo un
DataSet y una variable
posRegistro que apunta al registro actual.
‘ Acceder a la fila correspondiente
Dim registro as DataRow
registro = miTabla.Rows(posRegistro)
‘ Comprobar que contiene una ruta
if registro(“Foto” ) <> “” then
‘ Cargamos la foto en el PictureBox
PictureBox1.Image = Image.FromFile(registro(“Foto” ))
End If
Asignar una imagen desde archivo.
En el evento Click del PictureBox o de un botón de comando:
‘ Especificar parámetros para el cuadro de diálogo
dlgAbrir.InitialDirectory = “ C:\Documents And Settings\Admin\Mis Documentos\Mis Imágenes”
‘ Invocar al cuadro de diálogo
dlgAbrir.ShowDialog()
‘ Comprobar que se ha elegido un archivo y no se ha pulsado el botón Cancelar
if dlgAbrir.FileName <> “dlgAbrir” then
‘ Cargar la imagen del archivo en el PictureBox
PictureBox1.Image = Image.FromFile(dlgAbrir.FileName)
‘ Asignarla a la columna correspondiente en la Tabla
Registro(“Foto” ) = dlgAbrir.FileName
Else
Msgbox (“No ha seleccionado un nombre de archivo válido…” )
End If
Almacenando la imagen en la base de datos.
Casi todos los RDBMS cuentan con algún tipo de columna que facilita el almacenamiento de imágenes, pero su enlace y tratamiento en aplicaciones no es tan fácil como cabría esperar. SQL Server, por ejemplo, cuenta con un tipo Image pero no tiene correspondencia con ningún tipo de la plataforma .NET y ni siquiera puede enlazarse directamente a un control
PictureBox. El tipo más parecido en la plataforma es
base64binary. Cuando creamos una columna tipo
Image en SQL Server es conveniente permitir que admita nulos para evitar determinado tipo de errores en el caso de que uno de valores de la columna no haya sido asignado.
Recuperar la imagen de la Base de Datos.
En primer lugar necesitamos saber cuál es la fila actual de datos que está mostrándose y posteriormente comprobar si la columna con la imagen tiene un valor nulo o no. Si no es nulo significará que existe una imagen, pero no podemos mostrarla directamente porque el tipo de dato Image no es compatible con el que admite un control PictureBox.
Por ello hay que crear un flujo de datos en memoria, es decir, un objeto
MemoryStream, que contenga la secuencia de bytes alojada en el campo imagen. Una vez hecho esto podemos usar el método
FromStream() de la clase
Image para mostrarla en el PictureBox.
Por el contrario, si el valor de la columna es nulo deberemos eliminar el contenido actual del PictureBox, para que refleje la situación de la fila actual.
Para hacer todo esto podemos aprovechar el método
PositionChanged() que es invocado por todos los métodos que causan una actualización de los datos.
Private Sub objdsLibros_PositionChanged()
Me.lblNavLocation.Text = (((Me.BindingContext(objdsLibros, “Libros” ).Position+1)._
ToString + “ de “ + Me.BindingContext(obdjdsLibros,”Libros” ).Count.ToString)
Dim posicion = BindingContext(objdsLibros, “Libros” ).Position
If Not obdjsLibros.Libros(Posicion).IsPortadaNull then
‘ Creamos un MemoryStream
Dim Imagen As New MemoryStream(obdjsLibros.Libros(BindingContext(obdjsLibros,_
“Libros” ).Position).Portada)
‘ Introducimos la imagen en el PictureBox
PictureBox1.Image = Imagen.FromStream(Imagen)
Else
‘ Limpiamos
PictureBox1.CreateGraphics().Clear(Color.Black)
End If
End Sub
Asignar una imagen desde archivo.
El evento Click del PictureBox o de un botón de comando que pongamos debajo del mismo nos puede sevir para especificar el código para cargar la imagen desde un archivo ayudándonos de un control cuadro de diálogo.
Podemos usar el método
FromFile() de la clase Image para recuperar la imagen de un archivo y mostrarla en el PictureBox. Los
DataColumn no disponen de un método similar, por lo que tendremos que recuperar la imagen en memoria como secuencia de bytes y luego asignarla a la propiedad
Image del PictureBox.
Private Sub PictureBox1_Click (….) …
‘ Abrimos el cuadro de diálogo de selección de archivo y si se elige uno …
if OpenFileDialog1.ShowDialog() = DialogResult.Ok then
‘Mostramos
PictureBox1.Image= Image.FromFile(OpenFileDialog1.FileName)
‘Creamos un FileStream para recuperar la imagen en memoria …
Dim Img As NewFileStream(OpenFileDialog1.FileName, FileMode.Open, FileAcces.Read)
‘ … en un array de bytes
Dim Imagen (Img.Length) As Byte
‘ Leemos
Img.Read(Imagen, 0, Img.Length)
Img.Close
‘ Asignamos
obdjsLibros.Libros(Me.BindingContext(obdjsLibros, “Libros” ).Position).Portada=Imagen
End If
End Sub
PLEASE REPORT BUGS
Anotación por Mode Martínez Palenzuela a las
12:13:00
|
Comentarios (0)
Guardado en la categoría
.NET
|
Referencias (0)
Mode Martínez Palenzuela - 02-07-2006 12:37:20 | Categoria:
Ajax
Una nueva manera de ver la web con Ajax (Asynchronous JavaScript+XML)Su nombre evoca a los antiguos héroes griegos, a un equipo de fútbol e incluso puede que a un detergente. Pero Ajax no es nada de eso en el mundo de la red de redes, sino la unión de varias tecnologías ya existentes a las que, juntas, se les ha encontrado nuevas aplicaciones. No es una tecnología en sí mismo, sino el uso conjunto de XHTML, CSS, DOM (Document Object Model), XML, XSLT y JavaScript.
Con Ajax se consigue intercambiar datos con el servidor de forma asíncrona, sin que se vea afectada la interacción con el usuario. Este asincronismo consigue separar la interacción del usuario de la aplicación, creando una capa intermedia escrita en JavaScript, entre éste y el servidor. Esta capa se encarga de mostrar la interfaz y comunicarse con el servidor. Es decir, con Ajax no existe comunicación directa entre el usuario y el servidor, que es lo que ocurre con las webs convencionales. Esto posibilita que JavaScript pueda hacer peticiones al servidor remoto sin que se tenga que recargar la página. Es decir, se pueden realizar peticiones y recibir respuestas a través de HTTP sin que el usuario perciba interrupción alguna. Nada más y nada menos...a partir de ahí se abre todo un nuevo abanico de posibilidades.
Existe un magnífico artículo en inglés de
J.J. Garrett, que es quien acuñó el término Ajax, así que más que él no sabrá nadie. Puedes acceder a él clicando
aquí.
Anotación por Mode Martínez Palenzuela a las
12:37:20
|
Comentarios (0)
Guardado en la categoría
Ajax
|
Referencias (0)
Mode Martínez Palenzuela - 21-06-2006 14:00:03 | Categoria:
Flash
¿Cómo puedo mandar una variable a una película flash?
Pues hay varias formas de hacerlo. Una de ellas es utilizando la función
DoFSCommands que el propio Flash nos crea al publicar. Posteriormente sólo deberemos utilizar el método
SetVariable del objeto Flash. Puedes leer acerca de ello en los siguientes links:
Tutorial Cristalab
Pero disponemos de otra forma más sencilla, muy útil cuando sólo queremos enviar un valor. Consiste en utilizar los atributos
FlashVars del tag
<object> y
flashvars del tag
<embed> que se necesitan para incrustrar una película flash en un documento HTML.
El problema es que como el valor que queremos pasar a la película flash será variable (no tiene mucha utilidad pasar siempre el mismo valor, no?), debemos utilizar javascript, concretamente el objeto
document y el método
write para indicar el valor de la variable.
El parámetro
FlashVars se define de la siguiente forma dentro de
<object>:
<param name="FlashVars" value="valor">
El atributo flashvars de <embed> se define sin más de la siguiente forma:
flashvars="valor"
Pero de esta forma sólo podríamos mandar valores fijos. Para mandar valores a variables necesitamos de javascript. El código definitivo quedaría así:
<object classid="clsid
27cdb6e-ae6d-11cf-96b8-444553540000"
codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=8,0,0,0"
id="menu" width="750" height="133" align="middle">
<param name="Src" value="../imgs/menu.swf" />
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="../imgs/menu.swf?op=3" />
<script language="javascript">
//..............................
// www.neomode.org
//..............................
// Recogemos en la variable menu el GET
// enviado por la película Flash
var menu=document.location.search;
// Extraemos sólo el último carácter
//que lleva la opción pulsada
var opcion=menu.substr(menu.length-2,1);
// Si ha habido algún error en la
//transmisión de GET
//suponemos la primera opción
if(opcion=='undefined') { opcion=1; };
document.write('<param name="FlashVars"
value="op='+opcion+'"/>');
</script>
<param name="quality" value="high" />
<PARAM NAME="BGColor" VALUE="FFFFFF">
<PARAM NAME="SWRemote" VALUE="">
<param name="wmode" value="transparent" />
<param name="bgcolor" value="#999999" />
<script language="javascript">
document.write('<embed src="../imgs/menu.swf"
width="750" height="133" quality="high"
pluginspage="http://www.macromedia.com/go/getflashplayer"
type="application/x-shockwave-flash" menu="false"
allowscriptaccess="sameDomain" swLiveConnect=true
id="menu" name="menu"
flashvars="op='+opcion+'"></embed>');
</script>
</object>
Y Voilá! de esta forma hacemos que se genere el valor de la variable cuando se interprete el código en el navegador.
Y para qué sirve esto? Pues a mí personalmente me ha servido para hacer que un menú confeccionado con flash y que se repite en todas las páginas de un sitio conserve la opción que se ha seleccionado marcada en el menú, reflejando de esta forma el lugar que le corresponde en el menú a la página visualizada (de otra forma, el menú aparecería "desde cero" en cada página). Cuando la página esté operativa subiré un link a este mismo post. Por el momento sólo existe en mi Mac.
Anotación por Mode Martínez Palenzuela a las
14:00:03
|
Comentarios (0)
Guardado en la categoría
Flash
|
Referencias (0)
Mode Martínez Palenzuela - 18-06-2006 12:15:20 | Categoria:
Flash
Flash 8 no interactúa con
javascript, porqué se odian?
Bueno, no es que se odien, es que por motivos de seguridad (según Adobe) si publicamos una película flash con los
settings tal y como vienen por defecto, comprobaremos que al hacer un getURL con intención de enviar valores de variables al documento HTML que enlazamos, Flash elimina de la URL estas variables, es decir, no manda ningún valor. Me explico...si por ejemplo hacemos:
getURL('pagina.htm?op=10&subop=23', '_self', 'GET');
donde
op y
subop son las variables que queremos enviar, veremos que en la línea de dirección de nuestro navegador sólo aparece:
pagina.htm
...y ni rastro de lo que va después de la interrogación, con lo que no podemos recoger esas variables de ningún modo.
Para solucionar esto debemos irnos a
File -> Publish Settings, y en la
pestaña Flash, en la opción
Local playback security, seleccionamos
Access network only. Y a partir de entonces Flash tendrá ojos para javascript y podremos hacernos una función en javascript para recoger los valores de esas variables. No obstante si tenemos variables definidas en la línea de tiempo principal de la película, al utilizar el método GET en la función getURL, se nos encadenarán todas estas variables a la URL y puede que no queramos eso. En este caso basta con eliminar el parámetro GET de la función getURL, quedando la cosa como sigue:
getURL('pagina.htm?op=10&subop=23', '_self');
Pero, cómo hago para mandar valores desde HTML o javascript a la película Flash? Pues eso en otro post...próximamente.
Anotación por Mode Martínez Palenzuela a las
12:15:20
|
Comentarios (0)
Guardado en la categoría
Flash
|
Referencias (0)
Mode Martínez Palenzuela - 12-03-2006 11:28:56 | Categoria:
.NET
Cómo restringir el foco al formulario activo...
Normalmente cuando invocamos desde un formulario a otro, podemos cambiar el foco de la aplicación a cualquier ventana windows que tengamos en segundo plano (sea o no sea de nuestra aplicación) simplemente haciendo click en dicha ventana. Esto es porque lo invocamos de forma no modal. El método que nos permite lanzar un formulario no modal desde otro es
Show(). Ejemplo:
frmClientes.Show()
Pero si necesitamos que el formulario que invocamos conserve el foco hasta que éste sea cerrado, evitando así que se pueda interrumpir cualquier proceso que se lleve a cabo dentro del mismo, tendremos que lanzarlo de forma modal mediante el método
ShowDialog(). Ejemplo:
frmClientes.ShowDialog()
Anotación por Mode Martínez Palenzuela a las
11:28:56
|
Comentarios (11)
Guardado en la categoría
.NET
|
Referencias (0)
Mode Martínez Palenzuela - 28-02-2006 12:59:00 | Categoria:
Flash
Vamos a quitarle peso...
Si hemos creado una galería de imágenes en Flash es lógico que la película resultante nos haya engordado un poco. Pero si el peso nos parece desorbitado posiblemente sea porque hemos importado las imágenes a nuestra biblioteca y las hemos dejado con la configuración de compresión que tengan en origen. Para solucionar esto hacemos doble click sobre cada archivo de imagen en la biblioteca. Nos aparecerá la ventana
Propiedades de mapas de bits. Lo más probable es que aparezca seleccionada la casilla
Utilizar datos de JPEG importado. Pues bien, la deseleccionamos y nos aparece un cuadro de texto donde teclearemos la calidad o nivel de compresión que queremos para nuestras fotos. Un 80-90% baja el peso de la película considerablemente sin que la calidad se vea muy afectada. En esa misma ventana podemos ver el ahorro en bytes que obtenemos. Y listo.
Anotación por Mode Martínez Palenzuela a las
12:59:00
|
Comentarios (4)
Guardado en la categoría
Flash
|
Referencias (0)