elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


  Mostrar Mensajes
Páginas: 1 ... 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [24] 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 ... 63
231  Programación / Java / Re: JTableUsuario y JTableDisfruta en: 20 Febrero 2012, 11:45 am
esta bien pon codigo
 :xD
232  Programación / Java / Re: Ejercicio del patrón Decorador del libro Head First Design Patterns en: 17 Febrero 2012, 00:43 am
desventajas de la primera

poliformismo vs if esto atrae trolls alguien dijo "java mato a los punteros ahora el poliformismo mata a los if"  >:D ahora es momento de considerar if a modo de switch depreceted

si tu permites if enves de poliformismo se ve facil pero recuerda esos if se reproducen como un virus como si fueran una enfermedad se exparsen como el cancer es decir en el metodo getPrecio pones if luego agregas otro metodo (que necesite saber que tamaño tiene) pues facil copias y pegas la gigantesca lista de if y si denuevo quiero y si luego aparce otro pues facil copias y pegas nuebamente asi asta artarte

i que pasa cuando quieres agregar otro tamaño uuu te fregaste tendrias que buscar todos los if (imaginate que son 50 veces) en todas partes y agregar el nuebo tamaño
recuerda que tendrias que hacerlo a mano y que pasa si cuando copias y pegas creas un bug pues lo copiaste 50 veces

233  Programación / Java / Re: kardex ueps en: 14 Febrero 2012, 01:37 am
-si lo unico que quieres es aprender cualquier cosa estaria bien
-si lo quieres hacer con arreglos esta bien si quieres aprender a usar arreglos pero solo guardarias tus datos en memoria cierras el programa todo se pierde
-otra opcion si gustas en con base de datos

recuerda que no se hacen tareas mejor deja tu pregunta concreta del tipo como resuelvo este problema especifico o como se corrige esta excepcion
234  Programación / Java / Re: Menu swing, Como lo hacerlo en: 13 Febrero 2012, 02:20 am
porfavor respondeme aunque sea respuesta troll pero no me dejes solo si no me deprimo
235  Programación / Java / Re: Menu swing, Como lo hacerlo en: 13 Febrero 2012, 02:13 am
-Si dejaras de pensar en java en función al ide y leyeras absolutamente todo el código que creas todos tus problemas se resolverían mágicamente y nunca más volverías a postear

El método mas fácil (puedo escribir 10 hojas solo de este tema pero nadie lo leería y no me entenderías)

1 debes tener un único formulario con que herede de JFrame a partir de ahora llamado principal

2 el resto de tus ventanas deben heredar de JDialog

4 Dentro el formulario principal creas bariables globales para todos tus formularios globales

3 le pones un jmenuBar en tu formulario principal y cada JmenuIten muestras un formulario auxiliar con este codigo
Código:
if (frmPersonal == null) {
frmPersonal = new FrmPersonal(this, true);
}
frmPersonal.setVisible(true);


ejemplo de fromulario principal



Código:
package org.springhispano.screancast01;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JToolBar;
import javax.swing.JButton;
import java.awt.FlowLayout;
import javax.swing.AbstractAction;
import java.awt.event.ActionEvent;
import javax.swing.Action;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import java.awt.event.ActionListener;

public class FrmPrincipal extends JFrame {

FrmPersonal frmPersonal;

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
FrmPrincipal frame = new FrmPrincipal();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

public FrmPrincipal() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);

JMenuBar barPrincipal = new JMenuBar();
setJMenuBar(barPrincipal);

JMenu mnuRecursosHumanos = new JMenu("Recursos Humanos");
barPrincipal.add(mnuRecursosHumanos);

JMenu mnuPersonal = new JMenu("Personal");
mnuRecursosHumanos.add(mnuPersonal);

JMenuItem mnuRegistro = new JMenuItem("registro");
mnuRegistro.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mnuRegistro_actionPerformed(e);
}

});
mnuPersonal.add(mnuRegistro);
JPanel contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new BorderLayout(0, 0));

JPanel panel = new JPanel();
contentPane.add(panel, BorderLayout.EAST);

JPanel panel_2 = new JPanel();
contentPane.add(panel_2, BorderLayout.WEST);

JPanel panel_3 = new JPanel();
contentPane.add(panel_3, BorderLayout.CENTER);

JPanel panel_4 = new JPanel();
contentPane.add(panel_4, BorderLayout.SOUTH);
}

private void mnuRegistro_actionPerformed(ActionEvent e) {
if (frmPersonal == null) {
frmPersonal = new FrmPersonal(this, true);
}
frmPersonal.setVisible(true);
}

}

Código:

package org.springhispano.screancast01;

import java.awt.BorderLayout;

public class FrmPersonal extends JDialog {

private final JPanel contentPanel = new JPanel();

/**
* Launch the application.
*/
public static void main(String[] args) {
try {
FrmPersonal dialog = new FrmPersonal(null,false);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Create the dialog.
*/
public FrmPersonal(Frame owner, boolean modal) {
super(owner, modal);
setTitle("Personal");
setBounds(100, 100, 450, 300);
getContentPane().setLayout(new BorderLayout());
contentPanel.setLayout(new FlowLayout());
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
getContentPane().add(contentPanel, BorderLayout.CENTER);
}

}

236  Programación / Java / Re: Dudas ejecutar una tarea cada día a una hora concreta en: 24 Diciembre 2011, 03:45 am
la única forma de hacerlo es que compruebes la hora en un servidor por red y manejar los permisos de seguridad en el servidor
237  Programación / Java / como crear formularios en: 11 Diciembre 2011, 03:20 am
Esta vez voy hablar con evidencias
Veamos como un desarrollador normal creando un formulario


Código
  1.  
  2. package com.ejemplo;
  3.  
  4. public class PanFeoContacto extends javax.swing.JPanel {
  5.  
  6.    public PanFeoContacto() {
  7.        initComponents();
  8.    }
  9.  
  10.  
  11.    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
  12.    private void initComponents() {
  13.  
  14.        jLabel1 = new javax.swing.JLabel();
  15.        jLabel2 = new javax.swing.JLabel();
  16.        jTextField1 = new javax.swing.JTextField();
  17.        jTextField2 = new javax.swing.JTextField();
  18.        jLabel3 = new javax.swing.JLabel();
  19.        jTextField3 = new javax.swing.JTextField();
  20.        jLabel4 = new javax.swing.JLabel();
  21.        jSpinner1 = new javax.swing.JSpinner();
  22.  
  23.        jLabel1.setText("Nombre");
  24.  
  25.        jLabel2.setText("Apellido");
  26.  
  27.        jLabel3.setText("Direcion");
  28.  
  29.        jLabel4.setText("Edad");
  30.  
  31.        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
  32.        this.setLayout(layout);
  33.        layout.setHorizontalGroup(
  34.            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  35.            .addGroup(layout.createSequentialGroup()
  36.                .addContainerGap()
  37.                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  38.                    .addGroup(layout.createSequentialGroup()
  39.                        .addComponent(jLabel1)
  40.                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
  41.                        .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 460, Short.MAX_VALUE))
  42.                    .addGroup(layout.createSequentialGroup()
  43.                        .addComponent(jLabel2)
  44.                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
  45.                        .addComponent(jTextField2, javax.swing.GroupLayout.DEFAULT_SIZE, 460, Short.MAX_VALUE))
  46.                    .addGroup(layout.createSequentialGroup()
  47.                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  48.                            .addComponent(jLabel3)
  49.                            .addComponent(jLabel4))
  50.                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
  51.                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  52.                            .addComponent(jSpinner1, javax.swing.GroupLayout.DEFAULT_SIZE, 459, Short.MAX_VALUE)
  53.                            .addComponent(jTextField3, javax.swing.GroupLayout.DEFAULT_SIZE, 459, Short.MAX_VALUE))))
  54.                .addContainerGap())
  55.        );
  56.        layout.setVerticalGroup(
  57.            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  58.            .addGroup(layout.createSequentialGroup()
  59.                .addContainerGap()
  60.                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  61.                    .addComponent(jLabel1)
  62.                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
  63.                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
  64.                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  65.                    .addComponent(jLabel2)
  66.                    .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
  67.                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
  68.                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  69.                    .addComponent(jLabel3)
  70.                    .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
  71.                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
  72.                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  73.                    .addComponent(jLabel4)
  74.                    .addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
  75.                .addContainerGap(191, Short.MAX_VALUE))
  76.        );
  77.    }// </editor-fold>                        
  78.  
  79.  
  80.    // Variables declaration - do not modify                    
  81.    private javax.swing.JLabel jLabel1;
  82.    private javax.swing.JLabel jLabel2;
  83.    private javax.swing.JLabel jLabel3;
  84.    private javax.swing.JLabel jLabel4;
  85.    private javax.swing.JSpinner jSpinner1;
  86.    private javax.swing.JTextField jTextField1;
  87.    private javax.swing.JTextField jTextField2;
  88.    private javax.swing.JTextField jTextField3;
  89.    // End of variables declaration                  
  90.  
  91. }
  92.  
  93.  

todo el código es incomprensible inmantenible difícil de entender de modificar es mas el ide no te permite editar casi la totalidad de código
es mas para modificarlo tienes que usar una serie de pasos en el ide eso de precodigo postcodigo solo funciona con netbeans y require un horrible xml de ayuda que te lo crea el ide solo funciono en netbeans
 estorba si usas eclipse y esto solo es un ejemplo trivial la realidad es que me vi en la desgracia de usar formulario 10 veces más complicados con 10 veces de código con más de 50 componentes con paneles dentro de otro y con diferentes layauts y enzima al estilo wizard para que quepa en la pantalla casi me dieron ganas de renunciar al ver que cada vez que modifica un componente todo se desarmaba desaparecían paneles enteros y solo funcionaba con la paleta
Solo pensar en hacerle refactoring es ciencia ficion


Bueno pues ágamos lo a mano solo usando swing


Código
  1. package com.ejemplo;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.Container;
  5. import java.awt.GridBagConstraints;
  6. import java.awt.GridBagLayout;
  7. import java.awt.Insets;
  8. import javax.swing.JLabel;
  9. import javax.swing.JPanel;
  10. import javax.swing.JSpinner;
  11. import javax.swing.JTextField;
  12. import javax.swing.SpinnerNumberModel;
  13.  
  14.  
  15. public class PanelContacto {
  16.  
  17.    private final JPanel panel = new JPanel();
  18.  
  19.  
  20.    public PanelContacto() {
  21.        Insets insets = new Insets(5, 5, 5, 5);
  22.        panel.setLayout(new GridBagLayout());
  23.        panel.add(new JLabel("Nombre"), new GridBagConstraints(0, 1, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NONE, insets, 0, 0));
  24.        panel.add(new JTextField(), new GridBagConstraints(1, 1, 1, 1, 1, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.HORIZONTAL, insets, 0, 0));
  25.        panel.add(new JLabel("Apellido"), new GridBagConstraints(0, 2, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NONE, insets, 0, 0));
  26.        panel.add(new JTextField(), new GridBagConstraints(1, 2, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.HORIZONTAL, insets, 0, 0));
  27.        panel.add(new JLabel("Direcion"), new GridBagConstraints(0, 3, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NONE, insets, 0, 0));
  28.        panel.add(new JTextField(), new GridBagConstraints(1, 3, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.HORIZONTAL, insets, 0, 0));
  29.        panel.add(new JLabel("Edad"), new GridBagConstraints(0, 4, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NONE, insets, 0, 0));
  30.        panel.add(new JSpinner(new SpinnerNumberModel(1, 1, 100, 1)), new GridBagConstraints(1, 4, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.HORIZONTAL, insets, 0, 0));
  31.  
  32.    }
  33.  
  34.    public Container getPanel() {
  35.        JPanel respuesta = new JPanel();
  36.        respuesta.setLayout(new BorderLayout());
  37.        respuesta.add(panel, BorderLayout.NORTH);
  38.        return respuesta;
  39.    }
  40. }
  41.  
  42.  

Es feo pero es 100 veces mejor que la opción anterior además requiere algunos hacks(los layauts de swing son malos)


Luego de hacer refactoring y usar el patrón de diseño builder + interface fluida

Código
  1. package com.ejemplo;
  2.  
  3.  
  4. import java.awt.Container;
  5. import javax.swing.JSpinner;
  6. import javax.swing.JTextField;
  7. import javax.swing.SpinnerNumberModel;
  8.  
  9. public class PanelConPatronBuilder {
  10.  
  11.    public PanelConPatronBuilder() {
  12.    }
  13.  
  14.    public Container getPanel() {
  15.  
  16.        return new PanelBuilder().agregaFila("Nombre", new JTextField()).
  17.                agregaFila("Apellido", new JTextField()).
  18.                agregaFila("Direcion", new JTextField()).
  19.                agregaFila("Edad", new JSpinner(new SpinnerNumberModel(1, 1, 100, 1))).getPanel();
  20.    }
  21. }
  22.  
  23.  
  24.  

U eso es genial mira el código habla por sí solo pero requiera ayuda de una clase echa en casa que tendrías que mantener y crear en caso de que la pierdas 

Aquí está la clase


Código
  1. package com.ejemplo;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.Container;
  5. import java.awt.GridBagConstraints;
  6. import java.awt.GridBagLayout;
  7. import java.awt.Insets;
  8. import javax.swing.JComponent;
  9. import javax.swing.JLabel;
  10. import javax.swing.JPanel;
  11.  
  12. public class PanelBuilder {
  13.  
  14.    private final Container panel=new JPanel();
  15.    private final Insets insets = new Insets(5, 5, 5, 5);
  16.    int cont = -1;
  17.  
  18.    public PanelBuilder() {
  19.  
  20.        panel.setLayout(new GridBagLayout());
  21.    }
  22.  
  23.  
  24.  
  25.  
  26.    public PanelBuilder agregaFila(String nombre,JComponent jTextField) {
  27.        panel.add(new JLabel(nombre), restricionDeEtiqueta(++cont));
  28.        panel.add(jTextField, restricionComponente(cont));
  29.        return  this;
  30.    }
  31.  
  32.    private GridBagConstraints restricionComponente(int cont) {
  33.        return new GridBagConstraints(1, cont, 1, 1, 1, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.HORIZONTAL, insets, 0, 0);
  34.    }
  35.  
  36.    private GridBagConstraints restricionDeEtiqueta(int cont) {
  37.        return new GridBagConstraints(0, cont, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NONE, insets, 0, 0);
  38.    }
  39.  
  40.    public Container getPanel() {
  41.        JPanel respuesta = new JPanel();
  42.        respuesta.setLayout(new BorderLayout());
  43.        respuesta.add(panel, BorderLayout.NORTH);
  44.        return respuesta;
  45.    }
  46. }
  47.  


Ahora si es enserio usando la ayuda de un librería externa bien echa

package com.ejemplo;

import java.awt.Container;
import org.metawidget.swing.SwingMetawidget;
Código
  1. public class PanelContactoMetaWidtget {
  2.  
  3.    public Container getPanel() {
  4.        SwingMetawidget swingMetawidget =new SwingMetawidget();
  5.        swingMetawidget.setToInspect(new Contacto());
  6.        return swingMetawidget;
  7.    }
  8. }
  9.  

Y requiere un pojo de toda la vida
package com.ejemplo;

Código
  1. public class Contacto {
  2.  
  3.    private String nombre;
  4.    private String apellido;
  5.    private String direcion;
  6.    private int edad;
  7.  
  8.    public String getNombre() {
  9.        return nombre;
  10.    }
  11.  
  12.    public void setNombre(String nombre) {
  13.        this.nombre = nombre;
  14.    }
  15.  
  16.    public String getApellido() {
  17.        return apellido;
  18.    }
  19.  
  20.    public void setApellido(String apellido) {
  21.        this.apellido = apellido;
  22.    }
  23.  
  24.    public String getDirecion() {
  25.        return direcion;
  26.    }
  27.  
  28.  
  29. public void setDirecion(String direcion) {
  30.        this.direcion = direcion;
  31.    }
  32.  
  33.    public int getEdad() {
  34.        return edad;
  35.    }
  36.  
  37.    public void setEdad(int edad) {
  38.        this.edad = edad;
  39.  
  40.    }
  41. }
  42.  
y esta librería te obliga a programar orientado a objetos lo cual es bueno porque en un proyecto grande igual tendrías todo partido en varias clases pongámonos esta clase librería te pide que crees la clase contacto que es un pojo que lo arias de toda maneras en caso de que el contacto cambie automáticamente la vista se actualizaría
Digamos que tienes 100 paneles de contacto en caso de que cambie el contacto solo modificarías la clase contacto


metawidget http://metawidget.org/
builder http://architects.dzone.com/news/factories-builders-and-fluent-






238  Programación / Java / Re: Eclipse en: 11 Diciembre 2011, 00:23 am
para eclipse es WindowBuilder
http://www.eclipse.org/windowbuilder/

los editores crean gigantescos y horribles codigos icomprensibles e inmanetinibles incompatibles y lentos es mentira de que nunca tienes que tocar el codigo autogenerado si lo necestias pero el ide estorba ademas jamas e visto buen codigo autogenerado de ninguna herramienta



239  Programación / Java / Re: clases heredadas en: 6 Diciembre 2011, 23:02 pm
si pero jamas lo hagas eso es una de las peores "feture" de java  >:( cuando pasa eso inmediatamente deduce que el disño es muy malo

simplemente en la clase hija buelve a implementar la funcionalidad asi

class canino{
void rueda(){
//canino salvaje no obedece
ataca();
personamuere();
}
}

class pekines extends canino{

void rueda(){
ruedafelis();
seorinaenlaofombra();
}
}

ademas es recomendable que utilises la anotacion override asi


class pekines extends canino{

@override
void rueda(){
ruedafelis();
seorinaenlaofombra();
}
}


esa es la forma como trabajan casi todos (en realidad que usen poo es un milagro)

porfavor no lo agas la mayoria programan horrible cuando tengas clases parecidas que implementan los mismos metodos de formas diferentes creas una interfase con el metodo en comun luego haces que tus clases concretas implementen ese metodo yo voy aun mucho mas lejos e implemento una solucion mas "a la fuersa bruta" creo la interface luego una implementacion de una clase abstracta paraponer todos los metodos comunes a todas las implementaciones concretas y despues creo todas las implementacion heredando de la clase abstracta  :xD

y porfavor dinos los nombres de las clases es cuestion de vida o muerte todo puede fracasar horriblemente si lo haces mal (aunque no lo paresca) el diseño no tiene mucho que ver con complicados algritmos tiene que ver con la comunicacion y el lenguaje




240  Programación / Java / Re: [Opinión / Retroalimentación] ¿Clases Anónimas o Separadas? en: 27 Noviembre 2011, 14:42 pm
clases que implementan listener jamas por que expones funcionalidad interna es decir muestras lo que no debes a través de métodos publico que potencial mente serán llamados donde no corresponde

clases externas que implementen listener yo pienso que no es una buen idea por que lo que deberia ser externo y aparte es la acción que realiza el usuario que sea reutilizable por ejemplo si hariamos un sistema de edición de texto tendríamos crearDocumento importarDeWord importarDeXML confirmarCerrar que serian reutilisados desde los formularios así si presionas la x de la ventana ,si presionas escape  o presionas el botón cerrar rutilases confirmarCerrar que te abriria una ventana de confirmación pero este patrón introduciría a una explosión de clases que general mente no serian reutilisadas aparte de generar un poco de boilepart(el cual no es tan innecesario) así que creo que tendría mas sentido solo usarlo después de que exista la necesidad no desde el principio  otro razon para no usar este patrón extensivamente es que esos comportamientos ya estarían dentro de las clases servicios(ServicioImpresion,ServicioExportacion) y también en las de dominio


la otra opción es usar clases anónima internas son horribles gigantescas ensucian la pureza y la belleza de mi código y agrega muchas lineas de indentacion a mi clase aparte de que me obligan a que tengas mas de 300 lineas lo cual me produce un profundo vació en mi corazon y me da una sensacion de fracaso y depresión  :-[

aunque parezca raro yo prefiero la opción de la clase anónima interna aunque mi corazon sufra  :-[ debido a que sus desventajas son miles de veces menores que las desventajas de las otras 2 opciones

si soy un tonto perfeccionista y obsesionado con el código





Páginas: 1 ... 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [24] 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 ... 63
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines