Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Ogramar

Páginas: 1 ... 44 45 46 47 48 [49] 50 51 52 53 54 ... 100
961
Buenas como es tu primer mensaje en el foro comentarte lo que siempre comentamos:

- Para pegar código y otras cuestiones sigue las indicaciones que se dan en https://www.aprenderaprogramar.com/foros/index.php?topic=1460.0

No olvides explicar en qué lenguaje estás trabajando y con qué versión al principio de la explicación y no al final.

Para poder ingresar valores a una matriz necesitas primero definir el número de filas y el número de columnas de que va a constar la matriz. En el caso de una matriz cuadrada, el número de filas y de columnas es el mismo y podrías pedir simplemente el tamaño de la matriz pero esto tendrías que explicarlo.

En este curso tienes explicados todos los fundamentos sobre arrays (arreglos) y matrices: http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=28&Itemid=59

En este curso tienes ejemplos con arrays unidimensionales y bidimensionales: http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=37&Itemid=61

Este código es un ejemplo de cómo convertir una matriz en un array unidimensional:

Código: [Seleccionar]
Public Class Form1
    Dim x(2, 2) As Integer
    Dim xv(8) As Integer
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ' n = InputBox("Ingresa tamaño de la matriz")
        Dim contador As Integer
        Dim contenidoArray As String
        contenidoArray = ""
        contador = 0

        For i = 0 To 2
            For j = 0 To 2
                x(i, j) = InputBox("Ingresa valor matriz fila " & i & " columna " & j & " : ")
                xv(contador) = x(i, j)
                contador = contador + 1
            Next
        Next

        For i = 0 To 8
            contenidoArray = contenidoArray & xv(i) & "-"
        Next

        MsgBox("El contenido del array o arreglo unidimensional es " & contenidoArray)
    End Sub
End Class

Salu2

962
Buenas en el paquete java.util.zip.* puedes encontrar clases con funcionalidades para la compresión y descompresión.

Este código es un ejemplo:

Código: [Seleccionar]
public static void zip(String[] files, String zipFile) throws IOException {
    BufferedInputStream origin = null;
    ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
    try {
        byte data[] = new byte[BUFFER_SIZE];

        for (int i = 0; i < files.length; i++) {
            FileInputStream fi = new FileInputStream(files[i]);   
            origin = new BufferedInputStream(fi, BUFFER_SIZE);
            try {
                ZipEntry entry = new ZipEntry(files[i].substring(files[i].lastIndexOf("/") + 1));
                out.putNextEntry(entry);
                int count;
                while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1) {
                    out.write(data, 0, count);
                }
            }
            finally {
                origin.close();
            }
        }
    }
    finally {
        out.close();
    }
}

public static void unzip(String zipFile, String location) throws IOException {
    try {
        File f = new File(location);
        if(!f.isDirectory()) {
            f.mkdirs();
        }
        ZipInputStream zin = new ZipInputStream(new FileInputStream(zipFile));
        try {
            ZipEntry ze = null;
            while ((ze = zin.getNextEntry()) != null) {
                String path = location + ze.getName();

                if (ze.isDirectory()) {
                    File unzipFile = new File(path);
                    if(!unzipFile.isDirectory()) {
                        unzipFile.mkdirs();
                    }
                }
                else {
                    FileOutputStream fout = new FileOutputStream(path, false);
                    try {
                        for (int c = zin.read(); c != -1; c = zin.read()) {
                            fout.write(c);
                        }
                        zin.closeEntry();
                    }
                    finally {
                        fout.close();
                    }
                }
            }
        }
        finally {
            zin.close();
        }
    }
    catch (Exception e) {
        Log.e(TAG, "Unzip exception", e);
    }
}

Salu2

963
Buenas yo el código lo veo perfectamente. Cuando dices que no está creada de la mejor manera desde mi punto de vista no es porque el código no sea bueno sino porque en los desarrollos web profesionales los contenidos no son estáticos ni se administran estáticamente. Me explico, me refiero a que en desarrollos web profesionales normalmente habrá una intefaz, piensa por ejemplo si conoces joomla, wordpress, drupal, etc. ahí tienes un lugar de administración que te permite subir las imágenes para la galería, elegir distintos efectos para la galería, establecer si la galería se muestra o no en la página web, etc. Todo esto lo que supone es que se combinan un montón de conocimientos relacionados con desarrollos web como html, css, javascript, php u otro lenguaje, ajax y otros.

Puede ser interesante leer este artículo ¿Qué es y qué estudiar para ser programador web? http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=702:ique-es-y-que-estudiar-para-ser-programador-web-itinerario-de-formacion-plan-de-estudios-o-de-carrera&catid=39:orientacion-academica&Itemid=189

Otra cosa que conviene tener en cuenta es que los desarrollos web suelen basarse en frameworks que ya incorporan herramientas específicas que facilitan la programación (p.ej. AngularJS, jQuery, etc.) y que los desarrollos los suelen hacer equipos de varias personas. Cada equipo usa uno o varios frameworks, tiene su propio entorno de trabajo.

Salu2

964
Buenas me había liado con tantas clases, al usar sólo las 8 clases que terminan en 2D sí he podido compilar el código, aunque se presenta el problema que comentabas. Hago un pequeño resumen:

PruebaMarcoFigura2D: crea un objeto MarcoDibujo2D

GUIMiFigura2D: es una clase abstracta de la que heredan MarcoDibujo2D y MiFiguraDelimitada2D

MarcoDibujo2D: clase que extiende a JFrame y donde se encuentran las opciones y botones que el usuario puede elegir. Hay un botón "Limpiar" con un ActionListener que invoca dibujo.borrarDibujo() donde dibujo es un objeto PanelDibujo2D. De la misma forma que este botón tenemos botones "Deshacer", "Primer color", "Segundo color", un Action Listener para un campo JTextField denominado anchoLineaText y otro Action Listener para otro JTextField denominado longGuionText. Hay un ItemListener para el checkbox "Guiones", otro para el checkbox "Degradado" y otro para "Relleno / Sin relleno" y otro para "figuraDibujar".

En la clase PanelDibujo tenemos panelDibujo.addMouseListener (manejador);
        panelDibujo.addMouseMotionListener (manejador);

Y tenemos la clase privada  private class ManejadorRaton extends MouseAdapter implements MouseMotionListener

Los oyentes del evento del ratón parecen funcionar bien, al menos he puesto mensajes para visualizar y muestra los valores capturados.

Aunque no he estudiado en profundidad el código parece que tienes un fallo de conceptos y de bases de Java. La clase PanelDibujo2D hereda de JPanel, ¿para qué declaras un atributo private JPanel panelDibujo;? Al hacer esto y operar sobre el atributo, confundes operaciones sobre la clase con operaciones sobre el propio atributo...

Recomendamos seguir este curso para aclarar todos los conceptos básicos sobre Java: http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

Al hacer algunos cambios en unas pocas líneas para usar this en lugar de un atributo ya empieza a dibujar (aunque todavía habría muchas cosas que comprobar):

Clase modificada de forma que ya dibuja:

Código: [Seleccionar]
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Paint;
import javax.swing.JLabel;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseAdapter;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class PanelDibujo2D extends JPanel {

    private GUIMiFigura2D figuras [];    //almacena todas las figuras que se dibujan
    private int cuentaFiguras;      //cuenta el numero de figuras en el arreglo
    private int tipoFigura;         //Determine el tipo de figura a dibujar
    private GUIMiFigura2D figuraActual;  //representa figura actual que se esta
                                    //dibujando
    private Paint colorActual1;      //representa el color del dibujo actual
    private Paint colorActual2;
    private boolean figuraRellena;  //determina si se dibuja una figura rellena
    private boolean usoGradiente;
    private float trazoActual;   
    private float longGuion;
    private JLabel etiquetaEstado;  //representa la barra de estado representa
                                    //coordenadas de la posición actual del
                                    //raton
    private boolean usoGuiones;
   
    //private JPanel panelDibujo;
    private int posicionX;
    private int posicionY;
    private int posicionX1;
    private int posicionY1;
    private int posicionX2;
    private int posicionY2;
   
    public PanelDibujo2D (JLabel etiqueta){
       
        //panelDibujo = new JPanel ();
       
        etiquetaEstado = etiqueta;
        figuras = new GUIMiFigura2D [100];
        cuentaFiguras = 0;
        tipoFigura = 0;
        establecerTipoFigura (new MiLinea2D ());
        figuraActual = null;
        colorActual1 = Color.BLACK;
        colorActual1 = Color.BLUE;
        figuraRellena = false;
        usoGradiente = false;
        this.setBackground(Color.WHITE);
       
        ManejadorRaton manejador = new ManejadorRaton ();
        this.addMouseListener (manejador);
        this.addMouseMotionListener (manejador);
    }
   
    private class ManejadorRaton extends MouseAdapter
            implements MouseMotionListener {
        //maneja el evento cuando se oprime el raton
        public void mousePressed (MouseEvent evento){
            switch (tipoFigura){
                case 0:
                    figuraActual = new MiLinea2D ();
                    break;
                case 1:
                    figuraActual = new MiRectangulo2D ();
                    break;
                case 2:
                    figuraActual = new MiOvalo2D ();
                    break;
                default:
                    break;
            }
            posicionX1 = evento.getX ();
            posicionY1 = evento.getY ();
        }
       
        //manejo evento cuando se suelta el boton del raton despues de
        //arrastrarlo
        public void mouseReleased (MouseEvent evento){
            posicionX2 = evento.getX ();
            posicionY2 = evento.getY ();
            if (figuraActual instanceof MiLinea2D){
                figuras [cuentaFiguras] = new MiLinea2D (posicionX1, posicionY1,
                        posicionX2, posicionY2, colorActual1, trazoActual,
                        usoGuiones, longGuion);
                repaint ();
            }else if (figuraActual instanceof MiRectangulo2D){
                figuras [cuentaFiguras] = new MiRectangulo2D (posicionX1,
                        posicionY1, posicionX2, posicionY2, colorActual1,
                        colorActual2, figuraRellena, trazoActual, usoGradiente);
                repaint ();
            }else{
                figuras [cuentaFiguras] = new MiOvalo2D (posicionX1, posicionY1,
                        posicionX2, posicionY2, colorActual1, colorActual2,
                        figuraRellena, trazoActual, usoGradiente);
                repaint ();
            }
            figuraActual = null;
            cuentaFiguras++;
        }
       
        //maneja evento cuando el usuario mueve el raton
        public void mouseMoved (MouseEvent evento){
            etiquetaEstado.setText (String.format ("(%d, %d)",
                    evento.getX(), evento.getY ()));
        }
       
        //el evento cuando el usuario arrastra el raton con el boton oprimido
        public void mouseDragged (MouseEvent evento){
            posicionX = evento.getX ();
            posicionY = evento.getY ();
            if (figuraActual instanceof MiLinea2D){
                figuras [cuentaFiguras] = new MiLinea2D (posicionX1, posicionY1,
                        posicionX, posicionY, colorActual1, trazoActual,
                        usoGuiones, longGuion);
                repaint ();
            }else if (figuraActual instanceof MiRectangulo2D){
                figuras [cuentaFiguras] = new MiRectangulo2D (posicionX1,
                        posicionY1, posicionX, posicionY, colorActual1,
                        colorActual2, figuraRellena, trazoActual, usoGradiente);
                repaint ();
            }else{
                figuras [cuentaFiguras] = new MiOvalo2D (posicionX1, posicionY1,
                        posicionX, posicionY, colorActual1, colorActual2,
                        figuraRellena, trazoActual, usoGradiente);
                repaint ();
            }
            etiquetaEstado.setText (String.format ("(%d, %d)",
                    evento.getX(), evento.getY ()));
        }
    }
   
    public void paintComponent (Graphics g){
        super.paintComponent (g);
       
        Graphics2D g2d = (Graphics2D) g;
       
        System.out.println ("A Pintar");
        for (int count = 0; count < cuentaFiguras + 1; count++){
            if (figuras [count] != null)
                figuras [count].dibujar(g2d);
            else
                ;
        }
    }
   
    //establece el tipo de figura a dibujar
    public void establecerTipoFigura (GUIMiFigura2D figura){
        if (figura instanceof MiLinea2D){
            tipoFigura = 0;
        }else if (figura instanceof MiRectangulo2D){
            tipoFigura = 1;
        }else {
            tipoFigura = 2;
        }
    }
   
    //se establece el primer color a usar
    public void establecerColorActual1 (Paint color){
        colorActual1 = color;
    }
   
    //Se establece el segundo color a usar
    public void establecerColorActual2 (Paint color){
        colorActual2 = color;
    }
   
    //Se establece si se dibuja con relleno la figura o no
    public void establecerFiguraRellena (boolean rellena){
        figuraRellena = rellena;
    }
   
    //Establece el trazo actual de la figura
    public void establecerTrazoActual (float trazo){
        trazoActual = trazo;
    }
   
    //se establece la longitud de los guiones
    public void establecerLongGuioin (float longitud){
        longGuion = longitud;
    }
   
    //Establece si se usan guiones para dibujar la línea
    public void establecerUsoGuiones (boolean guiones){
        usoGuiones = guiones;
    }
   
    //se establece si se dibuja con gradiente la figura o no
    public void establecerUsoGradiente (boolean gradiente){
        usoGradiente = gradiente;
    }
   
    //método para borrar la última figura que se dibujo
    public void borrarUltimaFigura (){
        cuentaFiguras--;
        if (cuentaFiguras < 0){
            cuentaFiguras = 0;
            repaint ();
        }else
            repaint ();
    }
   
    //método para borrar todos los dibujos que se dibujaron
    public void borrarDibujo (){
        cuentaFiguras = 0;
        repaint ();
    }   
   
    public JPanel obtenerPanelDibujo (){
        return this;
    }
}

Al ser el código tan largo resulta difícil de depurar. Para los foros recomendamos centrar mejor el problema sobre fragmentos de código cortos que puedan estudiarse con más facilidad.

Salu2

965
Buenas Pedro

En la a) Desde mi punto de vista el closure está en

Código: [Seleccionar]
function cambiarDimensionFuente(size) {   return function() { document.body.style.fontSize = size + 'px';}; }

Citar
A las funciones internas que hacen uso de variables locales de las funciones externas dentro de las cuales se encuentran las denominamos cerraduras o closures.

En cambiarDimensionFuente se hace uso en una función interna de size, que es un parámetro para la función externa.

En setClicks no veo closure porque setClicks hace uso de size8, size16 y size24 que son variables glogales (referencias a función).

La b) bien

La c) bien

La d) bien al escribir document.getElementById('fuente-8').onclick = size8; establecemos una función a ejecutar como respuesta a un evento.

La e) bien size8() implica ejecución de la función

La f) en este caso no le veo ventajas al uso de closures y el inconveniente que consume más recursos

La g) bien. También se puede resolver así:

Código: [Seleccionar]
<!DOCTYPE html>
<html><head><title>Ejemplo aprenderaprogramar.com</title><meta charset="utf-8">
<style type="text/css">
body { font-family: Helvetica, Arial, sans-serif;}
h2 {  font-size: 1.5em;} h3 { font-size: 1.2em;}
div div {color:blue; margin:10px;}
</style>
<script type="text/javascript">
function cambiarDimensionFuente(size) { document.body.style.fontSize = size + 'px';}

var size8 = function() {cambiarDimensionFuente(8);}
var size16 = function () {cambiarDimensionFuente(16);}
var size24 = function () {cambiarDimensionFuente(24);}
 
function setClicks(){
document.getElementById('fuente-8').onclick = size8;
document.getElementById('fuente-16').onclick = size16;
document.getElementById('fuente-24').onclick = size24;
}
</script></head>
<body onload="setClicks()">
<div id="cabecera"><h2>Cursos aprenderaprogramar.com</h2><h3>Ejemplos JavaScript</h3>
<div id ="fuente-8" > Poner texto a 8 </div> <div id ="fuente-16" > Poner texto a 16 </div>
<div id ="fuente-24" > Poner texto a 24 </div> </div>
<p>En las praderas de la estepa de la Tierra del Fuego suele hacer frío</p>
</body></html>

Salu2

966
Buenas, pega el código que estés utilizando, simplemente con decir error (27:17) junit:junit:4, 12 es muy difícil saber a qué se puede deber.

Salu2

967
Buenas

La lógica del programa no está bien planteada. Si tratas de verificar unos datos lo normal será pedir los datos en el main y pasárselos a la función para que los verifique, no llamar a una función sin datos y pedir los datos dentro de la función.

Tampoco se entiende while (a>b and c>d) en el bucle sin introducir un mensaje advirtiendo de cómo se deben introducir los datos. Es decir, lo lógico sería que pusieras un mensaje diciendo cómo se deben introducir los datos, por ejemplo "Introduzca cuantro números enteros decrecientes" o como sea que se deban introducir.

Salu2

968
Buenas cuando intento compilar me sale el error que te he indicado antes

969
Buenas lo veo perfecto

En <meta charset="utf-8"> yo normalmente pongo la barra de cierre <meta charset="utf-8" /> aunque no es obligatoria

Salu2

970
Buenas Boletos

Con Java hay que ir poco a poco. Lo que sí te recomiendo es sobre todo al principio que cuando crees clases crees también objetos en el banco de objetos de BlueJ y compruebes los métodos. Esa sería la forma de "ejecutar" al menos inicialmente, más adelante en el curso ya se explica cómo crear ejecutables de otra manera

Salu2

971
Buenas lo veo todo bien!

Salu2

972
Buenas la utilidad de | es específica para operaciones bit a bit, si simplemente quieres usar un OR debes hacerlo con ||

Salu2

973
Hola sanvelcas no acabo de entender qué es lo que hay que ir dibujando. Supongamos la matriz [5][5] y columna elegida la de índice 1

El dibujo inicial sería este:

+++++
+++++
+++++
+++++
+++++

¿Después hay que volver a dibujar la matriz varias veces? ¿El dibujo sería:

+ +++
+++++
+++++
+++++
+++++
  +

Luego
+ +++
+ +++
+++++
+++++
+++++
  +
  +

Luego
+ +++
+ +++
+ +++
+++++
+++++
  +
  +
  +

Luego
+ +++
+ +++
+ +++
+ +++
+++++
  +
  +
  +
  +

¿Y terminar? ¿Es eso?

Salu2

974
Buenas, he intentado compilarlo y me salta un error en esta línea de la clase MarcoDibujo

private MiFigura figura [] = {new MiLinea (), new MiRectangulo (), new MiOvalo ()};

El error que marca es "No se encuentra la clase MiFigura"

Salu2

975
Hola portocarrerojava el código que has incluido no compila, faltan clases. Para poder revisarlo añade esas clases, así podremos compilar y tratar de averiguar qué ocurre.

Este es un pequeño ejemplo de dibujado

Código: [Seleccionar]
import javax.swing.*;
import java.awt.*;

public class TestFiguras extends JFrame{
     public TestFiguras(){
          setSize(400,400);
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          setLocationRelativeTo(null);
          setVisible(true);
     }

     public static void main(String a[]){
         new TestFiguras();
     }

     public void paint(Graphics g){
          g.drawOval(40, 40, 60, 60); //Dibuja un circulo
          g.drawRect(80, 30, 200, 200); // Dibuja un cuadrado
          g.drawRect(200, 100, 100, 200); // Dibuja un rectángulo
     }
}

Salu2

976
Tienes razón, no me había dado cuenta. Voy a comentarlo para eliminarla porque esa línea no tiene utilidad. De resto tu código está bien  :D

Salu2

977
Buenas ahora bien!

En tu código pasas label como parámetro. Otra opción también válida sería no pasar el parámetro, quedaría como este código que es igual pero sin pasar parámetros:

Código: [Seleccionar]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Ejemplo DOM - aprenderaprogramar.com</title>
<meta charset="utf-8">
<style type="text/css">
body {background-color:white; font-family: sans-serif;}
label {color: maroon; display:block; padding:5px;}
.boton-idioma {background: #fd7416; width: 150px; margin: 10px 0 10px 100px; cursor: pointer;}
</style>
<script type="text/javascript">
function cambiarAspecto() {
var elementosObtenidos = document.getElementsByTagName('label');
elementosObtenidos[0].style.backgroundColor = '#FF6633';
elementosObtenidos[1].style.backgroundColor = '#FF9933';
elementosObtenidos[2].style.backgroundColor = '#FFCC33';
}

function cambiarIdioma () {
var elementosLabel = document.getElementsByTagName('label');
elementosLabel[0].childNodes[0].firstChild.nodeValue = 'Name:';
elementosLabel[1].childNodes[0].firstChild.nodeValue = 'Surname:';
elementosLabel[2].childNodes[0].firstChild.nodeValue = 'E-mail:';
}

function cambiarIdioma2 () {
var elementosLabel = document.getElementsByTagName('label');
elementosLabel[0].childNodes[0].firstChild.nodeValue = 'Nombre:';
elementosLabel[1].childNodes[0].firstChild.nodeValue = 'Apellidos:';
elementosLabel[2].childNodes[0].firstChild.nodeValue = 'Correo electrónico:';
}
</script>
</head>
<body>
<div id="cabecera">
<h1>Portal web aprenderaprogramar.com</h1>
<h2>Didáctica y divulgación de la programación</h2>
</div>

<!-- Formulario de contacto -->

<div style="width:450px;">
<form name ="formularioContacto" class="formularioTipo1" method="get" action="accion.html" onclick="cambiarAspecto()">
<p>Si quieres contactar con nosotros envíanos este formulario relleno:</p>
<label for="nombre"><span>Nombre:</span> <input id="nombre" type="text" name="nombre" /></label>
<label for="apellidos"><span>Apellidos:</span> <input id="apellidos" type="text" name="apellidos" /></label>
<label for="email"><span>Correo electrónico:</span> <input id="email" type="text" name="email" /></label>
<label>
<input type="submit" value="Enviar">
<input type="reset" value="Cancelar">
</label>
</form>

<div class="boton-idioma" id="ingles" onclick="cambiarIdioma();">Cambiar a ingles</div>
<div class="boton-idioma" id="espanol" onclick="cambiarIdioma2();">Cambiar a español</div>
</div>


</body>
</html>

Salu2

978
Buenas

Hay una línea a  la que no acabo de encontrarle sentido - utilidad

Código: [Seleccionar]
document.getElementById('numeracion').nodeValue = '99';
¿Para qué introduces esta línea?

Salu2

980
Buenas si haces doble click sobre por ejemplo un DataGridView te inserta el código correspondiente al evento click:

    Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick

    End Sub

Al mismo tiempo en la parte superior de la ventana de código aparecen dos combobox desplegables, uno que pone DataGridView1 y otro que pone CellContentClick.

Si seleccionas en el combobox de eventos otro evento, te aparecerá el código para ese evento, por ejemplo si seleccionas CellEndEdit te aparecerá:

    Private Sub DataGridView1_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit

    End Sub

Este código digamos que es el código marco para escribir un código de respuesta al evento seleccionado, en este caso sería para respuesta al evento CellEndEdit

Salu2

Páginas: 1 ... 44 45 46 47 48 [49] 50 51 52 53 54 ... 100

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".