• Martes 13 de Mayo de 2025, 14:39

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 - Nebire

Páginas: 1 ... 17 18 [19] 20 21 ... 29
451
La taberna del BIT / Re: Evo
« en: Domingo 21 de Septiembre de 2008, 06:34 »
Cita de: "Edo"
Cita de: "Nebire"
Parece que chaves está consiguiendo insuflar su espíritu de odio, pero no pasará a la historia como Simón Bolívar (esa es su meta, pese a quien pese y cueste lo que cueste, mueran  los que mueran), lo hará como el payaso que es.
Es un payaso por que está para el pueblo y apoya al pueblo, mientras que el señor Bush es un "GRAN SEÑOR" por que lo que hace es ir a invadir otros países, tomar sus recursos y hacer daños como la que hizó en el WTC; al parecer eres bastante derechista; que pena que exista gente como tú, por eso es que tenemos gobernantes tan hp como lo es Uribe acá en Colombia.

Para ti el mundo es negro o blanco, no existen los colores. si alguien habla de Chávez asumes que idolatra a Bush. Pués te comunico que chávez es un payaso y que Bush es un mono, ambos artistas de circo, y me reiría de esos bufones si fueran eso, artistas de circo, pero como lideran países y ambos están locos lo que me produce es preocupación. De Uribe opino otro tanto, pero con Uribe mi planteamiento es distinto, es una persona seria traza sus  planes y respeta a todo el mundo es mjorable ? por supuesto que sí, pero hace falta alguien que se enfrente a él y lo gane y no sólo que gane como hizo chávez, no basta con ganar unas elecciones el trabajo viene después hay que diseñar y acometer proyectos pero proyectos realistas no utopías ni el cuento de la lechera que verborrea Chávez, mientras Uribe vive y deja vivir excepto a los terroristas de las FARC y mientras esa gente no entregue las armas será bueno para Colombia una política similar con Uribe o con otro al frente pero con mano dura a los delincuentes. Ser pobre no es una excusa para ser delincuente. Ser pobre no es una excusa para secuestrar a tu vecino o al de más allá. Ser pobre noes una excusa para matar y robar al que no es tan pobre como él.

452
La taberna del BIT / Re: Evo
« en: Domingo 21 de Septiembre de 2008, 06:25 »
Cita de: "fachamix"
Nebire ....... que clase de boludo sos vos ?????????????

sincerate hermano,.
La verdad si me insultas llamándome boludo luego no tengas las desfachatez de llamarme hermano, no puedes dar una cuchillada a alguien y 1 segundo después decir perdón o lo uno o lo otro si son ambas cosas debe mediar el tiempo y un proceso de cambio, pero a la vez no, es inchorente.

Cita de: "fachamix"
vos ..... antes de chavez en venezuela ...... habias escuchado hablar de venezuela ???????? por algunmotivo en particular ????????? .... NOOOO .... NOO habias escuchado NUNCA!!!!!....COMO PUEDE SER QUE NUNCA ANTES ALLAS ESCUCHADO NADA DEL 3 o 4 PAIS QUE MAS PETROLEO TIENE EN EL MUNDO ???????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Entiendo que a gente pueda tener diferencia de opiniones y tambien acepto que haya gente ignorante, parece que va a ser tu caso. Si repasas mis escasos mensajes verás que yo te he preguntado por la situación de Bolivia, porque ciertamente de Bolivia no tengo referencias directas y no me fío de los periódicos que hablan al son de quien lo hace,pero de Venezuela...? no he dicho nunca lo que tu afirmas de hecho creo que antes de que nacieras tú ya conocía con bastante detalle (no precisamente geográfico) la situación de Venezuela. Prefiero suponer que tienes escasa memoria para recordar lo que has leído antes que pensar que eres idiota por ajenarme cosas que no he dicho. Las mayúsculas son porque gritas o acaso crees que tengo problemas de vista para leer?. No te preocupes aún tengo buena vista y te recuerdo que el volumen de la voz no da la razón a nadie. Por cierto a mi no me molesta que escribas con mayúsculas pero hay gente que se siente molesta...

Cita de: "fachamix"

sabes porke ???? .... PORKE ANTES DE CHAVEZ ....... ERA NADA!!!!! ... NADA!!!! ... para el mundo era un almacen de petroleo que solamente le vendia a yankilandia.
 Para el resto del mundo un país que no es el suyo suele ser eso o algo parecido.... que es para ti Senegal ? ó Indonesia o Laponia ?, apuesto que lo mismo que para los habitantes de allí tu país algo más menos lejano y má  omenos conocido, puesto que no es tu país los detalles que llegan son incompletos y posiblemente erróneos, no obstante aunque haya países lejanos un determinado país si puede llamarte más la atención que el resto que lo circunda y tener más conocimientos del mismo.

Cita de: "fachamix"

me dan muchisima bronca tener que soportar la sola existencia de personas como vos..

Eso como debo tomarlo como que también me darías un balazo sólo por que no opino como tú ?.

Cita de: "fachamix"

 ..... pero tengo la esperanza de que puedas emitir un juicio un poco mas neutral y objetivo sobre este tema en particular...
 Joder, que juicio ni que leches, si yo no me he posicionado con nadie aún, sólo os he increpado  hacia una posición de lucha pacífica sin que medie la sangre ni las armas y lo otro que he hecho es pediros, especiamente a tí que lamentabas cierta situación en una zona de Bolivia que expliques como es la sitaución esa en concreto que hablabas de unas minas y en geneal del país, pero lejos de dar esas explicaciones sólo haceis propaganda de unos ideales que os ha infundido Chávez. Esa historia ya la conozco, en la revolución bolchevique los pasos fueron casi los mismos, insuflar a las masas que son fáciles de dominar por siu ignorancia (no me refiero a vosotros si no a la gente humilde en general) con promesas de comida y trabajo. simplemente os están usando para sus propósitos. si las cosas no se solventan democráticamente luego os costará 20 años de hambre y otros 40 de 'destierro' global. Ningún país quiere abiertamente establecer relaciones comerciales con genocidas que no sabenusar las reglas democráticas. No es culpa de nadie, esto es la forma de 'ser' de los países en el mundo, de ejemplo está Cuba ya al final de ese período y de ejemplo están Afganistán que tras la guerra ya llevan varios años mendigando ayudas por todo el mundo, Irak es quien ahora iestá inmerso en ese proceso de 20 años y podeis ver como semana tras semana sigue abiendo atentados... tardará lo menos 20 años en que los odios se encaucen ... Si todo eso es desfavorable porqué ese empeño en forzarlo a sacarlo de su cauce democrático ????

Cita de: "fachamix"
si chavez aparece cantando , o bailando en la tele, .... te puedo asegurar a que a los venezolanos les importan 3 pitos .... mientras el tipo haga bien las cosas.
Eso es tan relativo como saber a que se le llama hacer bien las cosas... Chávez es un bocazas, y por bocazas se mete no cantando o bailando en la tele que a fin de cuentas será en su casa si no metiéndose con otros países, por bocazas se mete con Uribe, se mete con Bush se mete con Aznar y se mete con todo el que no le cae bien. como dirigente de un país eso está demás, debe remitirse a gobernar su país y de lo que pase fuera callarse y si no se calla entonces debe aceptar que los de fuera también se metan con él. Es claro que ha buscado el enfrentamiento con Uribe en varias ocasiones. Al rey de España después de despreciarle todo lo que quiso hace relativamente pocas semanas como 'necesitaba' comprar armamento pués tuvo que agachar las orejas y trgarse sus propias palabras y todo lo que dijo por bocazas sólo ha servido para quedar en ridículo y pasar vergüenza. No hay nada más vergonzoso que proponerte soberbio y luego ir pidiendo limosna a todo al que has ido despreciando.

Cita de: "fachamix"
el tipo o es ningun dictador ..... el tipo perdio en la elecciones por la reforma constitucional .... no lo olvides.
No lo olvido Fachamix, y tú ?, has olvidado que dió un golpe de estado militar a principio de los 90 ? o todavía eras muy pequeño para saber que estaba ocurriendo?.

Cita de: "fachamix"
y cuando escuches a algun venezolano criticar a chavez .... preguntale a que se dedica, a que se dedican los padres, que apellido tiene......y te vas a dar cuenta que no vas a encontrar ni un solo obrero , ni una sola persona pobre que lo critique..... mucho menos la clase media.....en fin .
Ojo, yo no tengo nada en contra de los venezolanos sólo de su representante que es un ejemploar de circo y temo que arrastre con su ambición al país a una era de atraso social mucho más severa de lo que muchos se quejan. Los plátanos salen de las plataneras y el petróleo de subsuelo, pero otras cosas hay que construirlas y el petróleo a diferencia de las plataneras no es eterno. Sabes con todo Fachamix tu eres tenso en la palabra pero al fin y al cabo no veo en ti el rencor que se inventa eternal idol.

453
Visual Basic para principiantes / Re: check list
« en: Domingo 21 de Septiembre de 2008, 05:21 »
Cita de: "F_Tanori"
No quiero interrumpir, todo esta muy bien con el detalle que la propiedad multiselect no se puede modificar si la propiedad style esta como checkbox

Saludos
Perdona no me expresé con claridad.... decía que cuando activas la propiedad style a checkbox  OoooOooooO la propiedad multiselect a simple o extended ya está... en ambos casos se pueden activar más de un único elemento, luego sólo acordarse de usar la propiedad .selCount para conocer cuantos hay activados aunque para saber quienes si hay que recorrer la lista.

Es común usando el  'lenguaje' expresar 2 opciones con YYYY lo que se presta a confusión, en programación como son 2 casos decimos este caso y este otro caso, que ciertamente en programación suele llevar a confusión...

Procuraré ser más puntual en este tipo de detalles.
Eso si mi inadecuada expresión no invalida el hecho de que activando el checkbox ya se pueden hacer múltiples selecciones al igual que usando la propiedad multiselect a un valor simple o extended.

Gracias F_Tanori, es bueno puntualizar porque a veces los novatos se lo toman muy al pie de la letra...

454
Aprovechando que tengo un rato libre voy a exponer una función que es posible que la tengais parecida o muy distinta, nunca se sabe.

La función como comentaba más arriba trata de contar las palabras que tiene un texto. Por comparativa (nuca se me ha ocurrido verificar antes el potencial de esta función) he realizado otra equivalente que al hilo de lo que venimos hablando es más breve pero tiene un rendimiento bastante menor.
A ambas funciones, como se aprecia se han 'inyectado' dentro de un bucle de 1000 reps. para comprobar diferencias ya que si no resulta difícil apreciarlo en su justa medida.

Código: Visual Basic
  1.  
  2.  
  3. Public Function Contar_Palabras1(texto As String) As Long
  4.     Dim txt() As String
  5.     Dim k As Long ' contador
  6.     Dim i As Long ' contador del bucle
  7.    
  8.     ti = Timer
  9.     For A = 1 To 1000
  10.         txt = Split(texto, " ")
  11.         If texto <> "" Then
  12.             If UBound(txt) = 0 Then
  13.                 If Trim$(txt(0)) <> "" Then
  14.                     Contar_Palabras1 = 0: GoTo salir ' Exit Function
  15.                 Else
  16.                     Contar_Palabras1 = 1: GoTo salir ' Exit Function
  17.                 End If
  18.             End If
  19.         End If
  20.        
  21.         For i = 0 To UBound(txt)
  22.             If txt(i) <> "" Then
  23.                 k = k + 1
  24.             End If
  25.         Next
  26.     Next
  27.     Contar_Palabras1 = k
  28.  
  29. salir:
  30.     MsgBox Timer - ti
  31.  End Function
  32.  
  33.  


La siguiente función es bastante menos lógica en cuanto a idearla, sirve de  contraste para la comparativa, usa un bucle do

Código: Visual Basic
  1.  
  2. Public Function Contar_Palabras2(texto As String) As Long
  3.     Dim k As Long  ' contador
  4.     Dim p As Long ' posición en la cadena
  5.     Dim txt As String '
  6.    
  7.     ti = Timer
  8.    
  9.         For A = 1 To 1000
  10.  
  11.         txt = Trim$(texto)
  12.         If txt = "" Then Contar_Palabras1 = 0: Exit Function
  13.        
  14.         Do
  15.             p = InStr(txt, " ") ' espacio entre comillas
  16.             If p > 0 Then       ' mientras haya espacio entrará aquí...
  17.                 k = k + 1
  18.                 txt = Trim$(Mid$(txt, p + 1)) ' elimino la palabra más a la izquierda y quito los espacios extras hasta la siguiente palabra.
  19.             Else                  ' cuando no haya más espacios, ya no quedan más palabras, devolvemos el resultado
  20.                k = k + 1
  21.                Exit Do
  22.             End If
  23.         Loop
  24.     Next
  25.     Contar_Palabras2 = k
  26.     MsgBox Timer - ti
  27. End Function
  28.  
  29.  

Puede notarse que si declaamos el parámetro byval la misma variable del parámetro podría usarse en vez de 'txt', que por otro lado ha sido forzado por el bucle de repetición externo.
Aunque parezcan muy similares, lo cierto es que los resultados son bastante diferenciados.

El texto empleado fue un archivo en la carpeta de windows, concretamente el de 'wmsetup.log' que en mi caso pesa 9'13kb. y contiene 1.056 palabras, con el bucle de 1000 repeticiones halló:

1.056.000 ----- 3'7 sg   funcion 1
1.056.000 -----16'01 sg. función 2

El resto del código para probarlo son 2 botones de llamada uno para cada función un label indicando las palabras encontradas y un richtextbox donde se carga el fichero y cuyo texto es el empleado.
El código 'extra' para probarlo es el siguiente:
Código: Visual Basic
  1.  
  2.     Private Sub Form_Load()
  3.     Rtxt.FileName = "C:WINDOWSwmsetup.log"
  4. End Sub
  5.  
  6. Private Sub Command1_Click()
  7.     Label1.Caption = "Palabras totales= " & Contar_Palabras1(Rtxt.Text)
  8. End Sub
  9.  
  10. Private Sub Command2_Click()
  11.     Label1.Caption = "Palabras totales= " & Contar_Palabras2(Rtxt.Text)
  12. End Sub
  13.  
  14.  

455
Cita de: "m0skit0"
Lo que me lleva a preguntarles:
¿Qué creen que compensa más: que el código se ejecute más rápido o que sea más legible?  &lt;_&lt;
Interesante pregunta. A título personal (porque de forma general dudo que pueda darse una respuesta exacta.... y que todo el mundo esté de acuerdo) creo que uno tiene que hacer un balance en su código.

Esto es, si tu programa vuela entonces puedes darle más importancia a la legibilidad y la brevedad (a menudo están reñidos otras no), en cambio si el programa adolece de lento, no es plan pretender ser tan legible. a menudo la falta de claridad en un programa la acabamos supliendo con comentarios. También cuenta si tu código ha de pasar por otras manos distintas a las tuyas, ahí la claridad tiene más importancia. Por otro lado a medida que los procesadores son más rápidos y las memorias más grandes tiene menos relevancia la velocidad. Lo importante es que uno sepa fijar el límite.

Por ejemplo uno puede escribir un código denso y oscuro en 5000 líneas y ser muy veloz en cambio quizás puede hacer lo mismo con sólo 500 líneas pero recurriendo por ejemplo a librerías externas. El caso es que 500 líneas será un código más fácil de seguir pero por otro lado al ser las librerías externas implican cierto oscurantismo porque requiere estudiarse esas librerías, si son de uso frecuente como las API de windows, se hace mucho más llevadero pero cuando son de diferentes programas y un puñado de cada uno, tienes menos libertad vas a veces forzado por las limitaciones de las librerías y por la manera en que fueron programadas. entonces comparativamente quizás esas 5000 líneas densas y oscuras quizás compensen sobre esas 500. Pero como digo cada uno en su caso debe sopesarlo. dudo que pueda generalizarse si no es diviiidiendo en grupos e indicar si uno pertenece a ese grupo a tal vez al otro.

456
Publicaciones y e-books / Re: Help-desk Libros
« en: Sábado 20 de Septiembre de 2008, 11:18 »
No se muy bien que pides, si que alguien te envíe el libro por giro postal o ... Una simple búsqueda por emule (que supongo sabes lo que es), arroja una variada e interesante lista de libros sobre el tema.



457
La taberna del BIT / Re: Evo
« en: Sábado 20 de Septiembre de 2008, 10:33 »
Cita de: "Eternal Idol"
Lo importante es el mensaje. Yo no vi ninguna explicacion tuya, tu aporte se resume en lo anterior.

Sólo digo una cosa más, si muchos en Bolivia piensan como tú y como fachamix, la cosa se va a liar y de las decenas de muertos se pasará a millares o cientos de millares, y entonces espero que no seais tan bocazas y que corrais a ayudar a quien sea que defendais.

Cita de: "Eternal Idol"
Y QUE SE LEA COMO SE TENGA QUE LEER, ASI COMO YO TENGO QUE LEER ASQUEADO ESTA CLASE DE MIERDA IMPERIALISTA.
Que es mierda imperialista ?. Decir que las cosas se intenten arreglar sin derramar sangre ?. Creo que ya se os ha llenado las orejas de la palabra imperialismo de tanto oir a Chaves, los imperialismos que quedaban en el siglo XX se limitaron hacia la mitad de siglo donde se abordó que todos los países deberían abandonar las colonias que aún poseían, casi todos las abandonaron en menos de 20 años y sólo fue quedando una colonia inglesa en China que fue cedida definitivamente en el 2000. No hay más imperialismos que los fantasmas de Chaves que ve por todas partes.

Cita de: "Eternal Idol"
un insignificante personajito de foro que viene a vomitar su odio de derecha, bien a tono con la dependencia.
Alguien es de derechas sólo porque no se aviene a tus palabras ?.  Yo no he vertido ideales políticos de ningún signo para que tú sques conclusones de ningún tipo, sólo he señalado que las palabras en manos de bocazas hacen más daño a sí mismo que a los demás y que a la hora de la verdad, si irremediablemente sucediera lo peor (que parece ser que es lo que deseais) es probable que se acaben escondiendo.

Basta de palabras, coged el fusil hoy mismo e iros a Bolivia si creeis que es eso lo que hace falta, pero no insulteis ni amenaceis ni os hagais aborrecer, los que vemos los acontecimientos desde fuera no perdonaremos brabuconadas llegado el momento, ni tenderemos tiendas de campaña, ni fletaremos aviones. Si os odiais  mataros una parte a la otra (y no pareis hasta que no acabeis, sino luego los que queden querrán revancha 20 años más tarde), al menos la parte que quede en pie espero que viva en paz, o acaso la mitad volverá a acusar a la otra parte...  

En cualquier caso no veo que deis explicaciones de la situación de Bolivia tan sólo intoxicais con mensajes de revolucionarios de plastilina...  Lo siento la verborrea inútil, la queja fácil y la propaganda gratuita no llega más allá de las fronteras que os circunscribe, explicad si hay algo que explicad o callad, y si pensais que procede por que no hay otra manera pués dejad las palabras e id a lo que indico en el párrafo anterior...

Parece que chaves está consiguiendo insuflar su espíritu de odio, pero no pasará a la historia como Simón Bolívar (esa es su meta, pese a quien pese y cueste lo que cueste, mueran  los que mueran), lo hará como el payaso que es.

458
La taberna del BIT / Re: Evo
« en: Sábado 20 de Septiembre de 2008, 09:55 »
Cita de: "Edo"
Que bueno que no eres moderador, realmente no sabes interpretar un post.
No, no soy moderador ni nunca lo seré.

Sobre que no sé interpretar un post, vamos a dejarlo... Las palabras sólo se interpretan cuando están envueltas a propósito (o no) , pero cuando están claras no hay nada que interpretar, se dice lo que se dice sea feo o malo, luego siempre se puede dar la vuelta y decir que donde dije, dije digo Diego y listo.

Por  lo demás, la violencia si se responde con violencia, entonces el que esté abajo no es digno de estar arriba porque queda claro que estando arriba hará y será igual que el que ahora está arriba, por tanto sólo supone cambiar el poder de manos. Eso no es solución de nada.

Las revoluciones han de ser pacíficas, hoy día es fácil pulsar un botón y mueren 100.000 la cosa es muy distinta de siglos atrás donde se requería mucho esfuerzo para poco alcance.

Para ejemplo tenemos al pato Donald, digo a Chaves que va, paso a paso está convirtiendo a Venezuela en un país bananero. Ya veremos que inventa, puesto que se aprobó democráticamente por sufragio universal que no se pueden hacer más mandatos y éste es el último.

De todos modos si de morder se trata acaso creeis que la oveja morderá al lobo ?. El lobo está siempre mejor preparado para eso, por eso la oveja debe (si se considera lista) buscar otros medios que la fuerza. Pero bueno a lo mejor hablo a oídos sordos. A lo mejor creeis que en vez de la cabeza cortar el pie para salvar el resto, va a ser la el pie el que corte la cabeza para salvar al resto, sin pie siempre se podrá vivir, pero sin cabeza incluso siendo la parte mala, irremediablemente todo el resto sigue su suerte.... pero ya hemos dicho que acaso el pie no sea todo lo listo que debiera...

En cualquier caso el tono para decir las cosas no debe pasar ciertos límites. Sigo pensando que una buena explicación de que sucede en tal sitio o en otro es más adecuado y más provechoso que decir tonterías de revolucionario de estampa.

459
Visual Basic para principiantes / Re: check list
« en: Sábado 20 de Septiembre de 2008, 04:27 »
Creo entender que quieres realmente un check en una lista.

si es así, el control listbox y combobox te lo permiten sólo debes cambiar la propiedad  'Style' a chechbox y la propiedad multiselect a 'simple' ó 'extended'. entonces ya podrás seleccionar varios elementos mostrando un check para cada ítem de la lista.

460
Bueno comentaros que el otro día respondí, pero era hora de cenar y no había terminado el mensaje después al enviar no me di cuenta de que habría caducado la sesión, me deslogó y me dió pereza reconstruir el mensaje (porqué estos foros no pueden recuperar el mensaje, hace 10 años se entiiende pero hoy día esto es intolerable, en fin...)

Mencionaba que yo no considero un error una coma al final, de más o de menos ya que de hecho la función que presentaba ilson quedaba 'guarreada' precisamente por querer mantener esa coma y por lo del númerito delante que 'pa qué ?'. La coma no estorba porque a menudo debe concatenarse un resultado con otro y por tanto suele tenerse que meter cuando en la función se lo extrajo.

También os presentaba otra manera de resolver la función sencilla y con mucha claridad aunque ligeramente más lenta.

Señalaba que la función de Nilson puede mejorarse a lo siguiente (prescindiendo del numerito que no sirve para nada y que lleva siempre coma al final excepto que sólo haya un carácter.)

Código: Visual Basic
  1.  
  2. Function CadenaASCII(CadenaNormal As String) As String
  3.     Dim k As Long, cadena As String
  4.    
  5.     On Local Error GoTo errorSobrepasa:
  6.    
  7.         cadena = ""
  8.         'If CadenaNormal = "" Then Exit Function
  9.         If Len(CadenaNormal) > 16383 Then
  10.              MsgBox "Existen posibilidades de que se produzca un error..."
  11.         End If
  12.        
  13.         For k = 1 To Len(CadenaNormal)  ' el último carácter lo quedamos fuera del bucle
  14.           cadena = cadena & Asc(Mid$(CadenaNormal, k, 1)) & ","
  15.         Next ' al finalizar el bucle, k todavía aumenta en 1
  16.  
  17.     CadenaASCII = cadena
  18.     Exit Function
  19.    
  20. errorSobrepasa:
  21.      MsgBox ("Cada carácter de entrada genera entre 2 y 4 caracteres de salida. en VB6 el tamaño máximo de una cadena son 65535 caracteres, dicho valor se ha alcanzado con el " & " k ésimo carácter de la cadena de entrada..." & vbCrLf & Err.Description)
  22.      CadenaASCII = cadena
  23. End Function
  24.  
  25.  
  26.  


Yo proponía la siguiente función ligeramente más lenta que esta anterior pero bastante más clara y breve
Código: Visual Basic
  1.  
  2. ' bytes con comas
  3. Private sub Cadena_A_BytesCC(byref cadena As String, optional concat as string=",")  ' nótese el byref puesto a propósito
  4.          Dim s() As String
  5.        
  6.         ReDim s(0 To Len(cadena))
  7.         For k = 1 To Len(cadena)
  8.             s(k) = Asc(Mid$(cadena, k, 1))
  9.         Next
  10.        
  11.         cadena= Join(s, concat)
  12. End Function
  13.  
  14.  
De esta fnción decir que la coma en vez de aparecer al final aparecerá al principo, para el caso es lo mismo siempre que se tenga en cuenta.
Como puede verse a esta función le he añadido un parámetro opcional que sirve para 'meter'  cualquier cadena y no sólo comas, lo que le daría más versatilidad sin apenas código adicional.

La función inversa resulta igualmente breve:
Código: Visual Basic
  1.  
  2.   ' nota la cadena puede empezar tanto con coma como con cifras, pero si empieza con coma debe ir detrás números, la cadena no puede acabar en coma, esta función es la pareja de la anterior, que deja cadenas con comas delante, no es pareja de una función que deje comas detrás.
  3.   Private Function convertir(cadena As String) As String
  4.       Dim s() As String, ini As Byte
  5.      
  6.      on local error goto errorChr
  7.       s = Split(cadena, ",")
  8.       ini = IIf(Left$(cadena, 1) = ",", 1, 0)
  9.    
  10.       For k = ini To UBound(s)
  11.           s(k) = Chr$(s(k))
  12.       Next
  13.       convertir = Join(s, "")
  14.      exit function
  15. errorChr:
  16.      msgbox "La cifra ' " & s(k) & " ' no está dentro del rango 0-255 (byte)" & err.description
  17.    End Function
  18.  
  19.  
se supone que nunca habría de ocurrir chr$(23456) si se creó usando la otra función.... pero bueno se ha incluído un tratamiento de error...
Y en otro momento os coloco una función que totaliza las palabras que hay en un texto, para lo que pide nuestro amigo Nilson...

461
Visual Basic 6.0 e inferiores / Re: Valor ????
« en: Viernes 19 de Septiembre de 2008, 02:11 »
Cita de: "ciber_lep"
Saludos foreros

espero tengan el tiempo para ayudarme.

En un formulario ejecuto una sentencia SQL hacia un servidor Mysql. La sentecia es esta.

SELECT orden,if( isnull(fecI) or fecI='',if( isnull(fecEn) or fecEn='',now(),fecEn),fecI) as fecha1,recibio,fecEn,if(isnull(hora),'10:00:00',hora) as hora1,....
Lo demas del SQl

el asunto es que cuando ejecuto esta sentencia en el servidor me lo ejecuta de forma perfecta.

pero cuando lo hago desde la Aplicacion el recordset me devuelve un valor ?????

el cual no logro capturar ni con if ni con nada!!!.  He estado buscando en Google... y lo voy a seguir haciendo...
pero quize consultar con los expertos, de golpe les ha pagado algo asi.  Si pueden ayudarme de antemano Gracias....... :D

Este tipo de problemas casi siempre suele ser un problema de comillas.... en el servidor al no requerir ciertas comillas va perfecto, pero al meterlo en código debe acotarse correctamente lo que debe interpretar como un literal... A mi a veces me ocurre cuando ejecuto un shellExecute basytante complejo donde una linea de comando llama a su vez a otro comando con su correspondiente línea de comando etc... te acabas liando por culpa de las comillas que no están donde debieran.... Naturalmente suponiendo que no tengas un problema de conexión, autenticación, etc..

462
Visual Basic 6.0 e inferiores / Re: Abrir formulario
« en: Viernes 19 de Septiembre de 2008, 02:02 »
Cita de: "valenciaruben"
Cordial Saludo.
Tengo el nombre de un formalario almaacenado en un string. cómo hago para abrir el formulario.

variableString.show 'esto no funciona.
Unas variable tiene un valor, su contenido es una cadena, lo que se pasa a show es el handle del formulario, hay algún modo pero creo que te complicas en exceso. en vez de guardar el 'string', el nombre es una propiedad con la que sólo se puede trabajar si está cargado en memoria,  deberías guardar el 'Hwnd' para ello luego usas la API:
Código: Visual Basic
  1.  
  2. 'nota si la declaración la pones en un formulario debes declararla private, en un módulo puede perfectamente ser public.
  3. Public Declare Function ShowWindow Lib "user32" Alias "ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
  4.  
  5.  

Pongamos que al arrancar la aplicación tienes 3 formularios el principal y otros 2.
Código: Visual Basic
  1.  
  2.     dim elForm as long
  3.     private sub Form1_load
  4.         elform=form2.Hwnd
  5.    end sub
  6.  
  7.   private sub command1_click
  8.         call ShowWindow(elForm,vbNormal) ' et voilá allí aparecerá...
  9.   end sub
  10.  
  11.  

El 2º parámetro de la api indica como ha de aparecer, minimizado, maximizado, normal, ovulto....

463
Visual Basic 6.0 e inferiores / Re: Como se imprime un PictureBox?
« en: Viernes 19 de Septiembre de 2008, 01:41 »
Cita de: "Nilson Yair"
Y una ultima...
Como dibujar en otro picture (por ejemplo Picture2) lo que esta en un picture Diferente (por ejemplo Picture1)... estoy usando metodos graficos (Lineas, puntos, circulos, rectangulos... etc.)?


Gracias... :good:

picture2.picture=picture1.image

Cita de: "Nilson Yair"
Edo, mira... el codigo de esa pagina (VBHelper) solo imprime el picture en caso de que sea una imagen cargada (es decir, un dibujo cargado en el picture como GIf, BMP, JPEG, etc..) pero ocasiona un error al imprimir un picture (que no tenga imagen como BMP, GIF, etc) y que solo tenga dibujos por metodos graficos.
Citar
Edo:

Printer.PaintPicture
http://www.vb-helper.com/howto_print_picture_large.html

Edo, mira... el codigo de esa pagina (VBHelper) solo imprime el picture en caso de que sea una imagen cargada (es decir, un dibujo cargado en el picture como GIf, BMP, JPEG, etc..) pero ocasiona un error al imprimir un picture (que no tenga imagen como BMP, GIF, etc) y que solo tenga dibujos por metodos graficos.

if picture1.picture=0 then picture1.picture=picture1.image

464
Esa misma función  puede optimizarse ... y no precisa señalar cuantos caracteres tiene.
el trim no deberías hacerlo ya que si la idea es convertir una cadena de texto a una equivalente numérica estarías eliminado información, si resultara necesario hacerlo entonces debe especificarse claramente 'quitar espacios a ambos lados y convertirla a....' pero entonces el nombre de la función habría que cambiarla ya que así se prestaría a confusión.

Por ejemplo:
Código: Visual Basic
  1.  
  2. Function CadenaASCII(CadenaNormal As String) As String
  3.      dim k as long, cadena as string
  4.    
  5.      on local error goto errorSobrepasa:
  6.      if cadenanormal="" then exit function
  7.      if len(cadenanormal)=1 then
  8.          CadenaASCII= asc(cadenanormal)
  9.         exit function
  10.      else
  11.           if len(cadenanormal)>16383 then
  12.                msgbox "Existen posibilidades de que se produzca un error..."
  13.           end if
  14.      end if
  15.          for k=1 to len(cadenanormal)-1  ' el último carácter lo quedamos fuera del bucle
  16.            cadenanormal=cadenanormal & asc(mid$(cadenanormal,k,1)) & ","
  17.          next ' al finalizar el bucle, k todavía aumenta en 1
  18.          cadenanormal=cadenanormal & asc(mid$(cadenanormal,k,1)) ' tras el último carácter no añadimos la coma
  19.  
  20.         CadenaASCII=cadenanormal
  21.         exit function
  22. errorSobrepasa:
  23.      msgbox "Cada carácter de entrada genera entre 2 y 4 caracteres de salida. en VB6 el tamaño máximo de una cadena son 65535 caracteres, dicho valor se ha alcanzado con el " & k " ésimo carácter de la cadena de entrada..." & vbcrlf & err.description
  24.      CadenaASCII=cadenanormal
  25. end sub
  26.  
  27.  
Simplemente quitamos las comprobaciones , enlentecen el trabajo y solo va a entrar en las comprobaciones 1 vez cuando es el primer carácter, pero se comprueba con cada carácter, en todo caso ese carácter hacerlo antes del bucle y para el último carácter lo mismo, sólo entrará en el último ciclo del bucle por tanto acortamos el ciclo en una unidad y al final añadimos el último carácter, pero ahorrándonos , las comprobaciones con cada carácter.

Por cierto tu función dará error cuando le pases una cadena de cierto tamaño... lee los msgbox que he puesto en el código.
En otro momento te pongo una función de esas que pides...

465
Visual Basic 6.0 e inferiores / Re: Calendario para Reservar Fechas
« en: Lunes 15 de Septiembre de 2008, 04:24 »
La idea es que si tienes 100.000 registros sería en efecto excesivamente lento compararlo con todos los registros.

Por eso hay que hacerlo a la inversa...
Creas unas tablas llamadas 'enero' febrero.. diciembre ...
cada mes cuenta con 2 (ó 4 y más campos según sea el caso)
los campos son Dia numérico y libre buleano
rellenas la tabla inicialmente con todos los registros propios del año o de la temporada...
 registro paa cada tabla: en la tabla enero
dia 1 ... 31, al crearse se crean con el campo libre=true
para febrero: dia =1... 28  ídem

Ahora cuando vayas a hacer una reserva sólo tienes que hacer en mitabla=elmes el  'where' para usar la tabla del mes que se quiere hacer la reserva y en ese día   elregistro=eldia and libre=true y si libre es true, acepta la entrada del registro y cambias el registro a false.

El tercer campo que te indicaba es para casos en los que se acepte un número máximo de reservas, por ejemplo si son camas de un albergue de montaña y tiene pongamos 7 camas, necesitarías un tercer campo que señalara camasExistentes y un 4º camas ocupadas, en ese caso podrías eliminar el campo 'libre' si cambiaras la sentencia  por 'and camasOcupadas<camasExistentes'...

Resumiendo aunque tengas 100.000 registros sólo precisas mirar uno el del mes y día pedido... cuando esté libre se marca ocupado y cuando esté ocupado se deniega otra reserva para dicha fecha. Si el número de reservas posibles es mayor que uno, entonces haces el cambio que te anoté antes, y queda que mientras en ese mes y día las ocupadas sean menor que las existencias se acepta la reserva y se suma 1 a ocupadas al registro de ese día y si la ocupadas=existencias se deniega la reserva...

Un año solo tiene 365 días, o bien 12 meses con sus alrededor de 30 días, por tanto por muy mal que diseñaras tu sentencia nunca tendrías que buscar entre más de 365 registros indistintamente de que haya 1 millón de registros en la BD, pero de hecho sólo necesitas compararlo con un registro combinando campos....

Las fechas tienes que mirarlas como los 'productos', el género los clientes se introducen en su tabla correspondiente pero si un cliente compra 10 sacos de patatas, hay que actualizar el alamacen de acuerdo a las existencias, así en el caso de fechas, la fecha se 'agota' y debe marcarse...
Además debes fijarte que si hago una reserva nunca pueda hacer una reserva para ayer, ni para un día ya pasado, por tanto si el año marcado es el actual el mes no puede ser anterior al presente y si el mes seleccionado es el actual el día no puede ser menor que al actual ...

466
VB .NET / Re: TabControl
« en: Viernes 12 de Septiembre de 2008, 18:50 »
El control tab mantiene una colección de 'paneles' de las fichas, debes acceder a cada uno de ellas no sólo a la actual.

Para ello recorre la colección, por ejemplo con un bucle for
Código: Visual Basic
  1. For k = 0 To TabControl1.TabCount -1...    Next
  2.  


y luego accediendo a cada ficha por ejemplo así:
Código: Visual Basic
  1. If TabControl1.TabPages(k).BackColor = Color.Black Then ...  End If
  2.  


queda claro que tabpages(k) es la ficha x de la colección...
en el código de ejemplo recorro las fichas para saber si tienen su color de fondo a negro... así el problema está en el códgo de tu botón 'limpiar' ...

Si no te aclaras pon el código que tienes en ese botón para 'limpiar' los textbox del tabcontrol....

467
VB .NET / Re: Leer datos del Dni Electronico
« en: Viernes 12 de Septiembre de 2008, 18:23 »
Para eso tendríais que enteraros que empresa realiza el software para los chips y ya de ahí mirar si tienen algún software público tipo OCX
 que exponga un puñado de funciones a las que sea permitido acceder.

Si ya teneis instalado un sistema, como señala 'cataro' entonces sería más fácil pués basta buscar que librerías son las implicadas de ahí podeis obtener la info de la empresa o bien si no tropecientos mil archivos tomar el nombre de las librerías y en 'san-gugel' hacer una búsqueda, posiblemente exista algún código de ejemplo para acceder a dichas funcionalidades...

Con lo que sea que encontris sería bueno que dejarais respuesta por aquí así los futuros interesados ya podrían avanzar algo más en esta cuestión.

468
Visual Basic 6.0 e inferiores / Re: Transpariencia a los formularios
« en: Viernes 12 de Septiembre de 2008, 18:02 »
Otro código de ejemplo. Pongo el código y doy algunas explicaciones... y las diferencias con le código de nuestro amigo Nilson

Código: Visual Basic
  1.  
  2. ' en un módulo
  3.  
  4. '  declaraciones de API
  5. Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
  6. Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  7. Public Declare Function SetLayeredWindowAttributes Lib "user32.dll" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
  8.  
  9. ' función que realiza
  10. Public Sub SetTransparencia(elHwnd As Long, elColor As OLE_COLOR)
  11.     Const G_E = &HFFEC
  12.     Const W_E = &H80000
  13.     Const LW_KEY = &H1
  14.     SetWindowLong elHwnd, G_E, GetWindowLong(elHwnd, G_E) Or W_E
  15.     SetLayeredWindowAttributes elHwnd, elColor, 0, LW_KEY
  16. End Sub
  17.  
  18.  
  19. ' en el formulario
  20.  
  21. '  pongamos el backcolor del formulario en un color que raramente vayamos a usar, por ejemplo un color rosa.
  22. '   y colocamos un picture de ejemplo, Probad a cambiar el color de fondo del picture, vereis que sólo se hará transparente las partes que coincidan con el color que declaramos....
  23. Private Sub Form_Load()
  24.         Call SetTransparencia(Me.hwnd, Me.BackColor)
  25.         Call SetTransparencia(picture1.hwnd, Me.BackColor)
  26. end sub
  27.  
  28.  

El código indicado por Nilson, establece transparencia por nivel, el que yo expongo, lo hace por color, quien decide que sea uno o lo otro es la constante que Nilson llama 'LWA_ALPHA' y yo 'LW_KEY', que es el parámetro dwFlags. Cuando el valor es 2 se aplica transparencia por grados y para ello se usa el parámetro bAlpha en cambio si usamos el valor 1 entonces la transparencia se realiza en base a un color, es decir todas las áreas que coincidan con ese color se harán transparente, lo cual es ideal para hacer formularios 'recortados', el color se pasa en el parámetro 'crKey'. Como se menciona en el código salvo que lo tengamos pensado explícitamente así, el color debe ser uno que no acostumbremos a usar nunca, para evitar que por descuido un objeto de nuestro formulario haya 'desaparecido'.

Si en dwFlags marcamos 2 para indicar tansparencia por grados y establecemos un color, crKey (el color) se ignora y no produce ningún error, del mismo modo si en dwFlags indicamos el valor 1, bAlpha (el grado de transparencia) igualmente se ignora, sea el valor que sea el que se ponga.

469
La taberna del BIT / Re: Atentado en Cali.... Rianse de los periodicos
« en: Martes 9 de Septiembre de 2008, 12:17 »
Efectivamente a mi, aparte de las víctimas inocentes del ataque terrorista, lo que me preocupa es esto 'La Policía debió acordonar la zona, pues varios desconocidos quisieron aprovechar el caos que siguió al atentado para saquear algunos locales comerciales que resultaron afectados por la explosión. Incluso, debieron hacer ráfagas al aire para disuadir a los saqueadores.' que cita el primer periódico y esto  otro 'La Policía debió acordonar la zona, pues varios desconocidos quisieron aprovechar el caos que siguió al atentado para saquear algunos locales comerciales que resultaron afectados por la explosión. Incluso, tuvieron que hacer ráfagas al aire para disuadir a los saqueadores'  por lo que parece que en eso si están de acuerdo.

Algo como ese párrafo en el titular es una señal clara y muy expresiva del escaso respeto que se tiene a los demás y a la democracia, cuando se necesitan policías y tiros para que 'OTROS' ciudadanos inocentes no saqueen cual buitre carroñero a las víctimas inocentes. Y sobre todo es señal de que va para largo no ya el proceso de paz de los terroristas colombianos sino de una reeducación general en la democracia a todos esos 'otros ciudadanos inocentes'.

470
La taberna del BIT / Re: Evo
« en: Martes 9 de Septiembre de 2008, 11:54 »
Hola Fachamix, tu en tu 'tinta' como siempre.... sólo quería comentarte que tu frase ''Para poder limpiar el sistema actual hay que hacerlo de un escobazo, o de un balas0'' puede interpretarse como una amenaza, no es que lo crea es que es así, incita a la violencia abiertamente y es realmente un delito, una cosa es que lo piensas y lo comentes con tus amigos y otra que lo pongas sin tapujos, escondes el 'hijo de puta' que al fin y al cabo no de pasa de un mero insulto y dejas esto que con la ley de cualquier país es un delito.

Mi recomendación es que lo retires lo de 'balazo' por unos puntos suspensivos  así cada cual puede imaginar lo que quiera pero nadie te podrá acusar de algo que no has llegado a decir.

Si yo fuera moderador, desde luego borraba esa parte del mensaje y te daba un toque de atención, más bien en beneficio tuyo porque a nadie más que a ti puede perjudicar ese tipo de comentarios.

La verdad prefiriría que explicaras detalladamente esto de ''... como se manejan las minas en bolivia,y como y a donde se destina su ganancia.'' , porque creo que eso sería para los que no conocemos la situación exacta del país más útil que simplemente lanzar insultos o amenazas y quejas.

471
La taberna del BIT / Re: Me despido
« en: Martes 9 de Septiembre de 2008, 11:44 »
Moskito, creo que aludes razones no muy justificadas. Si de algo eres víctima acaso lo eres de tu ego personal.

Supongo que la dinámica de esos 'otros foros' induce a muchos foreros a pensar que todo vale, y como dice F_Tanori  ''...te das cuenta que se convierte en molestia cierto tipo de mensajes de usuarios que los publican sin nungun respeto...'' . La verdad con sólo un poco de respeto hacia los demás es suficiente, tratar un tema no debe llevar a enfrentamientos personales, porque normalmente cuando eso ocurre va a mayores y finalmente se sale del objetivo del foro cual cerveza calentona tan mecida de acá para allá, luego mancha y sale la agresividad y si no se remedia puede dar pie al nacimiento de un nuevo troll.

Pero que sepas que si te vas (aún no conociendo el incidente del que hablas) lo haces reconociendo tus errores ''...Sé que hay comentarios que estuvieron fuera de lugar y entiendo que se quiten...'' porque desde luego lo que nunca van a borrar son líneas de código y los comentarios pertinenetes que lo expliquen.

Por otro lado si un foro no 'encaja' basta que te despidas de ese único foro, si te fijas cada foro tiene sus 'censores', en los de VB creo que la gente habrá agradecido tus intervenciones y doy por echo que pesan más tus respuéstas que la suma de ''comentarios que estuvieron fuera de lugar''.

472
ASM (Ensamblador) / Re: Linkear código escrito en binario
« en: Viernes 5 de Septiembre de 2008, 01:11 »
Cita de: "Continue"
Hola! :comp:
Estoy estudiando ensamblador(en casa :unsure: ) y sé bien que ASM y el binario van uno a uno y no es necesario que se programe nada en binario.Lo que pasa es que quiero hacer lo por aficción.
Con lo que consiga programar un simple "¡Hola mundo!" sería el crack entre mis amigos.
He visto teclados con sólo dos signos y pantallas que van monitorizando el flujo binario,pero no los he visto en vivo.Debería,me imagino,haber una herramienta o una forma de usar el teclado para escribir en binario y linkar lo luego.Tal vez haya un diccionario completo para las instrucciónes en ASM y su equivalente en binario.En los tutos que yo tengo se mencionan algúnas funciones en binario,pero solo pocas.Así que si sabeis de algún sitio(tanto libro como tuto o tabla)de donde aprender a escribir las instrucciónes en binario,enlacen me lo,por fa!
Os agradecería mucho la ayuda.
Adios! :good:

Bueno, yo aún conservo mis manuales del ASM 6.0 venían 3 libritos un folleto grapado, un tocho de varios cientos de páginas y otro de 196 páginas de anillas perforado, es en este donde viene la referencia de las instrucciones empiezan en la página 67 hasta casi el final tanto las instruccones del procesador como las del coprocesador (procesador matemático) por ejemplo la instrucción AND acumulador, inmediato en binario es 0010010w ejemplo: and ax,0B6h , la que recuerdo siempre de memoria (creo que la única) es nop 10010000 que es el mismo código que Xchg ax,ax

Tengo pensado escanearlos pero cuando encuentre tiempo de todos modos aprenderse las instrucciones en binario me parece una burrada con el mnemónico ya resulta bastante latoso....
Lo que si te puedo decir es que lo que aprendas en ensamblador siempre te será útil  especialmente para entender sin siquiera conocer en profundidad un lenguaje (de alto nivel) hasta que punto una rutina puede ser o no óptima y si puedes o no hacerla más rentable (si merece la pena dedicarle el tiempo).

473
ASM (Ensamblador) / Re: ofuscar codigo
« en: Viernes 5 de Septiembre de 2008, 00:48 »
Cita de: "newcode"
hola soy nuevo en esto y me he puesto a buscar algun ofuscador de codigo en asm y no he encontrado nada.

alguien sabe de algun o como poder hacerlo.

gracias

Ofuscar en ensamblador ?   . Mov ax,20 no tiene ninguna otra forma de ser indicado, Me temo que es algo difícil pero ensayando.... te sale, pro ejemplo supongamos el ejemplo siguiente:

se desea comprobar si una lista de números es mayor de 20 con los números que así cumplan luego se desea sumarlos y hallar el promedio de dicha suma... los pasos secuencialmente serían más o menos

Código: Text
  1. poner contador total a 0
  2. poner suma total a 0
  3.  
  4. se ha agotado la lista de lementos ?
  5.  si no, entonces
  6.      tomar elemento de la lista
  7.      comprobar es mayor que 20 ?
  8.      si sí, entonces
  9.            sumar a total y
  10.            aumentar contador en una unidad
  11.    si no
  12.         saltar a por el siguiente elemento
  13. si si ' se acabaron los elementos
  14.     si contador total es mayor que 1 luego
  15.          dividir suma total entre contador
  16.          presentar el resultado
  17.     si no
  18.         presentar no se hallaron elementos
  19. saltar a otra parte del programa
  20.  

Para ofuscar este pequeño código lo que haríamos sería no ir de modo racional por los pasos si no tras buscar el primer elemento de la lista saltar a otra parte del código a iniciar otra rutina, luego, desde allí volveríamos a esta a analizar otro elemento como esta rutina no tiene nada que ver con la otra quien pretenda 'entender' el código de entrada no sabrá por donde tirar, necesitará hacer un seguimiento bastante amplio y abstracto para ver que está entremezclado....

O dicho de otro modo ofuscar en ensamblador es programar de modo antimetódico.... olvidando todo lo referente a objetos, olvidando secuencia de pasos, haciendo muchos saltos incondicionales  colocando etiquetas siempre numeradas (que no expresan nada, en vez de poner leerDisco poner a269) a diestro y siniestro, a veces dar rodeos en vez de usar una instrucción usar 3 ó 4 para hacer lo mismo y en medio de ellas adelantas otra instrucción que normalmente iría más adelante pero que desordenando x líneas más arriba no altera el código pero si dificulta (qué hace aquí esto?)....

474
VB .NET / Re: Ciclo en un textbox??
« en: Viernes 5 de Septiembre de 2008, 00:21 »
Cita de: "hacker225"
 
Código: Visual Basic
  1. Public Class Form1
  2.     Dim i As Integer
  3.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  4.         For i = 0 To 48
  5.             Me.TextBox(i).Text = "hola"
  6.         Next
  7.     End Sub
  8. End Class
  9.  

Como te dice elNapster si ya tienes los controles metidos en un array te debería funcionar. En vb2005 se han eliminado los arrays ya que chocan frontalmente con el modelo de objetos, no obstante por compatibilidad hacia atrás se incluye y por tanto es posible, como describirlo es un poco engorroso te animo a que tu mismo lo veas, crea un proyecto en VB.60 añade al formulario un array de controles textbox guarda el proyecto y cuierra vb6 ahora abre el proyecto en vb2005 te pedirá ai deseas 'actualizar' el proyecto, respondes que si y listo como sólo tenías esos objetos sin nada más ni código te será fácil ver como se hace para ello tienes que abrir el 'diseñador' del formulario (dale a mostrar todos los archivos para que lo encuentres fácilmente)...

Hay aparte otros 2 métodos igual de sencillos y más asequible de explicar en 4 líneas de código..
El 1º consiste en chequear en todos los controles del formulario si es el texbox deseado... de entrada si tienes pongamos 100 textbox usando la propiedad NAME a los que interese llámalos semejante por ejemplo TextCuenta1, textCuenta2... Textcuenta25... y a otros textbox que no entren en esa línea llámales de forma distinta.. el código sería algo como:
Código: Visual Basic
  1.  
  2.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  3.            msgbox " Se hallaron " & Escribe_Textbox & " textbox con el nombre 'textcuenta'. "
  4.     End sub
  5.  
  6.     private function Escribe_Textbox() as integer
  7.           dim x as integer
  8.           for each c as control in Controls                ' recorre todos los controles en el formulario
  9.                if c is TextBox then                            ' filtramos los que no son textbox
  10.                      if instr(c.name.tolower,"textcuenta")> 0 then     ' filtramos los textbox cuyo patrón (el nombre) no nos interesa, esto debe meditarse antes, o usar otra propiedad.....
  11.                            c.text="Hola cocacola"                 ' hacemos lo que querías....
  12.                            x +=1
  13.                      end if
  14.                end if
  15.          next
  16.         return x
  17.     end function
  18.  
  19.  

El 2º método es muy parecido a éste, y su cometido es evitar recorrer todos los controles del formulario CADA VEZ que deseamos rescribirlos, esto es si tenemos 25 textbox y hay 30 controles en el formulario pués no tiene mucha importancia, pero si tenemos 8 textbox y hay 300 controles en el formulario, pués implica pérdida de tiempo. Para ello lo que hacemos es buscarlos una sóla vez y meterlos en un 'saco', luego cuando queramos escribirlos, vamos al saco y de uno en uno los sacmos y escribimos.... el código sería más o menos

Código: Visual Basic
  1.  
  2.       ' estamod dentro del formulario...
  3.       dim TB as new arraylist
  4.  
  5.       ' dentro del evento load del formulario
  6.              call Ensacar_Textbox    '  el código se mete en una rutina por si necesitamos actualizar la lista que tenemos dentro del saco, eso ocurrirá si eliminamos o deseamos añadir nuevos objetos...
  7.  
  8.         ' esta rutina es casi idéntica a la mostrada en el ejemplo anterior,
  9.         private sub Ensacar_Textbox()          dim x as integer
  10.           for each c as control in Controls                ' recorre todos los controles en el formulario
  11.                if c is TextBox then                            ' filtramos los que no son textbox
  12.                      if instr(c.name.tolower,"textcuenta")> 0 then     ' filtramos los textbox cuyo patrón (el nombre) no nos interesa, esto debe meditarse antes, o usar otra propiedad.....
  13.                           TB.add( c)                  ' abrimos el saco y lo metemos ....
  14.                      end if
  15.                end if
  16.          next
  17.     end sub
  18.  
  19.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  20.         call Escribir_Texto("Hola cocacola")
  21.      end sub
  22.  
  23.      private sub Escribir_Texto(cadena as string)
  24.               dim nTb as new textbox
  25.      
  26.               for k as integer= 0 to TB.count -1    ' contamos los que tenemos en el saco.... esos mismos son los que vamos a 'escribir'
  27.                    nTb=TB.item(k)
  28.                    ntb.text= cadena
  29.               next
  30.      end sub
  31.  
  32.  

listo... ya sólo te queda meter un montón de controles textbbox de nombre (textcuenta, o el que quieras pero adecúalo en el código) otros texbos de otro nombre diferente y otros objetos (botones, label, frame, picture...)   para comprobar que funciona perfectamente.

Saludos....

475
Visual Basic para principiantes / Re: Funcion para Saber si Un Arreglo Esta Vacio
« en: Jueves 4 de Septiembre de 2008, 16:29 »
Cita de: "m0skit0"
Bueno, aquí cada uno tiene su forma de resolver los problemas. También veo que no te atienes a razones, puesto que te repito que una variable de tipo Variant (y no hablemos de un array de Variant) es la más lenta
3. Variant es una muy mala idea de Microsoft, cualquier programador con experiencia te lo puede confirmar. ¿Quién usa VARIANT en C++? Nadie, por algo será.

No sé que pensar... Puedes decirme donde he dicho yo que una Variant sea más rápido que usar otro tipo de variable ????. Es que no haces más que dar vueltas a lo mismo, quizás sea por eso de ''para respaldar mi teoría'' .

Parece que la conversación quieres derivarla hacia una afirmación que yo nunca he dicho, porque yo no digo (ni nunca he afirnado) que una variant sea más rápido que un un tipo de datos 'genérico'. Eso creo que todo el mundo lo tiene muy claro. Ni tampoco he dicho que usar una variant requiera menos memoria. Esto son cosas que ni siquiera tratan el tema que pronuncia el hilo...  que por si lo has olvidado era: ''Funcion para Saber si Un Arreglo Esta Vacio''

Por lo mismo el código que expones no sirve de ejemplo para lo que se pretende explicar. Está inflado, te explico porqué:  Lo que compruebas miles de veces es el uso de una matriz variant frente a una matriz genérica, y no es el uso de uno ú otro tipo que lo que debatimos desde un principio sino conocer el tamaño de una matriz y saber si está inicializada o no, esto y sólo esto es lo que debe probarse miles de veces, tu sólo lo pruebas 1 vez en tu código... probar otra cosa es meter en el saco ' lo que hay alrededor' . Es como entrar a una tienda, mirar cien cosas y señalar sólo una para comprar, pero a la hora de pagar el tipo te ha metido todo lo que has mirado, es claro que sólo vas a pagar y te vas a llevar aquello que decidiste, nada más, del mismo modo tu has metido en el saco todo lo que te ha parecido no sé si por descuido o para ''respaldar mi teoría'' , creo que lo que señalas en tu código no es el objeto que yo presenté más arriba pero tú no paras de darle vueltas... cuanto esto sucede en una tienda, uno simplemente se va a otra tienda donde el vendedor no te dé la paliza con nada que no hayas indicado.

De hecho soy enemigo acérrimo del variant pero hay excepciones y reconozco que en dichas excepciones es donde las utilizo porque usar un método alternativo resulta engorroso, largo o incómodo

Recientemente he construído un ActiveX que recibe 1 entre 4 propuestas, cada una de ellas trata un panel distinto, la función de entrada es una.  la misma para los 4 cometidos sin embargo la devolución de datos es diferente en cada caso. Es un variant lo que utilizo para devolver el dato, de otro modo tendría que repetir bastante código y/o utilizar funciones distintas. El que llama sabe que dato espera por tanto no existe complicación ya que esuna y solo una función de entrada para usarlo resulta más sencillo de usar y recordar y la conversión en la devolución del dato es simplemente despreciable. En fin cada uno sabrá donde y cuando utilizar un variant, negarlo es simplemente cerrar lo ojos.

Yo desde hace muchos años veo una variant como una cerveza, cuando lo normal es beber agua, de tanto en tanto una cerveza resultará más gratificante que un vaso de agua, claro que su abuso ciertamente no es nada bueno y no debe ser lo habitual... pero no hay porqué desterrarla si uno sabe usarla cuando la ocasión lo requiere.

Cita de: "m0skit0"
Aqui te dejo un enlace al tipo Variant y las excepciones para usarlo. Un saludo.
Gracias por tomarte la molestia, pero no era necesario, desde que existe internet, he leído miles de páginas... en cualquier caso las ayudas y manuales que trae el programa son bastante más profusas y profundas que la inmensa mayoría de páginas que se pueden ver en internet... MSDN después de todo nació posiblemente más como un método de ahorrarse distribuir manuales que otra cosa VB 60 empresarial se acompaña de 2 CD de MSDN. Se da el caso de que muchas páginas de internet tienen aún (incluso en VB 2008) el mismo contenido que venían en los CD hace 10 años.

Para poner un ejemplo y probarlo debes ceñirte a un bucle que llama a una función y que comprueba si el array está declarado, esto es devuelva el límite del array ... quedamos en que por un lado se usó 'on Error' y por otro un registro que debe actualizarse y finalmente el método que yo os propuse... es eso y sólo eso lo que debe probarse no el trabajo, comprobar el límite y devolver su valor desde la función, cualquierm otro manejo de Variant nunca se ha insinuado...  

Te pongo un código que hace una comparativa entre los métodos presentados a lo largo de la conversación, te resumo brevemente como se ha hecho la comparativa y el resultado, luego lo puede probar cualquiera.

la comparativa son 2 bucles anidados uno de 10 veces y otro interno de hasta 30.000 veces (un control scroll indica la cantidad), en el caso se ha rastreado el límite de la matriz por tanto 300.000 veces
los 3 métodos empleados son: el 'On Error' que exponía nuestro amigo CpMario y que es el más habitual para casos puntuales, el método del 'Registro' de nuestro amigo Moskito  y mi método usando un variant... la matriz usada ha sido de enteros, que al caso no tiene mayor relevancia, ya que para todos los casos este dato no varía. El equipo con el que se ha realizado el cálculo es un pentium 4 a 1500Mhz.

Se han calculado 2 respuestas para el resultado una el tiempo empleado y otra la memoria constante en juego. la matriz finalmente fue de 30.000 elementos
Código: Text
  1.  
  2. Tiempo 'On error' : 0'466875    Memoria en bytes: 60.000
  3. Tiempo 'Registro' : 0'375         Memoria en bytes: 180.000
  4. Tiempo 'Variant' : 1'17175       Memoria en bytes: 60.000
  5.  

Las conclusiones (una vez que veais el código) son claras, 'on error' es algo más de 2 veces de rápido que 'Variant', y 'Registro' algo menos de 3 veces que 'Variant' sin embargo 'Variant' provee sólución para todoas las matrices es decir basta con una sola función para chequear 'integer', 'string' ,'byte', 'long'....

1  _) 'On Error' en cambio requiere una función por cada tipo distinto y si se origina otro tipo de error diferente al de matriz no inicializada requiere tratarlo en la función y luego a la devolución diferenciarlo.  

2  _)  'Registro'  triplica la memoria usada para un integer (otros tipos varían la proporción en función de los bytes del tipo de dato), pero igualmente requiere un registro por cada tipo y matriz, además requiere actualizar contínuamente el contador no sólo cuando redimensionamos explícitamente si no también cuando lo hacemos a través de funciones y otras asignaciones, por ejemplo si tengo un registro 'A' y voy a filtrar la matriz de 'A' por una función por ejemplo A.miarray= filtrar_Nombres(a.miarray), si filtrar_nombres recibe como parámetro una matriz y devuelve una matriz requiere comprobar nuevamente cuantos elementos tiene ahora, lo que requiere modificar todas las funciones para recibir el 'registro' en vez de un array para que en su caso actualice adecuadamente dicho valor, y esto será posible tanto en cuanto todas las funciones sean escritas por nosotros si las funciones son ajenas el contador se queda huérfano y por tanto habrá que recurrir a 'onerror' o a 'variant' para actualizarlo, en definitiva, cojea...
 
3  _) En este sentido el método 'Variant' es universal más breve y sencillo y si vemos la cantidad de tiempo empleado después de 300.000 comprobaciones es simplemente despreciable (3,9041666666666666666666666666667e-6 por cada iteración completa del bucle).

Ahora eso si, en lo que estoy de acuerdo con moskito es en eso de '''Bueno, aquí cada uno tiene su forma de resolver los problemas''', por lo que cada cual elija el método que prefiera.

Además podrá verse en el código que el manejo de Variant no es tan alegremente que como Moskito se haya imaginado. sino que como ya indiqué en otro mensaje anterior debe realizarse una función de acuerdo a las necesidades que uno pueda tener, los códigos que puse con anterioridad sólo son para demostrar que no daban error como indicaba Moskito, a partir de ahí cada uno puede montarlo como le dé su cabeza...

El código se adjunta en un archivo rar... si hay problemas con algo avisad ...

Código: Visual Basic
  1.  
  2.  
  3. ' este proyecto presenta una comparativa con 3 métodos diferentes para
  4. '   verificar si un array está INICIALIZADO (O NO), y proceder en cada caso
  5. '   a redimensionarlo o iniciarlo.
  6.  
  7.  
  8.  ' metodo 2 emplea este registro
  9.  Private Type miRegistro
  10.     suArray() As Integer
  11.     contador As Integer
  12.  End Type
  13.  
  14.  Dim suArray() As Integer   ' emplean métodos 0 y 1  método ON ERROR
  15.  Dim miArray                ' lo emplea método 1            método VARIANT
  16.  Dim tuArray As miRegistro  ' emplea el método 2    método REGISTRO
  17.  
  18.  
  19.  ' comCalcular es un botón, txttiempo y TxtByte son 2 cajas de texto, frametodo es un Frame que contiene a 3 controles option que representan el método elegido
  20. '   hscrRep es un scroll horizontal para modificar el número de repeticiones, finalmente hay un label que indica el valor del scroll...
  21.  
  22. Private Sub ComCalcular_Click()
  23.     Dim t As Single     ' para el cálculo del tiempo empleado
  24.     Dim tamByte As Long ' para el cálculo de la memoria que ocupa
  25.    
  26.     Me.TxtTiempo.Text = 0
  27.     Me.TxtByte.Text = 0
  28.     DoEvents
  29.     If FraMetodo.Tag = 0 Then                                      ' Método ON ERROR
  30.         t = Timer
  31.         For j = 0 To 10
  32.             For k = 1 To HScrRep.Value
  33.                 If limiteA(suArray) <> -1 Then
  34.                     ReDim Preserve suArray(0 To UBound(suArray))
  35.                     suArray(UBound(suArray)) = k
  36.                 Else
  37.                     ReDim suArray(0 To 0)
  38.                     suArray(0) = 0
  39.                 End If
  40.             Next
  41.             Erase suArray
  42.         Next j
  43.         TxtTiempo.Text = Timer - t
  44.         TxtByte.Text = (tamByte + HScrRep.Value) * Len(suArray(0))
  45.     ElseIf FraMetodo.Tag = 1 Then                        ' Método VARIANT
  46.         t = Timer
  47.         For j = 0 To 10
  48.             For k = 1 To HScrRep.Value
  49.                 'MsgBox VarType(miArray)
  50.                 If limiteB(miArray) <> -1 Then
  51.                     ReDim Preserve suArray(0 To UBound(suArray))
  52.                     suArray(UBound(suArray)) = k
  53.                 Else
  54.                     ReDim suArray(0 To 0)
  55.                     suArray(0) = 0
  56.                 End If
  57.                 miArray = suArray
  58.             Next
  59.             Erase suArray
  60.             Set miArray = Nothing
  61.         Next j
  62.         TxtTiempo.Text = Timer - t
  63.         TxtByte.Text = (tamByte + HScrRep.Value) * Len(suArray(0))
  64.     Else                                                                        ' Método REGISTRO
  65.         t = Timer
  66.         For j = 0 To 10
  67.             tuArray.contador = -1
  68.             For k = 1 To HScrRep.Value
  69.                 If tuArray.contador <> -1 Then
  70.                     tuArray.contador = tuArray.contador + 1
  71.                     ReDim Preserve tuArray.suArray(0 To tuArray.contador)
  72.                 Else
  73.                     tuArray.contador = 0
  74.                     ReDim tuArray.suArray(0 To 0)
  75.                 End If
  76.                 tuArray.suArray(tuArray.contador) = k
  77.             Next
  78.             Erase tuArray.suArray
  79.         Next
  80.         TxtTiempo.Text = Timer - t
  81.         TxtByte.Text = (tamByte + HScrRep.Value) * Len(tuArray)
  82.     End If
  83.    
  84.     Erase suArray, tuArray.suArray
  85. End Sub
  86.  
  87. ' sólo procesa el tipo integer, para otro tipo debe proveerse otra función casi idéntica
  88. Public Function limiteA(matriz() As Integer) As Integer
  89.     On Local Error GoTo limiteError
  90.    
  91.     limiteA = UBound(matriz)
  92.     Exit Function
  93.    
  94. limiteError:
  95.     limiteA = -1
  96. End Function
  97.  
  98. ' procesa tanto matrices de enteros como de cadenas, bytes, long etc....
  99. Public Function limiteB(matriz As Variant) As Integer
  100.     If Not IsArray(matriz) Then
  101.         matriz = Array()
  102.     End If
  103.    
  104.     limiteB = UBound(matriz)
  105. End Function
  106.  
  107.  
  108. Private Sub Form_Load()
  109.     FraMetodo.Tag = 0
  110. End Sub
  111.  
  112. Private Sub HScrRep_Change()
  113.     Me.LabRep.Caption = "Repeticiones: " & HScrRep.Value
  114. End Sub
  115.  
  116. Private Sub OptMetodo_Click(Index As Integer)
  117.     FraMetodo.Tag = Index
  118. End Sub
  119.  
  120.  

Además para ser puristas (aunque lo que comento a continuación se sobrenetiende) calcular los elementos de una matriz no es usando ubound(matriz) sino usando la fórmula: ubound(matriz) - lbound(matriz) + 1, ya que por ejemplo si declaramos la matriz: dim Hola(-5 to 9) y pedimos ubound(hola) nos devuelve 9 que es el límite superior... pero en fin esto se sobreentiende aunque los novatos suelen tomarlo todo al pie de la letra...

Páginas: 1 ... 17 18 [19] 20 21 ... 29