|
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 - Jose Arriagada
Páginas: 1 2 [3] 4 5 ... 15
51
« en: Lunes 17 de Abril de 2006, 17:02 »
Si deseas mostrar los resultados en otro form, dentro del mismo proyecto, solo tienes que hacer referencia a este. Claro, que debes cargar el formulario primero, si no, al hacer referencia a este, se carga en forma automatica.
form2.tex1.text="Esta es una prueba de referencia"
52
« en: Jueves 13 de Abril de 2006, 16:44 »
Para realizar cualquier accion sobre algun documento MS (word, excel, access, powerpoint, etc), usa las macros para ver el codigo que utiliza y despues lo codificas en tu aplicacion.
Para tu caso, has lo siguiente:
1. Abre el excel 2. En la barra de menu, opcion herramientas, seleccionar MACRO, y despues GRABAR NUEVA MACRO 3. Aparecera un cuadro para colocar un nombre a la macro a generar. Por defecto, deja la Macro1. 4. A continuacion, la macro, "grabara" todo lo que hagas sobre la planilla, y lo dejara en un archivo codificado. Aparecera un cuadro flotante, que es relativa a la macro en grabacion. 5. Entonces, en la hoja1, en cualquier celda, coloca "HOLA". 6. Ahora, te cambias a la hoja2, y en cualquier celda, colocas "CHAO". 7. Ahora, sobre el cuadro flotante de la macro, presiona el boton "DETENER GRABACION". 8. En la barra de menu, opcion herramientas, seleccionar MACRO, y selecciona la macro recien grabada (que por defecto, anteriormente te dije macro1) y presiona el boton MODIFICAR. 9. Voula... Aparece todo el codigo de como realiza excel, los pasos que tu hiciste. 10. Ahora podras ver como se cambia de hoja, como escribe.
Puedes hacer cualquier cosa con las macros, y despues ver el codigo.
ESPERO TE SIRVA
53
« en: Miércoles 5 de Abril de 2006, 17:44 »
Trate de adjuntar el archivo que se servira de parche, pero no me dejo adjuntarlo.
Si puedes conseguirte el archivo MDAC_TYP.EXE y lo instalas en el PC con w98.
Si no lo consigues, dame tu casilla, y te lo envio
54
« en: Miércoles 29 de Marzo de 2006, 19:01 »
1. Agrega un boton Command en tu formulario
2. Agrega un formulario de MODULO y copia lo siguiente:
Public Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Public Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long Public Const SC_MOVE = &HF010& Public Const MF_BYCOMMAND = &H0&
3. En el control Button, coloca el siguiente codigo: Private Sub Command1_Click() lhSysMenu = GetSystemMenu(Me.hwnd, False) lRetVal = RemoveMenu(lhSysMenu, SC_MOVE, MF_BYCOMMAND) End Sub
Ahora prueba...
55
« en: Martes 28 de Marzo de 2006, 21:59 »
El control winsock se carga en el panel de herramientas. Para ello, lo debes cargar desde Proyectos--> Componentes y marcar la opcion "Microsoft Winsock Control 6.0 (SP5)".
Y ahora lo puedes utilizar.
Ahora, si con estas indicaciones no lo encuentras. Entonces debes cargar el parche 5.0 de VB 6.0.
Otra modalidad, es ir a Inicio--> Configuracion --> Panel de Control --> Agregar o quitar programas --> Agregar o quitar componentes de Windows y debes verificar de tener marcada la opcion Servicios de Internet Information Service (IIS)
56
« en: Lunes 27 de Marzo de 2006, 22:07 »
En primer lugar, las relaciones entre tablas, es un concepto.
Fisicamente, la "relacion" es otra tabla, que te permite unir ambas tablas.
Por otro lado, me imagino que estas preguntando por una "tabla" de relacion. ¿O por una consulta SQL y que te permita RELACIONAR ambas tablas?
Para el primer caso, un ejemplo:
Tabla: Estudiantes Campos Tipo ==================== ID_Estudiante Numerico Nombre_Estudiante Texto Direccion_Estudiante Texto
Tabla: Asignaturas Campos Tipo ==================== ID_Curso Numerico Nombre_Curso Texto Horario Texto Sala_Asignada Texto ID_Profesor Numerico
Por tanto, para tener los cursos tomados por los alumnos, requieres "generar" una tabla de relacion "CURSO_ALUMNOS". Que seria de la forma
Tabla: Asignaturas_x_Estudiantes Campos Tipo ==================== ID_Estudiante Numerico ID_Curso Numerico
He aqui tu tabla de relacion.
Para el segundo caso, en que deseas tener una relacion por medio de una consulta SQL, supongamos ampliemos el mismo ejemplo:
Tabla: Profesores Campos Tipo ==================== ID_Profesor Numerico Nombre_Profesor Texto
Si deseas conocer los profesores para cada una de las asignaturas, entonces tu consulta SQL genera una relaciones entre las tablas ASIGNATURAS y PROFESORES, de la siguiente forma
SELECT A.ID_CURSO, A.NOMBRE_CURSO, B.NOMBRE_PROFESOR FROM ASIGNATURAS A, PROFESORES B WHERE A.ID_PROFESOR = B.ID_PROFESOR
En la condicion WHERE estableces la relacion entre ambas tablas.
Espero hayas entendido.
57
« en: Martes 21 de Marzo de 2006, 15:05 »
Extraña la pregunta, donde el ingenio para resolver este "problemita" es infimo...
He aqui tu solucion:
1. Genera un archivo txt, en la misma carpeta donde se encuentra el programa 2. En este archivo coloca la ruta donde se encuentra tu archivo .mdb 3. En tu aplicacion, en el evento LOAD del formulario, pones las siguientes instrucciones:
Private Sub Form_Load() Dim Archivo As String Dim Nro As Double Dim msg As String
Archivo = App.Path & "\RUTA.TXT" If Dir(Archivo, vbArchive) = "" Then MsgBox "No existe archivo de configuracion de RUTA", vbInformation, "Advertencia" Else Nro = FreeFile Open Archivo For Input As #Nro Input #Nro, Ruta Close (Linea) msg = "La ruta origen MDB es " & Ruta MsgBox msg, vbInformation, "Resultado Lectura RUTA.TXT" End If End Sub
58
« en: Lunes 20 de Marzo de 2006, 16:23 »
Como ya te habras dado cuenta, la propiedad Style del combobox es asignable solo en tiempo de diseño. Y como podras darte cuenta TAMBIEN, no puedes utilizar el evento DOBLE-CLICK sobre el combobox, ya que opera primero el evento CLICK.
Por lo tanto, para realizar lo que deseas, solo debes "simular" un ingreso.
Utiliza el siguiente ejemplo, para que veas como hacerlo...
Private Sub Combo1_KeyPress(KeyAscii As Integer) If KeyAscii = 27 Then Text1.Top = Combo1.Top Text1.Left = Combo1.Left Text1.Width = Combo1.Width Text1.Height = Combo1.Height Text1.Visible = True Text1.Text = "" Text1.SetFocus Combo1.Visible = False
End If End Sub
Private Sub Form_Load() Text1.Visible = False For i = 1 To 10 Combo1.AddItem Format("01/" & i & "/2006", "mmmm") Next i End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 27 Then Text1.Visible = False Combo1.Visible = True Else If KeyAscii = 13 Then Combo1.AddItem Text1.Text Text1.Visible = False Combo1.Visible = True End If End If End Sub
Espero te sirva
59
« en: Martes 14 de Marzo de 2006, 14:32 »
En la propiedad Pattern del control FileListBox puedes colocar el filtro de los tipos de documentos que deseas visualizar
Por ejemplo,
Si deseas visualizar archivos graficos de extensiones jpg, bmp e ico, puedes colocar
file1.pattern = *.jpg;*.bmp;*.ico
60
« en: Lunes 13 de Marzo de 2006, 15:24 »
Generalmente no se instala por defecto con la aplicacion, a pesar que viene en el disco de instalacion.
Busca el archivo crystl32.exe dentro de tu CD de instalacion
(podria estar en ... \VB60\Visual Basic 6\Common\Tools\VB\CrysRept)
Y lo instalas sin complicaciones.
61
« en: Viernes 10 de Marzo de 2006, 13:56 »
Estas funciones te entregan informacion de tu consulta a una tabla
** Cantidad de registros recuperados
CantReg = control.RECORDCOUNT - 1
** Cantidad de Columnas
CantCols = control.FIELDS.COUNT - 1
** Nombre de los campos
for i = 0 to CantCols NombreCampo = control.FIELDS( i ).NAME next i
** Valor de los campos for i = 0 to CantCols ValorCampo = control.FIELDS( i ).value next i
62
« en: Viernes 10 de Marzo de 2006, 13:50 »
Voy a dar por cumplida el siguiente supuesto... "Todos tus formularios, graficos, base de datos (si es que las usas), proyectos, y demases, se encuentran en una sola carpeta..."
Si esto es cierto, entonces, para respaldar solo debes realizar una copia de tu carpeta fuente a otra carpeta.
Si tienes formularios distribuidos en diferentes carpetas, y al ir guardandolos en distintas carpetas (para no enredarte por las modificaciones que hiciste), entonces, comienza lo complicado.
Si haces copias de formulario, tambien debes copiar su imagen (.frx) que contiene todas las referencias a los controles del formulario.
63
« en: Viernes 10 de Marzo de 2006, 13:45 »
Tienes dos alternativas.
1). Eliminar el boton "x" de cierre de la aplicacion
2). Colocar codigo para que al momento de cerrar la aplicacion, explicitamente tu la termines.
Para la opcion 1: En la propiedad CONTROLBOX del formulario, colocala en FALSE
Para la opcion 2: Utiliza el siguiente codigo.
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) Select Case UnloadMode Case vbFormCode MsgBox "Cierre desde la aplicacion" Case vbAppWindows MsgBox "Termina la sesion de windows" Case vbFormMDIForm MsgBox "MDI principal se cierra" Case vbFormControlMenu MsgBox "Usuario utiliza control menu para cerrar" Case vbAppTaskManager MsgBox "Cierre desde el Administrador de tareas" End Select 'Si no deseas que termine entonces, cambia Cancel=1 'Cancel = 0
'Si deseas en que termine, independiente de lo que haya pasado, 'entonces agregar 'END End Sub
64
« en: Miércoles 1 de Marzo de 2006, 13:25 »
Envia el codigo para revisar...
65
« en: Viernes 24 de Febrero de 2006, 14:11 »
Private Sub Combo1_Click() MSFlexGrid1.TopRow = Combo1.Text End Sub
Private Sub Form_Load() MSFlexGrid1.Rows = 201 For i = 1 To 200 Combo1.AddItem i MSFlexGrid1.Row = i MSFlexGrid1.Col = 0 MSFlexGrid1.Text = i Next i End Sub
66
« en: Jueves 23 de Febrero de 2006, 14:21 »
Despues de mucho pensarlo, me da la sensacion que no llegaras a tu solucion...
Ahi te va el codigo que resuelve tu problema...
Coloca dos text (text1 y text2) y un boton (command1), e inserta el siguiente codigo
Private Sub Command1_Click() If 2 * CInt(Len(Text1.Text) / 2) = Len(Text1.Text) Then Largo = Len(Text1.Text) msg = Empty For i = 1 To Largo Step 2 msg = msg & Chr(ConvHexDec(Mid(Text1.Text, i, 2))) Next i Text2.Text = msg End If End Sub
Public Function ConvHexDec(ByVal sNumero As String) As Double Largo = Len(sNumero) inicio = Largo Suma = 0 For i = 1 To Largo Digito = Mid(sNumero, i, 1) If IsNumeric(Digito) Then Valor = CInt(Digito) Else Valor = Asc(Digito) - 55 End If potencia = inicio - 1 Monto = Digito * 16 ^ potencia Suma = Suma + Monto inicio = inicio - 1 Next i ConvHexDec = Suma End Function
67
« en: Jueves 23 de Febrero de 2006, 14:07 »
Aqui te doy la base de los sistemas numericos...
Sistemas numéricos El sistema numérico que utilizamos a diario es el sistema decimal, pero este sistema no es conveniente para las máquinas debido a que la información se maneja codificada en forma de bits prendidos o apagados; esta forma de codificación nos lleva a la necesidad de conocer el cálculo posicional que nos permita expresar un número en cualquier base que lo necesitemos.
Es posible representar un número determinado en cualquier base mediante la siguiente formula:
Donde n es la posición del dígito empezando de derecha a izquierda y numerando a partir de cero. D es el dígito sobre el cual operamos y B es la base numérica empleada.
Convertir números binarios a decimales Trabajando en el lenguaje ensamblador nos encontramos con la necesidad de convertir números del sistema binario, que es el empleado por las computadoras, al sistema decimal utilizado por las personas.
El sistema binario está basado en únicamente dos condiciones o estados, ya sea encendido (1) o apagado (0), por lo tanto su base es dos.
Para la conversión podemos utilizar la formula de valor posicional:
Por ejemplo, si tenemos el numero binario 10011, tomamos de derecha a izquierda cada dígito y lo multiplicamos por la base elevada a la nueva posición que ocupan:
Binario : 1 1 0 0 1 Decimal: 1*20+1*21+0*22+0*23+1*24 = 1 + 2 + 0 + 0 + 16 = 19 decimal. El carácter ^ es utilizado en computación como símbolo de potenciación y el carácter * se usa para representar la multiplicación.
Convertir números decimales a binarios Existen varios métodos de conversión de números decimales a binarios; aquí solo se analizará uno. Naturalmente es mucho mas fácil una conversión con una calculadora científica, pero no siempre se cuenta con ella, así que es conveniente conocer por lo menos una forma manual para hacerlo.
El método que se explicará utiliza la división sucesiva entre dos, guardando el residuo como dígito binario y el resultado como la siguiente cantidad a dividir.
Tomemos como ejemplo el número 43 decimal.
43/2 = 21 y su residuo es 1
21/2 = 10 y su residuo es 1
10/2 = 5 y su residuo es 0
5/2 = 2 y su residuo es 1
2/2 = 1 y su residuo es 0
1/2 = 0 y su residuo es 1
Armando el número de abajo hacia arriba tenemos que el resultado en binario es 101011
Sistema hexadecimal En la base hexadecimal tenemos 16 dígitos que van del 0 al 9 y de la letra A hasta la F (estas letras representan los números del 10 al 15). Por lo tanto, contamos 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F.
La conversión entre numeración binaria y hexadecimal es sencilla. Lo primero que se hace para una conversión de un número binario a hexadecimal es dividirlo en grupos de 4 bits, empezando de derecha a izquierda. En caso de que el último grupo (el que quede mas a la izquierda) sea menor de 4 bits se rellenan los faltantes con ceros.
Tomando como ejemplo el número binario 101011 lo dividimos en grupos de 4 bits y nos queda:
10; 1011
Rellenando con ceros el último grupo (el de la izquierda):
0010; 1011
Después tomamos cada grupo como un número independiente y consideramos su valor en decimal:
0010 = 2; 1011 = 11
Pero como no podemos representar este número hexadecimal como 211 porque sería un error, tenemos que sustituir todos los valores mayores a 9 por su respectiva representación en hexadecimal, con lo que obtenemos:
2BH (Donde la H representa la base hexadecimal)
Para convertir un número de hexadecimal a binario solo es necesario invertir estos pasos: se toma el primer dígito hexadecimal y se convierte a binario, y luego el segundo, y así sucesivamente hasta completar el número.
Código ASCII ASCII generalmente se pronuncia "aski", es un acrónimo de American Standard Code for Information Interchange.
Este código asigna a las letras del alfabeto, a los dígitos decimales del 0 al 9 y a varios símbolos adicionales un número binario de 7 bits (poniéndose el bit 8 en su estado de apagado o 0).
De esta forma cada letra, dígito o caracter especial ocupa un byte en la memoria de la computadora.
Podemos observar que este método de representación de datos es muy ineficiente en el aspecto numérico, ya que en formato binario nos basta un solo byte para representar numeros de 0 a 255, en cambio con el código ASCII un byte puede representar unicamente un dígito.
Debido a esta ineficiencia, el código ASCII es principalmente utilizado en la memoria para representar texto.
Metodo BCD BCD es un acrónimo de Binary Coded Decimal.
En esta notación se utilizan grupos de 4 bits para representar cada dígito decimal del 0 al 9. Con este método podemos representar dos dígitos por byte de información.
Aœn cuando este método es mucho mas práctico para representación de números en la memoria en comparación al ASCII, todavía se queda por debajo del binario, ya que con un byte en el método BCD solo podemos representar dígitos del 0 al 99, en cambio, en formato binario podemos representar todos los dígitos desde 0 hasta 255.
Este formato es utilizado principalmente para representar números muy grandes en aplicaciones mercantiles ya que facilita las operaciones con los mismos evitando errores de redondeo.
Representación de punto flotante Esta representación esta basada en la notación científica, esto es, representar un número en dos partes: su mantisa y su exponente.
Poniendo como ejemplo el número 1234000, podemos representarlo como 1.123*106, en esta última notación el exponente nos indica el número de espacios que hay que mover el espacio hacia la derecha para obtener el resultado original.
En caso de que el exponente fuera negativo nos estaría indicando el número de espacios que hay que recorrer el punto decimal hacia la izquierda para obtener el original.
*****************************************
Sobre esta base, y con un poco de "ingenio", es facil traspasarlo a un sistema automatizado...
Suerte
68
« en: Miércoles 22 de Febrero de 2006, 21:46 »
Crea 5 etiquetas con indice, desde el 1 hasta el 5, y usa el siguiente ejemplo.
Private Sub Command1_Click() Dim vector(1 To 5) As Integer For i = 1 To 5 vector(i) = 0 Next i
For i = 1 To 5 Sigue = 1 While Sigue = 1 Numero = Obtiene_Numero Esta = 0 For j = 1 To i If vector(j) = Numero Then Esta = 1 End If Next j If Esta = 0 Then vector(i) = Numero Sigue = 0 End If Wend Label1(Numero) = "Campo " & i Next i End Sub
Public Function Obtiene_Numero() As Integer Sigue = 1 While Sigue = 1 Numero = CInt(10 * Rnd()) If Numero > 0 And Numero < 6 Then Sigue = 0 End If Wend Obtiene_Numero = Numero End Function
Esta es la base para tu problema, donde deberias reemplazar
Label1(Numero) = recordset.fields(i)
69
« en: Miércoles 22 de Febrero de 2006, 21:28 »
Quieres la verdad...
NO ENTENDI NADA de lo que explicaste...
podrias ser mas claro, y dar un ejemplo con MAS registros, de manera de poder vislumbrar como debe operar tu aplicacion...
70
« en: Miércoles 22 de Febrero de 2006, 21:25 »
1.- En la tabla donde guardas los datos, y en particular el campo SEXO, de que tipo lo tienes definido?
2.- Suponiendo que es de tipo numerico, y que la codificacion es del tipo: 0: No seleccionado 1: Masculino 2: Femenino entonces, deberias usar algo similar a :
if sexo.listindex>-1 then if sexo.text="Masculino" then DEAlumnos.rsCmdAlu!Sexo = 1 else DEAlumnos.rsCmdAlu!Sexo = 2 endif else DEAlumnos.rsCmdAlu!Sexo = 0 endif
3.- Suponiendo que es de tipo caracter y de largo 1, y que la codificacion es del tipo: " ": No seleccionado "M": Masculino "F": Femenino entonces, deberias usar algo similar a :
if sexo.listindex>-1 then DEAlumnos.rsCmdAlu!Sexo = mid(sexo.text,1,1) else DEAlumnos.rsCmdAlu!Sexo = "" endif
4.- Suponiendo que es de tipo caracter y largo 10, y que la codificacion es del tipo: " ": No seleccionado "Masculino": Masculino "Femenino": Femenino entonces, deberias usar algo similar a :
if sexo.listindex>-1 then DEAlumnos.rsCmdAlu!Sexo = sexo.text else DEAlumnos.rsCmdAlu!Sexo = " " endif
Existen muchas otras formas de enfrentar tu problema, depende de que tipo de dato debes guardar, te indicara la forma de resolverlo.
Espero te sirva
71
« en: Martes 21 de Febrero de 2006, 13:50 »
Private Sub Form_Load() Label1.Caption = "Bienvenido..." 'Activas el reloj. Recuerda que trabaja en milisegundos Timer1.Interval = 3000 End Sub
Private Sub Timer1_Timer() 'El reloj al llegar a los 3000 miliseg. realiza la siguiente accion Label1.Caption = "Seleccione su opcion..."
'Desconectamos el reloj, ya que solo queremos que lo haga una sola vez 'Si no lo desconectas, estara trabajando mientras este el formulario activo Timer1.Interval = 0 End Sub
72
« en: Martes 21 de Febrero de 2006, 13:46 »
Si me indicas tu e-mail, te puedo enviar un ocx SKIN para tus formularios.
73
« en: Jueves 16 de Febrero de 2006, 14:23 »
Debes tener claro que el trabajar con archivo .TXT son de acceso secuencial, por ende, dependiendo de lo que desees hacer lo que te indico lo podras adaptar para tu necesidad.
** Para escribir en archivo FORMA1 ** Este tipo de apertura, genera un archivo nuevo siempre. Por lo que, si existe ** previamente una version del mismo, lo pisa, perdiendose el anterior. 'Obtener numero de secuencia de archivo disponible NroArch = FreeFile 'Abrir el archivo Open <NombreArchivo> for output as #NroArch 'Escribir en el archivo Print #NroArch, <Dato1>,<Dato2>,... <Daton> 'Cerrar archivo Close(NroArch)
** Para escribir en archivo FORMA2 ** Este tipo de apertura, escribe al final del archivo. Por lo que, si existe el archivo ** lo que se escriba, lo realiza al final de este. ** Esta forma de apertura, es ideal para generar LOG de transacciones, donde ** vas registrando eventos de tus procesos, o realizar seguimientos a programas 'Obtener numero de secuencia de archivo disponible NroArch = FreeFile 'Abrir el archivo Open <NombreArchivo> For Append Access Write As #NroArch 'Escribir en el archivo Print #NroArch, <Dato1>,<Dato2>,... <Daton> 'Cerrar archivo Close(NroArch)
** Para leer desde un archivo 'Obtener numero de secuencia de archivo disponible NroArch = FreeFile 'Abrir el archivo Open <NombreArchivo> for input as #NroArch 'Leere registro desde archivo Input #NroArch, <Var1>, <Var2>,<Var3> 'Cerrar archivo Close(NroArch)
74
« en: Martes 14 de Febrero de 2006, 15:49 »
Forma 1:
EnMayusculas = UCASE(Palabra)
EnMinusculas = LCASE(Palabra)
Forma 2:
NuevaPalabra = StrConv( Palabra , Tipo )
donde Tipo es: 1= vbUpperCase <- Mayusculas 2 = vbLowerCase <- Minusculas 3 = vbProperCase <- En forma de titulo
75
« en: Martes 14 de Febrero de 2006, 15:42 »
1. Saber de calculos matematicos 2. Saber de legislacion laboral de tu pais 3. Conocer segmentacion de formulas
Suponiendo esto conocido, entonces: (Yo no conozco las legislacion laboral de tu pais, pero te dare un ejemplo de como opera en mi pais)
Un trabajador con $x de sueldo bruto, se le debe descontar un 10% para su pension de vejez y un 7% para su prevision de salud.
Entonces, si en nuestro ejemplo, el sueldo bruto es de $100.000.- entonces, $10.000 corresponden a fondo de pension y $7.000 corresponden a prevision de salud, por lo tanto, el trabajador recibira $100.000 - $10.000 - $7.000 = $83.000 que se traduce en una liquidacion de sueldo de la siguiente forma
DETALLE HABER DESCUENTO ============================== Sueldo 100.000
10% Pension 10.000 7% Salud 7.000
TOTALES 100.000 17.000
SUELDO LIQUIDO 83.000
Entonces, todo esto se traduce en formulas de la siguiente forma...
SueldoBruto = 100000
PorcentajePension = 10
PorcentajeSalud = 7
Pension = SueldoBruto * PorcentajePension / 100
Salud = SueldoBruto * PorcentajeSalud / 100
TotalHaberes = SueldoBruto
TotalDesctos = Pension + Salud
SueldoLiquido = TotalHaberes - TotalDesctos
Páginas: 1 2 [3] 4 5 ... 15
|
|
|