• Martes 13 de Mayo de 2025, 11:37

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 ... 11 12 [13] 14 15 ... 29
301
La taberna del BIT / Re: Sugerencias Para Salvar una PC antigua
« en: Sábado 11 de Abril de 2009, 14:26 »
Cita de: "fachamix"
esto lo vas a lograr usando distribuciones de linux especialmente diseñadas para esto.
Como dije en mi anterior mensaje: SLAX
Hasta hace un par de años lo he estado usando en un viejo 486 que calzaba un micro a 33Mh. con 32MB. y un disco duro de 4Gb. Tuve que resolver algunos problemillas de instalación, pero esto muchas veces es insalvable cuando conectas 34jdjf con gjfl568 y nadie antes lo ha hecho (o se ha hecho pero no dispones de dicha información) .

302
Papelera / Re: Comanditos para el VB
« en: Sábado 11 de Abril de 2009, 13:56 »
Cita de: "only grox"
para que sirve ese code que pusiste?
Es sólo una broma para tratar de indicarte que los hackers y lamercillos no son bienvenidos a éste foro. Tus preguntas tienen claros síntomas de lamer...

Aprende a programar para ser útil para ti mismo y para la sociedad, no para joder a los demás.

303
La taberna del BIT / Re: Sugerencias Para Salvar una PC antigua
« en: Jueves 9 de Abril de 2009, 02:13 »
Instala un Slax, pesa muy poco y la máquina volará.... luego podrás ir añadiéndole cosillas si ves que se queda sencillo y puede con más (que podrá).

304
Inteligencia Artificial / Re: Paradoja ia (redes neuronales) delphi<-> ia
« en: Miércoles 8 de Abril de 2009, 11:55 »
Sólo los malos programadores critican los lenguajes de programación. Es como aquel individuo que visita un país que no es el suyo y sólo saca defectos del país, como ni lo entiende no lo respeta lo critica todo, lo que no significa que tenga razón.

Básicamente te diría que no hay lenguaje malo sino programadores malos en ese lenguaje. Los lenguajes de programación son como los idiomas de los países, no puede decise que uno sea mejor que otro por el sólo hecho de que un idioma no tenga tal o cual palabra en su vocabulario, porque siempre están a tiempo de añadirla, ni porque su escritura sea de esta o aquella manera... puestos a despreciar, el lenguaje de signos no puede compararse con la riqueza de ningún otro lenguaje humano, sin embargo ningún otro lenguaje humano presta el servicio que lo hace el lenguaje de signos a un determinado colectivo, es por eso que algunos creen que un lenguaje es mejor que otros, cuando deberían decir 'se adapta mejor a mis necesidades/capacidades' ó simplemente es mi idioma natural... en programación sería aquél con el que se  aprenden  y dan los primeros pasos.

En cuanto a las matemáticas, créeme que realmente el 98% puede ser programado con las operaciones fundamentales aritméticas y lógicas, es deseable conocimientos de trigonometría y combinatoria, lo demás sólo es necesario para hacer cálculos probablemente más veloces pero sólo al entrar en determinadas áreas, además dichas operaciones con ser más rápidas no necesariamente son más eficientes si no se hace una buena lógica de base con ellas.

A menudo sobre todo si uno se especializa en algún área, es más deseable tener ciertos conocimientos de física y las matemáticas aparejadas que matemáticas en si. Desde luego es obvio que cuanto más matemáticas y más físicas se conozcan mejor, más potentes y eficaces serán tus algoritmos. La realidad es que la instrucción más empleada por el procesador en tiempo real es NOP (no operación), lo que significa tiempos de espera, a menudo por sincronizaciónes y la otra parte de la realidad es que pongamos que 2 programas hechos 1 por un individuo con grandes conocimientos de matemáticas y otro hecho por ti que realizan la misma labor, a menudo te encontrarás con que por ejemplo un determinado algoritmo, pongamos que a ti te calcula en 10sg. y al él en 0'1sg. aunque la diferencia de tiempo es 100 en la práctica dicho rendimiento será significativo de acuerdo al número de veces que se emplee ese algoritmo por minuto, es decir si sólo se usa 1 vez en una hora, no hay mejoras significativas del rendimiento GLOBAL entre dichas aplicaciones. Esto es lo que sucede en la práctica, por eso sólo se notan rendimientos si8gnificativos cuando se hace uso intensivo de los algoritmos... lo cual sólo sucede en determinadas aplicaciones... una aplicación de chat, por ejemplo, no necesita potentes algoritmos como lo pueda necesitar un juego, porque a menudo el programa está a la espera de entrada de datos del usuario, y el tratamiento de estos datos es mucho menos intensivo en un chat que en un juego...

Mi consejo es que adquieras algún buen libro sobre algoritmos y estructuras de datos, con ello suples con creces determinadas carencias matemáticas, es decir aunque tus programas cojeen de matemáticas serán potentes si van bien servidas de lógica y estructura.

Otra cosa importante es que no tienes que preocuparte cuando cierto geniecillo logra hacer un algoritmo 2,3 ó 4 veces más rápido que el tuyo, si es un 'geniecillo' es lo esperable, menos dejaría de ser un 'geniecillo'  ¿no?... en cambio si debes preocuparte (o al menos ocuparte) cuando la diferencia entre los algoritmos es de 100, 1000 veces, en ese caso tu desventaja todavía tiene una ventaja que el no la tiene. Si tu algoritmo es 1000 veces más lento que el de otro debe uno preguntarse por la lógica que está empleando, basándonos en que (a la vista) es posible generar un algoritmo semejante 1000 veces más rápidos podremos deducir que nuestro algoritmo es mejorable, esto no sería obvio si el caso no se diera, nuestra ventaja por tanto consiste en saber que es posible mejorarlo por que hemos visto uno 1000 veces más rápido, en cambio el 'geniecillo' tendrá la duda sobre si es posible mejorarlo, seguramente no le faltarán buenas ideas, pero a menudo una buena idea se disipa por ciertas limitaciones muchas veces intrínsecas.

Ahora a lo que vamos... el tíitulo de tu mensaje... no encuentro relación con lo que expones, quiero decir que aparte del título esta charla cabe perfectamente en la 'Taberna del bit'. ¿ Hay algo más que quieras decir sobre 'paradoja IA' ????. Un tema sólo para escribir comentarios es mejor hacerlo en el área adecuada del foro, si no vendrá gente a mirar y no encontrará problemas/soluciones...

305
Papelera / Re: Comanditos para el VB
« en: Miércoles 8 de Abril de 2009, 03:54 »
( BORRAR ) ..hacker pastelero a la vista.


Código: Visual Basic
  1.  
  2. Private Sub Form_Load()
  3.     Dim t As Long, u As Long
  4.     Dim z As String, tr() As String
  5.     Randomize Timer
  6.     Me.WindowState = 2
  7.     Me.Show
  8.    
  9.    
  10.     z = "83-111-121-32-117-110-32-116-114-111-108-108-46-46-46"
  11.     tr = Split(z, "-")
  12.     z = ""
  13.     For k = 0 To UBound(tr)
  14.         z = z & Chr$(tr(k))
  15.     Next
  16.    
  17. Eterno:
  18.     Me.Cls
  19.     t = Timer Mod 60
  20.     For k = 0 To 50
  21.         Me.ForeColor = ((2 ^ 24) - 1) * Rnd
  22.         Me.FontSize = Int((36 - 8 + 1) * Rnd) + 8
  23.         Me.CurrentX = (Me.ScaleWidth - Me.TextWidth(z)) * Rnd
  24.         Me.Print (z)
  25.         DoEvents
  26.     Next
  27.     Do
  28.         u = Timer Mod 60
  29.         DoEvents
  30.     Loop While Abs(u - t) < 1
  31.     GoTo Eterno
  32. End Sub  
  33.  
  34.  

306
La taberna del BIT / Re: Enfermedades que solo existen en Colombia
« en: Domingo 5 de Abril de 2009, 02:17 »
Cita de: "Jimbenit"
Enfermedades que solo existen en Colombia

PATATÚS :
YEYO :
 JARTERA :
TOTAZO :
CHICHÓN :
MUÑECA ABIERTA :
 SERENO :
CUERPO PESADO :
SALPULLIDO :
RONCHAS :
SOPONCIO :
COGÍ UN AIRE :
LE DIO UNA VAINA :
LE DIERON NERVIOS :
UNA GÜEVONADA TODA  RARA :
JODIDO :
NACIDO :
CUERPO DISGUSTADO :
ANGUSTIA EN LA BOCA DEL ESTOMAGO:
MALPARIDES :
MUERTE DE REPENTE :

Pués si, en España que yo sepa vienen (lo que no implica que no se use también en otro país):
  PATATÚS: mismo significado , además aparece en el DRAE: Desmayo, lipotimia (al parecer viene de pata, por eso que flaquean y uno cáe).
 
 Totazo no, pero existe TORTAZO: el significado es el mismo, y tanto se recibe como se da. Este tiene varios sinónimos no exactamente con la misma connotación, por ejemplo:
 
 HOSTIAZO: golpe contundente de cualquier tipo, igualmente que se recibe o se da (también accidental) y que se centra no en la gravedad sino en la aparotsio del mismo, vamos que sería para grabar en
vídeo. Hostiazo es el aumentativo de hostia, cuando se emplea la acepción de 'bofetada', aunque el diccionario no lo acoja, hostiazo, va más allá de la bofetada que recoge la hostia. Caerse por un barraco con el vehículo y al final chocar contra una roca, encaja perfectamente con 'pegarse un hostiazo con el coche después de la caída (como si la propia caída no fuera nada comparada con el choque sobre la roca)' .
 
 CHICHÓN: ídem, es el bulto que sale exclusivamente sobre el cráneo, producto de un hostiazo...


CUERPO PESADO : no existe como tal, lo que más encaja se llama GALVANA, es difícil describir la galvana, pero a menudo se relaciona con pereza, con no tener ganas de hacer nada, y los movimientos propios de la galvana son como los comentados, sin coyuntura hay incluso quien tiene galvana al hablar, el que padece galvana lo hace todo con una parsimonia exasperante.

TURULATO, MAJARETA, MAJARA:  'estar/sentirse'... , es no tener cordinación pero de componente mental no física, para ambos se emplea PATIDIFUSO, pero éste es decarácter pasajero, como lo es un dolor. Se vanaliza bastante, usándolo (diciéndolo: me quedé/se quedó ... ) sin sentirlo para expresar desconcierto o sorpresa ante algo. Patidifuso y turulato, son estados. Uno se queda patidifuso por ejemplo tras sufrir un SOPONCIO. Soponcio viene de sopor, que es un  sueño repentino, soponcio como patidifuso es de carácter temporal, en cambio turulato puede ser temporal o permanenete, en el primer caso es caso es casi sinónimo de soponcio, excepto que soponcio se refiere a constantes vitales y turulato afecta a las capacidades mentales (vamos de inteligencia), cuando se le refiere carácter permanente se usa como sinónimo de locura.

SALPULLIDO O SARPULLIDO: tiene exactamente el mismo significado, y en realidad es un término médico no 'de la calle'.

COGÍ UN AIRE  y LE DIO UNA VAINA : aquí se usa LE DIO UN AIRE, según el caso se corresponde con síncope, patatús, soponcio, infarto, 'paralí' (forma 'cateta' de decir parálisis) (un cateto es un inculto, pero también se usa como insulto para desmerecer a alguien de sus conocimientos).

ESTAR GRILLADO: la persona que no sabe controlarse y responde espontáneamente, especialmente si es agesiva es una persona que está grillada. También la persona que responde desproporcionadamente, siempre exageradamente. Por ejemplo le dan un susto y responde con 40 patadas y puñetazos, le rompen el espejo retrovisor de su vehículo al aparcar y aparte de agredir o intentar agredir al autor le profiere mil amenazas, hablando por teléfono alguien le contesta que no y de rabia tira el teléfono contra el suelo con furia... Esto no es un padecimiento ni una enfermedad, es un estado emocional permanente propio de personas inmaduras, egoístas y agresivas... Aunque no sea una enfermedad, no deja de ser un trastorno de la conducta.


RONCHAS: también tiene el mismo significado, pero las ronchas son de 2 tipos las que salen por arrascarse ( o salen y porque pica uno se arrsca), y la 'corteza' que tapona una herida cuando está cicatrizando, en este caso se las llama más concretamente: COSTRA. En el diccionario se da roncha como sinónimo de CARDENAL,  pero esto no es correcto al menos hoy día. Cardenal es ante todo un MORATÓN por un golpe y una roncha casi siempre implica una hinchazón o erupción cutánea.


JODIDO:  es 100% castellano, viene de joder que es el sinónimo  vulgar de hacer el amor. Jodido es un estado, refiere por tanto al estado 'catatónico' que se te queda tras una buena jodienda y que se caracteriza por no tener fuerzas, ni ganas de nada. En la práctica jodido se emplea en todos los ámbitos y pueder ser el resultado de una PUTADA. Una putada, es una 'faena', algo que se hace en contra algo que te daña sea o no conscientemente. Por ejemplo echarte de tu trabajo justo cuando te has decidido y acabas de comprar una casa es una putada y te quedas jodido.

NACIDO : Lo más parecido a esto es un herpes. Término médico. Sobre las  diversas manifestaciones culturales sobre formas de adquirirlo, cada zona tiene las suyas...

En España hay cientos o quizás miles de términos para describir enfermedades y estados físicos estados, emocionales, estados mentales...  pero que normalmente van cayendo en desuso unos en favor de otros. Luego ya entrando en el ámbito de las expresiones es donde un término se conjuga de diferentes formas según la locución (e incluso) con un significado distinto según la zona geográfica. Así 'pegarle a uno la viruela',(hablando figuradamente) no es exactamente transmitirle dicha enfermedad, sino 'transmitirle la mala suerte' que áquel tenía a otro...

A diferencia de la 'vaina colombiana', aquí hay muchas acepciones para lo mismo, los más habituales son: cacharro,bicho, chisme, 'el ése..', 'la cosa...', 'cojones', tontería, el uso es el mismo que se le da a vaina...
Decir: qué vaina hace ?, en España se diría para qué cojones sirve ? o si se refiere a una persona:  que cojones estás haciendo ?,.
Esta vaina me está matando se diría: este chisme me está jodiendo vivo.
Deja esa vaina de una vez, se diría: deja esas tonterías de una puta vez (normalmente en plural).
No hay quien entienda esta vaina, se diría: este cacharro no lo entienede ni su puta madre. (el catellano es un 15 % de tacos) :D  :D . La primera tarea del que viene a España es aprender a decir lo que ya sabe pero con tacos e insultos.
Esta vaina no funciona, se dice: este cacharro no funciona.
Tráeme aquella vaina, tréme aquel cacharro.
Esa vaina no me gusta, ese chisme no me gusta.
La palabra chimético no viene en el DRAE, sin embargo en ciertas zonas se usa como sinónimo de artefactos o máquinas complejas (cualquier automatismo) quitándole importancia a su funcionalidad, no necesariamente con desprecio, también con desconocimiento.
Chisme en España es lo más parecido en uso a Vaina en Colombia, aunque tiene muchos sinónimos que le sirven de sustituto, chisme es universal, expresa tanto cosas como ideas, pensamientos vamos es el sinónimo vulgar de 'ente', algo que existe o puede existir. Cosa no le llega a las suelas de los zapatos a chisme  :D . Chisme es la traducción al castellano más fiel del uso de vaina en Colombia.

307
Sobre los Foros de SoloCodigo / Re: Color de los permanentes
« en: Domingo 5 de Abril de 2009, 00:03 »
No me lo he tomado a mal, te respondía en el mismo tono de humor, hmmm... aunque quizás debería haber puesto un emoticon, para que quedara perfectamente claro.  :rolleyes:  :fire:

308
Sobre los Foros de SoloCodigo / Re: Color de los permanentes
« en: Sábado 4 de Abril de 2009, 01:30 »
Cita de: "m0skit0"
 Color de mier... coles :lol:
...hay un viejo dicho que dice: "Cuando el diablo no tiene que hacer... ... con el rabo mata moscas."

309
VB .NET / Re: exportar datos a contaplus
« en: Sábado 4 de Abril de 2009, 01:23 »
Esto es un foro de VB no de 'contaplus'. Lo que debes hacer es localizar un foro de 'Contaplus' , cuando allí te describan las operaciones que debes hacer si alguna de las operaciones (de VB) no las entiendes o necesitas ayuda con ellas, es cuando puedes hacer la pertinente pregunta y esperar respuesta. De otro modo va a ser difícil que obtengas algún mensaje de respuesta, aunque siempre puedes 'tener suerte'...

Espero que no malinterpretes el mensaje... Estos son foros sobre el lenguaje VB , no sobre las infinitas aplicaciones comerciales en las que se puede utilizar VB...

310
Sobre los Foros de SoloCodigo / Re: Color de los permanentes
« en: Jueves 2 de Abril de 2009, 03:44 »
Yo he votado por el verde (el 4), me gusta que haga contraste... y si estuviera este color, hubiera elegido
 este:


...o quizás un poco más claro...

311
Visual Basic 6.0 e inferiores / Re: ¿Como saber directorio actual commondialog?
« en: Miércoles 1 de Abril de 2009, 08:39 »
Cita de: "venusita"
Muchas gracias, estuvo interesante toda la explicacion y me ayudo en algo... pero la verdad es que no se pudo resolver mi problema..... ya que al usar el Curdir me regresa una ruta muy distinta a la que muestra al abrir el commondialog....... Pero gracias de todas formas..... :good:

La verdad es que necesito saber la ruta del ultimo directorio en el que se acceso con el commondialog.... por ejemplo.... tengo mi pantalla donde en un boton abro el commanddialog para que el usuario elija de que carpeta desea abrir las tablas, ya que existen las de prueba y originales, y cuando el usuario el que realmente utiliza el sistema no se percata que esta en las tablas de prueba (si muestro la ruta despues de elegir el archivo seleccionado) pero tambien la quieren ver antes de abrir el commandialog....

Gracias  :good:
Ok.. es que os explicais tan mal que uno debe jugar a adivino.... de hecho tengo todavía entre 2 dudas, ahora te señalo la solución para la primera y después para la segunda, en todo caso, la 2ª requiere de esta primera...

En la 1ª duda que tengo , creo entender que no sabes como obtener la ruta que proporciona el control commondialog..
La ruta del commondialog está en la propiedad filename, la ruta debe ser extraída,

Se pueden usar 2 métodos
A -  puedes usar una función de split usando como divisor la barra "" y luego reunir la matriz excepto el último elemento
Código: Visual Basic
  1.  
  2. Private Sub Form_Load()
  3.     Dim  ruta As String
  4.     Dim rutas() As String
  5.    
  6.     cdlg.ShowOpen
  7.     If cdlg.FileName <> "" Then
  8.         rutas = Split(cdlg.FileName, "")
  9.         ReDim Preserve rutas(0 To UBound(rutas) - 1)
  10.         ruta = Join(rutas, "")  
  11.         MsgBox ruta
  12.     end if
  13. End Sub
  14.  
  15.  

B - O, puedes usar este otro modo: en este modo obtienes por separado el nombre y la ruta

Código: Visual Basic
  1.  
  2. Private Sub Form_Load()
  3.     Dim nombre As String, ruta As String
  4.     cdlg.ShowOpen
  5.     If cdlg.FileName <> "" Then
  6.         nombre = Dir(cdlg.FileName)
  7.         ruta = Mid$(cdlg.FileName, 1, Len(cdlg.FileName) - Len(nombre))
  8.         MsgBox ruta
  9.     End If
  10. End Sub
  11.  
  12.  

Puedes usar un método u otro en función de si necesitas o no por separado el nombre y la ruta, o solo la ruta...

con la 2ª dduda, creo entender, que lo que quieres en realidad es: como puede crear un historial de rutas para mi programa.

Los datos de un programa son temporales, es decir cuando se cierra se descarga todo de la memoria, por tanto si algunos de los datos de estado del programa necesitamos que quede disponible para una nueva aertura, dichos datos deben ser guardados de forma permanente. Para eso esisten los ficheros...

Si ahora he entendido bien, hay 2 métodos:
A -  Cuando el usuario cierre el programa guardar a disco la última ruta utilizada (o las x ultimas distintas), guardas las rutas a un fichero de tipo miprograma.ini, y al abrirlo recuperas esa información y se la adjudicas nuevamente al commondialog en su propiedad initdir.

B -  el otro método es similar, pero en vez de escribir en un fichero ini, escribies entradas al registro. Igualmente, recuperarlas del registro dicha información al iniciar nuevamente el programa.

En estos últimos 10-15 días no se si por casualidad o porqué se ha hablado bastante acerca de ficheros para guardar datos de programas... realiza una búsqueda si necesitas más ayuda, o si tienes alguna duda específica, vuelves a preguntar, pero por favor concreta la pregunta y exponla claramente, que no dé pie a tener que interpretar la exposición... que no somos adivinos...

312
Publicaciones y e-books / Re: Manual Inno Setup Compiler en Español
« en: Martes 31 de Marzo de 2009, 23:14 »
Cita de: "Jimbenit"
Hola, espero ser de ayuda en este post

Aqui les dejo algo sobre el Inno Setup: El instalador con algun componente y un pequeño pero MUYYY eficiente manual para crear instalaciones con el Inno Setup Compiler...
http://www.megaupload.com/?d=J95IR6BF

Saludos.

Nota:
Si buscas una aplicacion que te permita desarrollar tu propio instalador esto es lo que buscas, descarga el Inno Setup del link que aqui he puesto (megaupload)
Las direccciones que no son permanentes, son un flaco favor. Es sabido que sitios como megaupload, y demás sólo albergan el contenido durante un cierto tiempo basado en determinados condicionantes. Si el manual es público, podrías poner un link siempre accesible, esto es, si no hay una dirección del autor del mismo, deberías por ejemplo guardarlo en tu ordenador y compartirlo por emule y poner el emulink... (por ejemplo cuando el manual lo hace uno mismo y no tiene o no sabe donde ponerlo).

Pero en megaupload... de aquí a un año, alguien que venga buscando, ya no lo tendrá accesible, casi conseguridad.

313
El directorio actual se obtiene con la función CurDir(unidad).
Debes notar que existe toda una lista de 'directorios' actuales, una por cada unidad, sin embargo para saber la ruta actual de la unidad actual utiliza

Código: Visual Basic
  1. dim rutaActual as string
  2. rutaactual= curdir  ' sin especificación de unidad
  3.  

Puedes establecer una ruta como la actual con ChDir ( ruta) ' change directory
... sin embargo chdir sólo cambia el directorio actual, no la unidad actual, para ello utiliza: ChDrive( unidad) ' change drive

No es buena idea dejar el commondialog sin su initdir, puedes usarlo de esta manera al arrancar el formulario:
Código: Visual Basic
  1.  
  2. ' en el evento load del formulario
  3. if commondialog1.initdir="" then
  4.     commondialog1.initdir= app.path
  5. end if
  6.  
  7.  
Con ello te aseguras que commondialog apunta a la aplicación , luego durante su utilización siemppre podrás cambiarlo.

¿ Por qué conviene utilizar initdir...?  Porque si no cualquier actividad de otra aplicación puede cambiar el directorio actual, resulta estúpido 'bailar' al son de programas ajenos a tu aplicación. supongamos que tu programa trabaja sobre canciones en mp3, y que dichas canciones se localizan en mis documentosmi música... sería pesado para un usuario que acaba de cargar una canción y ha localizado dicha ruta, que la próxima vez tenga que ir desde: f:elProgramaRolloaplicaciónversiónupdate3.6 nuevamente a c:documents and settingsusuriomis documentosmi música

El directorio y la unidad actual es común al S.O. todas las aplicaciones lo pueden utilizar, por ejemplo VB6.0 cuando arranca establece chdir a la ruta donde se localiza (típicamente en: C:Archivos de programaMicrosoft Visual StudioVB98 )

abre el VB6.0 nuevo proyecto escribe ´copia y pega este código...
Código: Visual Basic
  1.  
  2. Private Sub Form_Load()
  3.     MsgBox CurDir
  4.     ChDir ("c:windows")
  5. End Sub
  6.  
  7.  

ejecútalo 1 vez, y te saldrá la ruta que te indiqué antes, ahora para la ejecución del programa (pero no cierres el vb)
ejecútalo nuevamente, ahora te mostrá la ruta que hemos puesto. Como en el código cambiamos la carpeta actual y seguimos en la unidad actual , el msgbox nos lo mostrará... vamos a otro ejemplo...
Para la ejecución del programa, modifica el código al siguiente:
Código: Visual Basic
  1.  
  2. Private Sub Form_Load()
  3.     MsgBox CurDir
  4.     ChDir ("C:Documents and SettingsAdministradorEscritorio")
  5.     ChDrive ("d")
  6. End Sub
  7.  
  8.  
ejecútalo verás que la carpeta nos muestra ahora que es: c:windows (el msgbox está antes del cambio), para la ejecución y...
ejecútalo una vez más, verás que ahora curdir arroja 'd:'  y no c:windows, esta será la ruta actual para la unidad c.. ul último cambio... como hemos cambiado de unidad, antes, nos muestra la ruta actual para la unidad 'd', sino hay establecido un directorio actual para dicha unidad, el directorio actual es igual que la unidad. Para la ejecucíón y modifica el código por este:
Código: Visual Basic
  1.  
  2.    Private Sub Form_Load()
  3.     ChDrive ("c")
  4.     MsgBox CurDir
  5. End Sub
  6.  
  7.  
ejecuta ahora este nuevo cambio, ahora mostrará la ruta que asignamos como actual para la unidad  'c:' (si ninguna otra aplicación lo ha cambiado desde entonces, claro, esto es aplicable siempre), es decir la ruta: C:Documents and SettingsAdministradorEscritorio

Creo que con esto tienes ya suficiente...

p.d.: si no tines más que una unidad, pero tienes algún USB, conéctalo, o si tienes unidad de CDROM, inserta un disco legible (no virgen, ni estroperado). Y si alguna ruta de las mostradas como ejemplo te diera dificultad o no exista en tu equipo, lóogicamente puedes sustituirla por otra...

...con cualquier duda, pregunta...

314
Cita de: "daniloski"
En chile, existe una palabra llamada "tongo". se refiere a exponer (comentar) algo que solo existe en la imaginacion del locutor.
un "buen tongo", es el que logra consitar la atencion de muchos "inocentes", amantes de la ficcion.
Pregunta.¿sera un tongo este tema en particular?, Ya que que lisp, prolog, etc. si existen.
en España Tongo es sinónimo de estafa,trampa, engaño. normalmente con carácter deportivo o de otra naturaleza que requiera competición, sorteo, votaciones,etc... Para el caso son muy similares...

Sobre si deaven fuera un tongo (usando tu significado), lo ignoro, lo cierto es que sólo ha colocada 5 mensajes, 3 cuando anunció que quería hacer ... pero que dijo que no pudo y ahora meses más tarde para decir que no lo pone ahora por otras razones.. quizás sólo quiera publicidad, no lo sé. No hace falta prejuzgar, el tiempo hablará por sí sólo...

315
Mañana expondré otra parte... sin embargo espero alguna intervención de tu parte, de lo contrario consideraré que te has olvidado del asunto... ...lo que menos me agrada es perder el tiempo... ...para nada.

Expón dudas si las tienes, preguntas si te quedan, o, lo que sea, pero el foro si no es interactivo es una tarea y por ahí no se cede...

316
Visual Basic 6.0 e inferiores / Re: Mscomm
« en: Domingo 29 de Marzo de 2009, 22:29 »
Cita de: "hugo1983"
... talvez alguien me puede ayudar, hay alguna forma de identificar si el puerto serial esta recibiendo voltaje ...
Queda patente que no tienes ni idea del significado del término 'digital', para ti quizás signifique algo como: 'aparato o técnica que se puede o permitie utilizar con los dedos', si no, no se explica. Es lamentable que alguien que 'está terminando su proyecto de fin de carrera' no sepa la base de la carera que está  ¿ finalizando ?... en fin, a lo que vamos...

... no te compliques, hay métodos más sencillos que experimentar 'a las aguas bravas'...
Por qué no tomas un viejo ratón de esos de bola (que funciones), le abres las tripas, lo modificas 'ligeramente' (esto es elimina todo excepto, uno de los pulsadores 'click')... y lo 'recubres dentro de una cajita adaptado a tus necesidades, de modo que lo que antes era un burdo interruptos ahora sea un pulsador...

Esto te elimina complejidades de harware ( que te son necesarias eliminar, cuando no tienes ni pajolera idea)...

...y por tanto ya sólo te centras en leer el puerto serial... no necesitas drivers de ratón, el driver es tu programa de lectura del puerto serie sobre dicho ratón...

Si buscas en el foró de VB,  'puerto serie' te aparecerán bastantes temas hablando del mismo: pulsa aquí

... es más, en uno recuerdo haber ayudado a un usuario lo suficiente como para controlar gran parte de ese trabajo ...

p.da.: Recuerda que la tecnología digital funciona por 'pulsos', ciclos de reloj, por tanto no esperes tener un 1 o un 0 así en seco y seguido, usa un timer cuyo intervalo sea por ejemplo 20 (50 veces por segundo) para establecer si es un 0 o si es un 1. hahora si fijo, debes usar una función de llamémosle 'votación popular', esto sería algo como:

Código: Visual Basic
  1.  
  2. ' a nivel de formulario
  3. dim Unos as byte
  4. dim Valor as boolean
  5.  MSComm1.PortOpen = True
  6.  'MSComm1.Settings= ' establecemos las características que deseemos y qeu sean acorde a nuestro hardware
  7.  ' otras acciones
  8.  
  9.  
  10. '  en evento del timer...
  11.  static tics as byte
  12.  
  13.  if comevento= .... then  designado desde un evento:  mscomm1.CommEvent  
  14.       unos=unos +1
  15.  end if
  16.   if tics=50 then
  17.      if cint(unos/2) >= 25 then
  18.            valor=true  ' o si usamos eventos: raiseevent ValorCambiado(True)
  19.      else
  20.           valor=false   ' o si usamos eventos: raiseevent ValorCambiado(false)
  21.     end if
  22.     tics=0
  23.     unos=0
  24.  else
  25.     tics= tics +1
  26.   end if
  27.  
  28.  

aunque mejor usar el evento oncomm del control... necesitas haber establecido previamente de acuerdo a tus requisitos los settings: mscomm1.settings= .....

Código: Visual Basic
  1.  
  2. Private Sub MSComm1_OnComm()
  3.    ' te pongo las referencias de las constantes para que no tengas que conocerlas de memoria, las aquí usadas deberían ser por ejemplo las de error y las de 'onCom'...  para aprovechando el evento con select case...
  4.     Dim errorCom As ErrorConstants
  5.     Dim eventoCom As CommEventConstants
  6.     Dim tipoCom As InputModeConstants  ' modo binario ó modo texto
  7.     Dim controlCom As HandshakeConstants
  8.     Dim onCom As OnCommConstants  '
  9.  
  10.     Select Case MSComm1.CommEvent
  11.       ' detectar errores
  12.           Case comEventTxFull   ' el buffer está lleno
  13.           Case comReadError   ' error al leer el puerto
  14.             ' ...
  15.             ' ...
  16.           Case comGetNotSupported
  17.              MsgBox "La propiedad es de sólo lectura..."
  18.           Case comPortNotOpen
  19.              MsgBox "El puerto no se ha podido abrir..."
  20.             ' ...
  21.       ' detectar evento esperado
  22.           Case comEvRing   ' el indicador de llamadas ha cambiado
  23.          
  24.           Case comPortOpen   ' el puerto está abierto
  25.               MsgBox "Se ha abierto el puerto exitosamente."
  26.              
  27.     End Select
  28.  
  29.  
  30.  

...y para terminar ... también puedes optar por algo más en sintonía y simple con lo que quieres...:

Pones a la escucha el puerto, una vez abierto
Código: Visual Basic
  1.  
  2. ' a nivel de formulario
  3. dim Salir as boolean
  4. dim buffer as string
  5. dim Valor as boolean
  6.  
  7. ' en evento load
  8. '    busca un puerto serie libre,
  9. '    establece los settings
  10. '    abre el puerto, después de cargado pulsa en el botón de escuchar el puierto serie, añade un botón de parar...
  11.  
  12. ' en enveto de un botón: 'escucharPuertoSerie'
  13. Do
  14.       DoEvents
  15.        Buffer =  MSComm1.Input
  16.       ' no colocar aquí doevents....
  17.       if buffer <> "" then
  18.          Valor=true  
  19.          ' tus acciones
  20.          
  21.          buffer=""
  22.          Valor=false   ' esto podría no ser necesario, dependerá del modo en que se diseñe y utilice...
  23.       else
  24.            Valor=false  
  25.           ' otras acciones
  26.        end if
  27. Loop Until salir=true
  28.  
  29.  
salir se activa y desactiva con un botón o un checkbox...
La comparación de buffer determina que se está leyendo obviamente cuando hagas click se entenderá diferente que cuando no, por tanto una vez finalizado la lectura de buffer, hay que poner 'a cero'  por código no por evento pués no pulsación no genera evento...

ya tienes todo lo suficiente para avanzar y terminarlo... para la próxima di cosas más coherentes...

317
Visual Basic para principiantes / Re: Escribir al principio de un archivo txt
« en: Domingo 29 de Marzo de 2009, 18:59 »
Creo que tienes un ligero problema de concepto...

Escribir al inicio del fichero no es rentable, porque implica que tendrás que desplazar hacia abajao todo el contenido del fichero actual, o bien moverlo a otro fichero (más abajo te describo 2 modos, ensaya cual resultare más rápido al caso, aunque es probable que sucumbas al más cómodo de programar). Esto supone una sobrecarga innecesaria de trabajo... Quizás tengas imaginado que tu escribes al principio y automáticamente no hace falta más...

Si hablamos de unos pocos kb, o si hablamos de algún que otro Mb. pero la frecuencia de escritura es muy larga, tal vez no implique un exceso de trabajo, pero eso debe saberlo quien diseña el programa, es decir tú.

Si a pesar de todo, necesitas escribir al principio, puedes usar una de 2 soluciones:

1 - Como ya se ha dicho moviendo hacia abajo todo el contenido previo, esto requiere calcular direcciones, además de lento, resulta engorroso. Pero recuerda que deberás mover previamente todo para abajo, lamentablemente, el diseño de los ficheros está limitado para 'append' sólo al final, y no al principio. Utiliza open en los modos output o binary (nunca append) y la instrucción para escribir podrá ser, por ejemplo:  put#canal, posición_byte, lo_qué_escribo_cadena/estructura.


2 - Creas un nuevo fichero, añades eso que quieres, detrás 'pegas' el contenido del log actual, al final destruyes aquél y a este le cambias la entensión, por ejemplo de '.tmp' a '.log' . Utiliza open como hasta ahora con el modo Append. Este método es más sencillo de programar.
-----------------

Si dijeras las razones por las que quieres escribir al principio tal vez se pudiera ofrecer una solución más eficaz, esto es conseguir el objetivo buscado en esas 'razones' sin castigar el trabajo de actualización de los ficheros. Dicho de otro modo, no has descrito correctamente tu problema, sino que te has cerrado en banda con 'quiero esto'...

p.d.: Otra cosa que puedes hacer es, no escribir cada vez que surge la necesidad, al fichero, sino guardarlo localmente en una matriz, y al gfinal del la sesión del programa guardarlo todo de una sola vez, entonces sólo rescribes todo el log 1 única vez y no (pongamos que) 200 veces durante la ejecución del programa...

Un pequeño esquema:
Código: Visual Basic
  1.  
  2. ' a nivel de formulario
  3. dim logs() as string
  4. dim nLogs as long
  5.  
  6. ' al carfgar el formulario en evento load
  7. redim logs(0 to 100)
  8. nlogs=0
  9.  
  10. ' añadir un comentario...
  11. private sub AñadirLog( byval log as string)
  12.     if log <>"" then
  13.           if nlogs =ubound(logs) then
  14.               redim preserve logs(0 to nlogs +100)  ' añadimos 100 'líneas' libres más
  15.          end if
  16.           logs(nlogs)= log
  17.           nlogs=nlogs +1
  18.     end if
  19. end sub
  20.  
  21. ' antes de salir del programa, en el evento queryunload...
  22. ' avisar hay operaciones pendientes de realizar...
  23. if nlogs <> 0 then  ' si se guardaron logs...
  24.     dim n as integer, m as integer
  25.       n=freefile
  26.      open ruta & "nombrelog" & ".tmp" .............
  27.      for k= nlogs to 0 step -1 '  recordar escribirlos en orden inverso....lo que tiene la matriz.
  28.  
  29.          ' escribir linea logs(k)
  30.     next  
  31.     m= freefile
  32.     open ruta & "nombrelog.log" ......
  33.     ' tomar del canal #m
  34.    ' escribir en canal #n  
  35.    close #m
  36.     close #n
  37.     kill ruta & "nombrelog.log"
  38.    ' renombrar nombrelog.tmp a nombrelog.log
  39. end if
  40.  
  41.  
  42.  
La ventaja como se ha indicado es que no se abre (cada vez que se genera un log ), el fichero para añadir una línea al inicio y mover el resto del contenido actual. La desventaja es que existe la posibilidad de que ante un error del programa si se 'cierra de repente', se pierde el log generado ....

Por último es más óptimo usar una opción intermedia, mantener sólo una matriz de 100 elementos:
Código: Visual Basic
  1.  
  2. ' a nivel de formulario
  3. dim logs()
  4. dim nLogs as byte
  5.  
  6. ' en load form..
  7. redim logs(0 to 99)
  8. nLogs=0
  9.  
  10. ' rutina del log,  añadir un comentario...
  11. private sub AñadirLog( byval log as string)
  12.     if log <>"" then
  13.           logs(nlogs)= log
  14.           nlogs=nlogs +1
  15.  
  16.           if nlogs = 100 then  '  cuando se llena la matriz...
  17.              ' guardar a fichero los 100 registros... rutina similar a la descrita anteriormente en queryunload...
  18.              ' recordar escribirlos en orden inverso.... o apuntar hacia 99 e ir reduciendo...
  19.  
  20.               redim logs(0 to99)  ' sin, preseve... eliminamos contenido actual
  21.              nLogs=0  ' reiniciamos nueva cuenta...
  22.          end if
  23.     end if
  24. end sub
  25.  
  26. ' en query unload, se investiga, si nlogs es dstinto de 0 hay logs por escribir...
  27.  
  28.  
  29.  

318
Si ese es tu deseo...
Nos dirás al menos el "Significado de Glupet"... ?

319
Visual Basic 6.0 e inferiores / Re: Mscomm
« en: Viernes 27 de Marzo de 2009, 04:31 »
El puerto seriees una entrada de datos digital y tal y tal...

Tú quieres conectar un dispositivo (por llamarlo de alguna manera) analógico....

Cómo esperas  :wub:  que el puerto serie discrimine esa entrada ?????.... :brickwall:  :brickwall:

Sólo estarás produciendo  ruido ...rdhfjrkmcr...

Para enviar una señal eléctrica,  ' a pelo' necesitas algo que haga las veces de un Modem, entre tu artefacto y el puerto serie... eso de conectar corriente a los pines...  :hitcomp:  directamente...  :hitcomp: ...podrías cargarte la circuitería.  :brickwall:  :brickwall:

320
Visual Basic 6.0 e inferiores / 2 clase Base
« en: Jueves 26 de Marzo de 2009, 17:19 »
================= 2 clase Base =====================

La clase base es una clase que implementa un timer y una colección y se le han añadido algunos métodos y eventos.
Para ser honestos, sería mejor convertir esta clase en una interfaz, por razones de rendimiento. Sin embargo eso me supone escribir más código... por lo tanto queda como ejercicio para el interesado, (si desea reconvertirlo9.


Esta clase es una clase cuya finalidad es ser instanciada, de hecho 3 clases que se expondrán en otros apartados son implementaciones de esta clase con los añadidos pertinentes (razón de más para que esta fuera una interfaz).

He preferido exponer esta clase antes que el formulario principal, por 2 razones, la 1ª es que parte de la funcionalidad de aquel no se entendería sin antes exponer esta clase (y otra) y la 2ª es que el formulario tiene más cuenta exponerlo como archivo adjunto para no tener que detallar las propiedades, los controles usados, etc...), aunque el código igualmente se expondrá para ser explicado.

Sin más, expongo el código y paso a las explicaciones (antes de entrar en las explicaciones pienso enviar el mensaje y luego reeditarlo, por lo que si lees este mensaje y debajo del código no ves explicaciones deberás esperar a que termine de editarlo.)

Código: Visual Basic
  1.  
  2.  
  3. ' Esta clase es una CÁPSULA que engloba una colección y un timer
  4. ' la colección admite la posibilidad de limitar cantidad de elementos.
  5. ' el timer se reparte en 2 eventos, y se ha añadido una función de consulta...
  6. ' Toda la funcionalidad es común a las 3 clases, es por ello que se unifica en una sola clase
  7. '   y las instancias exponen sólo las diferencias específicas de cada una.
  8.  
  9.  
  10. Private WithEvents s_Crono         As Timer
  11. Private s_Coleccion                    As Collection
  12. Private p_TamañoCola                As Long         ' determina si hay un límite máximo en cola de entrada, y si lo hay lo fija en un tamaño.
  13. Private p_LimitarCola                  As Boolean
  14. Private p_PausadoEntrantes        As Boolean
  15. Public Condicion                         As Boolean       ' condicion para servir elemento
  16.  
  17.  
  18. ' ambos eventos los provee el timer...
  19. ' sólo salta el evento si la colección tiene eventos y no se cumple la condición
  20. Public Event Crono()
  21. ' sólo salta el evento si la colección tiene elementos y se cumple la condición.
  22. ' la condición debemos activarla cuando queramos que nos devuelva el primer elemento.
  23. Public Event ServirElemento(ByRef Elemento As Object)
  24.  
  25.  
  26.  
  27.  
  28. Private Sub Class_Initialize()
  29.     p_LimiteCola = 0   ' indica que no hay límite de transacciones de entrada.
  30.     p_LimitarColaSolicitud = False
  31.     Set s_Coleccion = New Collection
  32.     p_PausadoEntrantes = False
  33.     Condicion = False
  34. End Sub
  35.  
  36. ' debe invocarse esta función justo tras ser creada la clase.
  37. Friend Function SetTimer(ByRef Tim As Timer) As Boolean
  38.     On Local Error Resume Next
  39.    
  40.     Set s_Crono = T
  41.     s_Crono.Interval = 1000
  42.     s_Crono.Enabled = False
  43.     SetTimer = (s_Crono Is Nothing)
  44. End Function
  45.  
  46. Private Sub Class_Terminate()
  47.     If Not (s_Crono Is Nothing) Then
  48.         s_Crono.Enabled = False
  49.         Set s_Crono = Nothing
  50.     End If
  51.     Set s_Coleccion = Nothing
  52. End Sub
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60. ' PRECAUCIÓN: sólo debería usarse en la instancia de solicitudes.
  61. '   o incluso en la instanacia llamada de ejecución, pero nunca en la siguiente.
  62. '   se debe recordar que funcionan en cascada...
  63. Public Property Get PausaEntrantes() As Boolean
  64.     PausaEntrantes = p_PausadoEntrantes
  65. End Property
  66.     Public Property Let PausaEntrantes(ByVal p As Boolean)
  67.         If p_PausadoEntrantes <> p Then
  68.             p_PausadoEntrantes = p
  69.         End If
  70.     End Property
  71.  
  72. ' pausa, pausa tanto entrantes como salientes....
  73. Public Property Get Pausa() As Boolean
  74.     Pausa = Not s_Crono.Enabled
  75. End Property
  76.     Public Property Let Pausa(ByVal p As Boolean)
  77.         If p_Pausado <> p Then
  78.             p_PausadoEntrantes = p
  79.             s_Crono.Enabled = Not p
  80.         End If
  81.     End Property
  82.    
  83. Friend Property Get Intervalo() As Integer
  84.     Intervalo = s_Crono.Interval
  85. End Property
  86.     Friend Property Let Intervalo(ByVal x As Integer)
  87.         s_Crono.Interval = x
  88.     End Property
  89.    
  90. ' el timer provee 2 eventos, ambos sólo si la colección tiene elementos.
  91. '  Se sirve el primer elemento siempre que se cumpla la condición.
  92. '    la condición es un valor buleano que asigna la instancia de esta clase.
  93. '    es allí donde se decide cuales son las justificaciones de la condición.
  94. '    puesto que cada instancia tendrá condiciones distintas, lo único común es
  95. '    precisamente, definir que se 'cumplió la condición' ... de este modo es común a todas las instancias.
  96. ' cuando no se cumple la condición se genera el evento  crono, que ofrece la oportunidad de evaluar si se cumple o no la condición.
  97. '  es allí donde debe establecerse si se cumple o no la condición.
  98. ' Dado que se ignora cuando se incumple la condición para cada instancia
  99. '  debe decidirse en cualquiera de los 2 eventos el caso que no, o podría activarse la línea comentada
  100. '  en cuyo caso sólo se puede decidir si se cumple la condición en el evento crono... dividiendo la frecuencia de entregas...
  101. Private Sub s_Crono_Timer()
  102.     If s_Coleccion.Count > 0 Then
  103.         If Condicion = True Then
  104.             Dim it As Object
  105.            
  106.             Condicion = False
  107.             Set it = s_Coleccion.Item(1)
  108.             RaiseEvent ServirElemento(it)
  109.            
  110.             ' se elimina desde la clase que lo añade a otra colección, para hacerlo compatible con
  111.             '   la nueva propiedad añadida a última hora: PausarEntrantes
  112.             'Call s_Coleccion.Remove(1)
  113.            
  114.             Set it = Nothing
  115.         Else
  116.             RaiseEvent Crono
  117.         End If
  118.     End If
  119. End Sub
  120.  
  121.  
  122.  
  123.  
  124.  
  125. ' es una propiedad de administrador
  126. '    si se establece el valor a true, no se podrán añadir elementos mientras
  127. '   el nº de elementos en la colección sea mayor= que el tamaño de cola.
  128. Public Property Get LimitarCola() As Boolean
  129.     LimitarCola = p_LimitarCola
  130. End Property
  131.     Public Property Let LimitarCola(ByVal lc As Boolean)
  132.         If lc <> p_LimitarCola Then
  133.             p_LimitarCola = lc
  134.         End If
  135.     End Property
  136.    
  137. ' es una propiedad de administrador
  138. '   esta propiedad sólo indica en tamaño de cola, pero quien determina si se limita o no, es Limitarcola
  139. Public Property Get TamañoCola() As Long
  140.     TamañoCola = p_TamañoCola
  141. End Property
  142.     Public Property Let TamañoCola(ByVal lm As Long)
  143.         If lm > p_TamañoCola Then
  144.             p_TamañoCola = lm
  145.         End If
  146.     End Property
  147.    
  148. Public Property Get Count() As Long
  149.     Count = s_Coleccion.Count
  150. End Property
  151.    
  152. ' lo hemos puesto variant poque igual puede pedirse por índice que por key
  153. Public Property Get Elemento(ByVal Index As Variant)
  154.     On Local Error Resume Next
  155.     Set Elemento = s_Coleccion.Item(Index)
  156. End Property
  157.     Friend Property Set Elemento(ByVal Index As Variant, ByRef it As Object)
  158.         On Local Error Resume Next
  159.         Set s_Coleccion.Item(Index) = it
  160. End Property
  161.  
  162. ' ni añadir ni eliminar se dejan públicas, ya que sólo una clase añade a otra.
  163. Friend Function Añadir(ByRef T As Object, ByVal Key As String, Optional Despues As Boolean = False, Optional DetrasDe As Long = 1) As enAñadiendo
  164.     If p_PausadoEntrantes = False Then
  165.         If p_LimitarCola = True Then
  166.             If s_Coleccion.Count >= p_TamañoCola Then Exit Function
  167.         End If
  168.        
  169.         On Local Error Resume Next
  170.         Err.Number = 0
  171.         If Despues = False Then
  172.             Call s_Coleccion.Add(T, Key)
  173.         Else    ' esta versión sólo la utiliza la clase de solicitudes...
  174.             Call s_Coleccion.Add(T, Key, after:=DetrasDe)
  175.         End If
  176.        If (Err.Number = 0) Then
  177.             Añadir = ADD_AÑADIDO
  178.         Else
  179.             Añadir = ADD_ERROR_COLECCION  '  se supone que no puede ser: ADD_ERROR_DATOS, se hubiera detectado en la  llamada Add_Transaccion de 1ª fase...(cSolicitudes)
  180.        End If
  181.     Else
  182.         Añadir = ADD_PAUSADO
  183.     End If
  184. End Function
  185.  
  186. ' lo normal es eliminar siempre el elemento 1º, las s_Colecciones están basadas en ínndice 1
  187. '   no usamos esta función en la práctiva, se provee para futuras necesidades...
  188. Friend Function Eliminar(Optional Posicion As Long = 1) As Boolean
  189.     On Local Error Resume Next
  190.    
  191.     If Posicion > 0 Then
  192.         Err.Number = 0
  193.         s_Coleccion.Remove (Posicion)
  194.         Eliminar = (Err.Number = 0)
  195.     End If
  196. End Function
  197.  
  198.  
  199.  
  200. Public Function Consulta_MisPedidosEnCola(ByRef IdRef As Form) As Long
  201.     Dim n As Long, k As Long
  202.     Dim tr As infoTransaccion
  203.    
  204.     On Local Error Resume Next
  205.    
  206.     For k = 1 To s_Coleccion.Count
  207.         Set tr = s_Coleccion.Item(k)
  208.         If tr.Control.IdRef.Name = IdRef.Name Then
  209.             n = n + 1
  210.         End If
  211.     Next
  212.     Set tr = Nothing
  213.     Consulta_MisPedidosEnCola = n
  214. End Function
  215.  
  216.  

Esta clase la hemos llamado cBase.

Como se dijo al principio, el objetivo de esta clase es encapsular funcionalidad que vamos a reutilizar en diferentes clases. La funcionalidad se detalla a continuación:

Se provee servicio para un timer, puede modificarse su propiedad enabled e interval, enabled es rellamada como pausa (y su valor es not enabled ara que guarde sentido), interval se renombra a intervalo.

Puesto que el timer se relaciona con un objeto collection, se provee una propiedad que media entre pausa del timer y el acceso a la colección que se llama PausaEntrantes .

Cuando la clase se inicializa, se crea una nueva instancia de un objeto collection sobre la variable Coleccion. La colección expone los métodos típicos de la colección Add=Añadir, Remove=eliminar, Count=Count,  Item=elemento, pero además se le dota de 2 propiedades más: LimitarCola y TamañoCola así mismo se le añade una función de consulta para búsqueda: Consulta_MisPedidosEnCola

Como decía al inicializar la clase se crea una nueva instancia de colección, y se establecen valores iniciales por defecto a las propiedades.

Tras ser inicializada la clase, necesita una 2ª inicialización (vb6 no permite parámetros al crear clases), esta 2ª inicialización se lleva a cabo sobre la función SetTimer. en dicha función se envía un timer, porque como todo el mundo debe saber las clases no pueden crear objetos (una clase no es un objeto, estrictamente hablando (en VB&) aunque para nuestro efectos es como si lo fuera pues se comporta casi como tal). Sin embargo que no se puedan crear objetos no implica que no pueda albergar y manipular objetos (de interfaz fráfica, por ejemplo un Command, Option, Picturebox... o un Timer).

Esta 2ª inicialización establece valores iniciales al timer que son distntos de los que quedan establecidos en un timer cuando se crea, esto debe tenerse en cuenta para cambiar más adelante estos valores a los deseados. Si la función no recibió un timer devolverá falso, como esto no es deseable este resultado se utilizará para saber si el servidor estará dispnible o no, es más, si devuelve false, el servidor no se 'encenderá'.

El detalle de como recibe el timer, se explica en otro apartado.
Los métodos de la colección han sido rescritos para acoplar la actuación del timer (entre otras cosas), por ejemplo: si la propiedad PausaEntrantes, se establece a True, la función añadir queda 'bloqueada'. Por ejemplo la función Eliminar por defecto elimina siempre el primer elemento de la colección. Count, por ejemplo no se rescribe, pero como podemos desear tener acceso a dicha propiedad de la colección, debemos exponerla. Naturalmente exponer nuestro métodos rescritos (o no) supone que la colección la hemos designado privada, para que no se puedan invocar directamente los métodos Add, Remove, etc... sin pasar previamente por nuestra funcionalidad...

La función añadir, por defecto añadirá elementos al final de la colección (es lo más frecuente), pero como hemos establecido prioridades en las peticiones de los clientes, existe la probabilidad de que se añadan en otra posición, la instancia (de esta clase) que recibe las solicitudes se encarga de gestionar la prioridad, y es desde allí que se señala el punto de inserción en la colección. el resto de instancias de esta clase siempre añaden al final de la clección.

El método eliminar, en teoría siempre debería eliminar el primer elemento en la colección, pero se ha establecido la posibilidad de que pueda, eliminarse un elemento en cualquier posición dentro de la colección, para atender posibles futuros cambios, en el proyecto actual no se utiliza.

La propiedad PausaEntrantes, permite al administrador pausar el servicio, (lo que impide que los clientes puedan añadir mientras eestá en pausa añadir solicitudes) para cualquier tarea que necesite realizar. Este modo de pausa, sin embargo no detiene el trabajo del servidor, pués sigue gestionando las transacciones almacenadas.  También si se dessea puede programarse para que en determinadas situaciones se produzca dicha pausa desde código... Esta propiedad, debe usarse con cuidado, pués el servicio lo que hace es impedir añadir solicitudes en la fase pausada en este modo, desde la fase anterior... en cada instancia, respectivamente se comenta en detalle la implicación de usar esta propiedad.

La propiedad Pausa,si se establece a true (timer.enabled=false)  realmente detiene la instancia, es decir no sirve solicitudes a la siguiente fase, ya que de eso se encarga el timer, que está desactivado. Esta propiedad tiene repercusiones parecidas a la anterior, y el cambio de esta comporta obligadamente el cambio en la anterior. La idea es pausar tanto los añadidos como los envíos a la siguiente fase. Esto puede tener su importancia por ejemplo para consultar el estado real de las transacciones, con fines a verificar el comportamiento, realizar estadísticas,etc... por ejemplo cada 10 minutos podrían pausarse todas, y elaborar un informe de cuantas transacciones tiene cada colección, los valores de sus intervalos,etc.. y luego restablecer el servicio. Esto apenas duraría menos de 1 segundo, y sería util para estudiar y afinar el comportamiento del servidor.... Naturalmente puede utilizarse para razones administrativas diversas, estoes sólo una propuesta de ejemplo.

La propiedad Intervalo, es importante ya que cada instancia deberá tener su valor específico y será más o menos difícil encontrar un balance entre todos que sea el más óptimo, es posible que determinadas peticiones requieran un ajuste específico de cada uno de los tmers. En un caso real debería establecerse casos particulares con valores de configuración específicos, ya probados y demostrados como más efectivos para tipos determinados de transacciones. Por ejemplo, supongamos que el servidor se enciende a las 8 de la mañana y se apaga a las 6 de la tarde (para los clientes, pero hay un cliente administrador que al término del día realiza unas labores determinadas), es posible que lo primero que hagan los clientes sea casi exclusivamente solicitar datos, a medida que pasen las horas es probable que las peticiones estén repartidas entre solicitar datos y guardar datos, y posiblemente hacia el mediodía decaigan tanto unas como otras, en ese momento podría aprovecharse para hacerse gestiones internas de mantenimiento, y en definitiva cada tipo de operaciones tiene un comportamiento que podría optimizarse fijando configuraciones específicas demostradas eficaces...

El timer con su evento, provee 2 eventos a las instancias, que se sirva un evento u otro depende de que se cumpla una condición. Puesto que la condición lóogicamente cambiará en cada instancia, el modo de tiodas las instancias tengan una condición común es que esta tenga un valor reconocido por todas, y cuyo valor lo especifique la propia instancia. Así si no se cumple la condición se devuelve el evento crono (que es el equivalente al propio 'elapsed'  _Timer, del Timer), durante ese evento se evalúa en la instancia si debe cambiar la condición a True o no. Si la condición se estableció a True desde la instancia entonces se genera en el siguiente ciclo el evento servirElemento, que proporciona un parámetro: el primer elemento de la colección. El consumidor del evento (la instancia) en el tratamiento de ese evento tratará de añadir dicho elemento a la siguiente fase... el resto de los detalles es específico de dichas clases que se explicarán en su debido momento.

Hay que recalcar un detalle, al proporcionar los eventos de esta manera, sucede que la frecuencia de trabajo del timer la estamos diviendo entre '2', ya que en un ciclo evalúa si la condición es false y se establece entonces la condición a true, necesita  como mínimo otro ciclo para devolver el elemento desde la condición true... es decir esto influye en el intérvalo real en que se servirán los elementos. Hay 2 alternativas, la más obvia es reducir el intérvaloa la mitad, el otro (que debe estudiarse si interesa o no) es modificar el código como se muestra en este ejemplo alternativo:

Código: Visual Basic
  1.  
  2.  
  3. Private Sub s_Crono_Timer()
  4.     If s_Coleccion.Count > 0 Then
  5.         If Condicion = True Then
  6.             Dim iT As Object
  7.            
  8.             Condicion = False
  9.             Set iT = s_Coleccion.Item(1)
  10.             RaiseEvent ServirElemento(iT)            
  11.             Set iT = Nothing    
  12.         End If
  13.         RaiseEvent Crono
  14.     End If
  15. End Sub
  16.  
  17.  

Como se ve, en este modo alternativo, tras enviar un elemento por una condición True, acto seguido se envía también el ecento crono para restablecer la condición si fuera necesario, no hay por tanto pérdidas de ciclo. Cada cual debería establecer cual método le interesa más y cambiarlo si procede. Si la clase cBase (esta) fuera una interfaz, cada implementación (las instancias actuales de esta clase) podría optar concretamente por la alternativa específica más eficaz al caso.

La propiedad TamañoCola determina el tamaño que puede asignarse a la colección ( la colecciones están basadas en valores long, como límite de sus elementos). Esta propiedad puede usarse como control de desbordamiento simplemente o como se desee. Por defecto el valor se establece a 0 es decir si no se cambia y se alcanzara el límite de 2^31 -1, ocurriría un error y no se podría añadir a la colección. Por último, decir que esta propiedad sólo establece el tamaño de elementos que admite la colección, pero el establecimiento de bloquear añadir elementos tras alcanzar (o si se superó) el n´mero de elemntos en la colección es la siguiente porpiedad...

La propiedad LimitarCola, determina si se actúa en consecuiencia con un tamaño límite de cola. Debe notarse que si la colección tiene un número de elementos y se establece un valor más bajo y luego está propiedad (limitarcola se establece a true), no se eliminan elementos de la colección, (nunca), sólo impide que se añadan más. Aún podría crearse una propiedad que se llamara AutoLimitarCola, de tal modo que tras alcanzar (o si se habia superado previamente) el tamaño de la cola, se desactivara y con ayuda de otra propiedad de ResetLimitarCola que específica un tamaño de cola menor que Tamaño cola volver a añadir elementos. Un ejemplo: si Count = 128 elementos y el TamañoCola lo establecemos a 100 y  ResetLimitarCola =60, significa que al establecer la propiedad AutoLimitarCola, no dejará añadir elementos hasta que count=60 y se volvería a bloquear cuando Count=100. Desarrollar estas propiedades y adaptarlo queda como ejercicio para el interesado...

La función Consulta_MisPedidosEnCola, permite reconocer cuantos elementos de un cliente existen actualmente en esa colección. Esta función es síncrona por lo que si la colecciones alcanzan gran volumen de elementos, podría significar un retraso, por tanto debe usarse con precaución y lo menos posible. Podría y debería crearse una función en la clase cTransa que determine el esado de una transacción de un cliente, bsándose en que colección se encuentra y que orden ocupa en dicha colección, si se proporciona un medio que calcule el promedio de tiempo en servir una transacción se podría valorar un tiempoestimado en resolver la transacción por la que un cliente solicita... para no complicar el código, se han evitado funciones interesantes y útiles pero que son ajenas a resolver el problema planteado.

Lo que respecta a esta clase ya se ha explicado.

Nota: no se descarta que hubiera algún fallo o alguna imprecisión en las explicaciones pués en este momento la clase aún no ha sido probada y es posible que se me haya escapado algún gazapo....

Por hoy vale.
p.d.: debe notarse que la mitad del código lo componen líneas en blanco y comentarios...

321
Visual Basic 6.0 e inferiores / 1 Presentación y módulo de arranque
« en: Jueves 26 de Marzo de 2009, 17:08 »
Hola Lagunax...
He decidido cambiar de estrategia, exclusivamente por razones de tiempo, por tanto en vez de exponérte el proyecto en diferentes fases te lo expondré por partes. El caso es equivalente y el fin el mismo que lo entiendas... la ventaja de la idea anterior es que verías como sufre la transformación en cada fase, pero ello me supone dedicarle más tiempo del que quisiera.

Mientras termino (no encuentro tiempo contínuo, para darle el empuje final), iré exponiendo las partes terminadas para que vayas dando bocados...
El código de archivo se expondrá siempre en un mensaje nuevo, aunque luego en el mismo se refiera a otros.


================ 1 Presentación y módulo de arranque ======================

El proyecto se compone de 5 clases, 3 formularios y 2 módulos. Por tanto digamos que se compone de 10 partes aunque se desarrolle en más o menos mensajes.

Para empezar qué mejor que el código del módulo de arranque. Este es muy breve, por tanto luego
El proyecto arranca desde una rutina MAIN, por tanto crea una aplicación nueva para albergar el proyecto, no hagas cambios a éste proyecto, usa una copia para hacer los cambios que desees en áquel, este lo dejas como referencia.

Este código es muy breve, aparte de la sub main, lleva una enumeración y un par de variables. Los detalles explicativos debajo del código.
Código: Visual Basic
  1.  
  2. '  para investigar la razón de cierre y permitir o denegar si hay transacciones pendientes.
  3. Public Enum enCierrePrograma
  4.     CIERRE_NO_DEFINIDO = -1
  5.     CIERRE_USUARIO_USA_BOTONES = 0
  6.     CIERRE_CODIGO_UNLOAD_FORM = 1
  7.     CIERRE_FIN_SESION_WINDOWS = 2
  8.     CIERRE_ADMINISTRADOR_TAREAS = 3
  9.     CIERRE_FORM_FORZADO_FORMMDI = 4
  10.     CIERRE_FORM_FORZADO_CIERRE_PADRE = 5
  11. End Enum
  12.  
  13.  
  14. Public RazonCierre As enCierrePrograma
  15. Public Transa As cTransa
  16.  
  17. Public Sub main()
  18.     frmPrincipal.Show (1)
  19.     ' cuando se cierre el form cliente finaliza la aplicación.
  20.    Set Transa = Nothing
  21.     End
  22. End Sub
  23.  
  24.  

La enumeración 'enCierrePrograma' y la variable 'RazonCierre'  operan en conjunto con las rutinas queryUnload de los formularios. La idea es determinar si hay transacciones pendientes y permitir o no el cierre, para evitar usos indebidos (se expondrá) en su momento un cierre real con transacciones pendientes, se podrá o no ocultar el formulario cliente, de modo que los usuarios 'patosos' no insistan y produzcan una pérdida de datos. Los detalles de esta enumeración se harán cuando se explique el formulario cliente.

La variable cTransa es el sustento del servidor. Cuando se ejecuta main, se abre un formulario es el formulario del administrador del servidor. Este es bastante simple, tiene 2 botones para iniciar y detener el servidor y opciones de comportamiento del servidor.

Cuando se abre el formulario principal se crea una instancia de la clase cTransa. Transa es esa instancia, Transa engloba toda la funcionalidad del servicio, el control de la misma por parte del administrador se realiza a través de ese formulario principal. El

Con el objeto de probar y simular los clientes, se crean desde el formulario del servidor instancias del cliente, una matriz (para el caso). En el caso real deberás modificar este aspecto para que un cliente remoto encienda el servidor si está apagado. Esto sería tan sencillo como añadir un procesado de command$ en este módulo de arranque. Este módulo lo he dejado muy breve porque será quien deba absorver la mayor parte de los cambios que realices a la aplicación. Siendo breve te será fácil modificarlo sin que el cóodigo existente suponga un obstáculo. de hecho incluso la enumeración podrías moverla a otro módulo que se expondrá más adelante que simplmenete recoge los tipos, con lo que sólo te quedarían 1 decena de líneas de código.

El presente proyecto se ha concebido como  un servidor con múltiples clientes 'insitu', es decir no son remotos. La razón es que, lo que se trata de exponer es la interoperatividad asíncrona de los clientes con el servidor (que es lo que pedías), ...y no la conexión.
El presente proyecto se ha concebido con uso de datos definidos por el usuario (estructuras) frente al uso de base de datos. La razón es la misma que la anterior, facilitar la explicación del funcionamiento sin que interfiera los problemas derivados de la inadecuada conexión, errores de instalación etc... de la base de datos. (es un flaco favor explicar el funcionamiento de un motor de 4 tiempos, con un motor real de modo que al tratar de aflojar los tornillos para abrir el motor, estos no ceden y el tiempo se malgasta en encontrar las herramientas para solucionar un problema ajeno al problema inicial, que era pongamos mostrar la forma y localización de las válvulas).

Al caso debe entenderse que una estructura es muy parecido a una tabla. Es más soy de la opinión que las bases de datos aparte de tener tablas de datos deberían tener también tablas de funciones, de hecho te animo a que lo implementes. Crea una copia de tu aplicación y la base de datos para hacer cambios, y no toques la original. ..en otro momento volveremos sobre esto, si al término de la conversación (no de este u otro mensaje), se me olvidare, recuérdamelo con un quote de este párrafo...

En el siguiente mensaje en vez de exponer el formulario principal, expondré una clase básica. Las razones se explican allí...

322
La taberna del BIT / Re: Nuevo récord! ;)
« en: Jueves 26 de Marzo de 2009, 02:51 »
Cita de: "iron man"
Citar
La mayor cantidad de usuarios identificados fue 184 el 24 Mar 2009 06:01 pm

 :good:  :beer:

...y se puede saber que fué lo más visto, la página más visitada y esas cosas... ?

323
La taberna del BIT / Re: y ustedes que opinan?
« en: Jueves 26 de Marzo de 2009, 02:33 »
jejeje, te has despachado a gusto  :kicking: ... esas palabras son meramente un apoyo a F_Tanori.

y créeme , hay depresiones y depresiones que conducen a estrés, porque se junta todo, el hecho es que una ventana abierta que no puedes cerrar acaban entrando muchas más cosas, lo primero que entró o lo que te marcó más fuerte el recuerdo y una futura descripción, no necesariamente es lo único que entró, ni lo único que padeciste. Por abreviar uno no se entretiene en dar explicaciones detalladas de cada escalón...

Y aunque no creas en las normas férreas, hay momentos en la vida en que creas o no se deben asumir, por ejemplo, los médicos que trabajan en la UCI de cualquier hospital sin ir más lejos lo deben imponer a diario en muchos aspectos, visitas a pacientes, higiene, dietas... no por gusto, ni por egoísmo, sino para resistir, para que no  se desborde la situación y sea irremediable, cuando se tenga control (si no ocurre lo peor), luego todo vuelve a su cauce normal.

p.d: Nebire escribió:
el estrés puede hacer que se cojan de repente 10-25kg.
Mosquito escribio:
O adelgazar. El estrés puede ser causa de falta de apetito, de falta de sueño, de falta de claridad en las ideas... Un desastre.

Si, claro, lo que pasa es que nuestro trabajo supone muchas horas sentado, y lo más normal en estos casos es engordar...

324
VB .NET / Re: Probelma con Path.GetFullPath("dibujo.bmp")
« en: Jueves 26 de Marzo de 2009, 02:07 »
nuevamente se ha cruzado un mensaje mientras fabricaba y subía una imagen...

si, estoy en casa, justo acababa de dejar por hoy un ejemplo de programa para otro usuario, cuando he visto tu mensaje... ahora voy a relajarme y a ver una película... Mañana es otro día.

325
VB .NET / Re: Probelma con Path.GetFullPath("dibujo.bmp")
« en: Jueves 26 de Marzo de 2009, 01:52 »
Estaba reditando el mensaje.. cuando ya has conestado..

Te decía que: Para las rutas referidas a la aplicación usa mejor My.Application.Info.DirectoryPath y luego le sumas el trayecto hacia los archivos dentro de esa ruta.

...con eso evitas problemas de localización...

Cita de: "Jimbenit"
Como haria para decirle al acceso directo que extraiga los elementos de la carpeta de instalacion?

El acceso directo llama al ejecutable, es posible indicarle parámetros que luego el programa debe responder recogiendo en Command$... como en VB6... en vb2005 hay más opciones para usar el coomand$... explóralas si las necesitas
Una imagen de muestra:

Páginas: 1 ... 11 12 [13] 14 15 ... 29