|
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 ... 12 13 [14] 15 16 ... 29
326
« en: Jueves 26 de Marzo de 2009, 01:41 »
En c:doccuments and SettingsUsuarioMenu InicioprogramasSTAR-OSTAR.lnk Porque si has puesto un acceso directo en el menú inicio, esa es la ruta del acceso directo... el acceso directo es un archivo de extensón lnk (LINK, enlace) que apunta a la dirección efectiva del programa ejecutable... O a estas horas, resulta que no vas a saber que es un acceso directo ??? 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.
327
« en: Miércoles 25 de Marzo de 2009, 15:49 »
Nebire, gracias por responder...
El problema es que el codigo debe ir en un boton y no en el evento paint.
Imagina que se quiere hacer un rectangulo con el objeto rectangle en un picturebox, el usuario digitara valores en unos textbox, de acuerdo a estos valores el rectangulo tomará la forma de ancho y alto. Por ejemplo si el usuario dice que la base es 1 y el alto es 100, el rectangulo será muy angosto y muy alto cuando el usuario pulse un button ("Aceptar"), pero si el usuario dice que la base es 100 y el alto es 1 el rectangulo será muy ancho y de muy poca altura, este se dibujará en el picture cuando el usuario pulse el button ("Aceptar"). No necesito imaginarlo, te aseguro que veo el código sin siquiera escribirlo, pero bueno digamos que imagino ¿¿¿¿¿¿¿¿¿¿¿ y... ???????????? Si uso el evento paint no puedo hacer el efecto de "Introduzco valores, Pulso aceptar y el rectangulo cambia dentro del picture"... Porqué no ???????. Te dejo tiempo para pensarlo... te pondré un ejemplo sencillo, pero no antes que repienses tus desafortunadas afirnaciones (desafortunadas por incorrectas, nada más, que no se vea ningún desprecio en ello) . Te invito a que demuestres porqué no puedes hacer lo que te decía en el evento paint consiguiendo lo que tu quieres hacer... sólo te doy una pista, que no es una pista, que es la madre de la programación: 'control', tu tienes el control, controla... Te lo puedo decir de otro modo: ¿ para qué crees tú que sirve el evento paint ?, ¿ Qué es lo que hace el evento paint ? , en vb2005, en vb6 o en cualquier lenguaje habido y por haber... ¿ qué crees tú que hace autoredraw ?
328
« en: Miércoles 25 de Marzo de 2009, 15:37 »
El estrés tiene tanto una componente física como síquica. Cuando uno sospecha o le diagnostica que tiene estrés. Debe reflexionar seriamente y hacerse un cuestionario personal para afinar mejor que el médico (por mucho que se quiera lo que le pasa a uno a nivel sicológico quien mejor lo sabe es uno mismo).
Estas preguntas son del tipo: Estoy satisfecho con mi trabajo?. Estoy satisfecho con lo que gano ?, estoy satisfecho con mis amistades ?,,... con mifamilia ?, ... con mi mujer/novia/amante ?, tengo tiempo libre para mi y hago lo que me gusta ?, estoy forzado a hacer demasiadas cosas que no me gustan nada ?, soy realmente yo o finjo para agradar a los demás ?... etc...
Planteadas de una forma directa, de modo que 'no' sea 'lo malo'. Cuantos más 'nos' más probable es que realmente uno esté estresado. El estrés es un desajuste, un desencanto, entre lo que uno quiere hacer y lo que realmente hace, el estrés viene cuando las riendas de tu vida no están en tus manos. Tal como está el mundo esto es cada vez más difícil, especialmente cuando empapelan tu vida con obligaciones 'de por vida' (viva la redundancia). Se deb en lo posible tomar el control de tu propia vida, es buenoi desprenderse de aquello superfluo. Personalmente he comprobado que dedicar una parte de tu tiempo libre a ayudar a los demás en el modo que te sea posible también ayuda, pero esto al final al salir... es prioritario mirarse por dentro y armarse de voluntad... la paciencia se rompe cuando aparece el estrés, el estrés es como si la paciencia se hubiera agotado...
Hay que establecer cambios, realistas, pero no radicales, al menos no de golpe, en todo caso poco a poco. Lo primero es dedicar más tiempo a tí mismo, éste empieza por dedicarle más tiempo a la higiene personal (tiene un efecto sicológico,no por otra cosa), por ejemplo en vez de ducharte y afeitarte por las mañanas deprisa y corriendo, hazlo por la tarde al llegar a casa, con tranquilidad... Si tu mujer te obliga a ir todos los días a casa de su suegra, zánjalo posiblemente le costará un disgusto a tu mujer, de modo que antes de ello háblalo, exponle los cambios que vas a hacer en tu vida, que de entrada serán provisionales y que más adelante cuando te sientas mejor ya verás si son definitivos.
Lamentablemente si el estrés fuera motivado únicamente por motivos económicos y las ratoneras a las que esto lleva será más difícil aceptarlo si la situación no cambia. Aquí la componente del materialismo es una barrera difícil de batir...
Respeto de las noticias y la TV. lo mejor es mirarlo lo menos posible, porque no sólo es que dan malas noticias, sino que parece que se regocijan en ello, a juzgar como tratan las noticias, es horripilante ver, como dicaen un pdre viola a su hija de 4 años, para acto seguido decir, 'el jugador de fútbol xxxx marcó el gol 200 en la liga de este año', lo mezclan todo en la misma olla, como aquel toma un lápiz y un rotulador juntos, sin inmutarse y con toda la crudeza del mundo... lo mejor es despreciarlos, no viéndolo. Cuando sus espectadores caigan en masa quizás decidan preguntarse a qué se debe y mientras eso llega lo mejor es no ser partícipe de sus razones para seguir haciéndolo.
Si el estrés se debe a asuntos laborales, hay que empezar por analizar el cuestionario de rigor: gano el dinero suficiente ?, estoy infravalorado en mi empresa ?, si decidiera cambiar de empresa se me valoraría más ?, doy más horas de 8-9 ?, algún compañero me hace la vida imposible?, ...y un trabajador por encima de mi ?, trabajo mientras como ?, me llevo trabajo a casa ?... y finalmente, necesito que todo esto suceda ?. Si esta respuesta es no, habrá que empezar a rechazar las que podemos controlar y dependen de nosotros, empezando siempre por las menos drásticas. Empezar por dedicarle un tiempo a la comida y apagando el teléfono móvil, el teléfono móvil se apaga al finalizar el trabajo, separar las amistades del trabajo del resto de amistades, en el teléfono personal no dar el número a nadie que tenga que ver con el trabajo si alguno lo consigue por otros medios bloquear sus llamadas. Sólo tener un teléfono para el trabajo si la empresa lo paga, si no es el caso, entonces cuando pregunten 'no tengo teléfono, llámame a la oficina... natrualmente en horario de trabajo, porque luego no hay nadie que pueda recoger las llamdas.' . Si no afecta a tu puesto de trabajo y a tu economía de supervivencia, reduce las horas de trabajo a lo que marca la ley y a lo sumo 1 hora más al fía, pero se acabó el horario que no tiene horarios. En los períodos sin trabajo (fines de semana y demás), no te juntes con compañeros del trabajo de hecho ni siquiera hables de trabajo con nadie, del mismo modo que cuando estás en el trabajo no hablas de fiestas y diversiones sino que te centras en tú trabajo, debes aprender a que cuando estás en tu tiempo fuera del trabajo, debes olvidarte por completo del trabajo, de los compañeros, de tu jefe y de todo... céntrate en lo que estás haciendo.
Si el problema del estrés es básicamente económico, y de él derivan el resto de problemas es posible que sea más difícil, posiblemente se deba a que siempre has considerado un status social más o menos elevado como 'normal', donde menos está mal visto. Es mejor considerar normal lo justo para sobrevivir y lo demás un 'extra'. La ventaja es que si te van bien las cosas, serás más feliz que el resto, porque ellos se considerarán normal y al mismo nivel tu te considerarás afortunado, y en malos tiempos tu te considerarás en estado normal y los otros como que han entrado en decadencia. Esto es mejor haberlo mamado desde chiquito, acostumbrarse de mayos es más difícil. Si es posible cambiar de trabajo a otro, hazlo sólo si tienes la seguridad que es para mejor, si esto es incierto entonces sólo aventúrate si al menos tienes la garantía de que no vas a caer en una situación peor que la actual. Hay veces en que el problema es la falta de respeto de compañeros/jefes, ya se sabe que cuando hay confianza, como dice el refrán: 'al villano dale el pie que se tomará la mano.' Normalmente al cambiar a otra empresa no existen esas confianzas y puedes salir reforzado, especialmente si a ahora tienes más cuidado en no dar confianzas en exceso.
Crisis... qué crisis ?. La crisis es un invento sociológico de control de masas. Las crisis no existen. Si una empresa le van mal los negocios se viene a pique, y otra/s absorbe/n el hueco dejado por ella, es decir el pastel se reparte. Es imposible que todo un entramado empresarial se venga abajo en todo el mundo. Si todo va bien, de repente de un día para otro no puede hundirse todo. Una crisis es como un anuncio de bomba en medio de un restaurante, nadie quiere quedarse a ver si es verdad o mentira, esto causa una estampida de terror, que es lo que sucede cuando se dice crisis, crisis, crisis, crisis, crisis, crisis... por todos lados, los inversores dejan de invertir por miedo , el que tiene poco gasta menos por miedo, el que iba a abrir un negocio se esperará algún tiempo por miedo, es una reacción en cadena de miedo... pero como tal no existe, acaba por aparecer finalmente una crisis como resultado de actuar con miedo tal cual si existiera la crisis. El efecto final es el mismo ... pero previamente no existía ninguna crisis. La crisis ha sido gernerada por miedo a la crisis. Esto es algo así como si uno tiene miedo de tener un virus y manda a unos médicos que le operen de inmediato para quitarle 'el virus', después de varias operaciones posiblemente acabe con un virus por el riesgo corrido en esas intervenciones cuando inicialmente estaba sano.
Cuando los ricos del mundo deciden recoger beneficios (cada 8-15 años), riegan el mercado con la palabra crisis, y le dan soporte o validez ó creencia firme pistoletazo de salida, con algún escándalo internacional normalmente de tipo malversación de fondos, estafa... en esta supuesta crisis ha sido el 'caso Madoff', pero el dinero que ese señor ha estafado es el dinero de los grandes inversores, es decir bancos y multimllonarios, a nosotros no nos ha tocado nada. Otros más poderosos que esos 'grandes inversores' aprovechan la ocasión, de repente todo parece valer menos, ellos compran ahora a precio de ganga y cuando se disipe la 'crisis' lo revenderán por piezas a nuevos grandes inversores emergentes... su negocio es básicamente ese, sembrar crisis mundiales o en determinados países, comprar a bajo precio y hacerse así con el control de loo que desean... y lo más cursioso es que suele vérseles como salvadores por que 'arriesgaron', por empresas cuando había crisis con grandes compras, fusiones e inversiones... es todo una falacia, un negocio. Las crisis no existen como tal. Sino sólo a escalas mínimas, una empresa, una persona... un país cuando entra en guerra... el resto es inventado y sólo sucede como consecuencia del miedo, es decir como un efecto no como una causa cuyo efecto sea el miedo. Es el miedo la causa y la crisis el efecto.
Personalmente atravesé una etapa de estrés cuando tuve un accidente en el que murió mi mujer y yo casi, pase varios meses en el hospital más cerca del otro lado que de este, y al 'volver', me esperaba una larga rehabilitación lo perdí todo y fue como volver a nacer, aprender a anadar... en fin empezar de nuevo en todos los sentidos. el mundo se te viene encima como una pesada losa, tus armas son tu voluntad de no rendirte, un trabajo quizás escaso pero constante día a día, el resto lo hace el tiempo. Eso si, aprovecha para hacer los cambios que siempre has querido hacer y que por diversas razones ajenas directamente a tu voluntad nunca las pusiste en práctica. En mi caso muchas 'amistades' desaparecieron, por aquello de que ya no les eras útil, lejos e entristecerte acabas por alegrarte porque así descubres los falsos amigos, los retiras y tu vida tiene menos obligaciones... al que cierres la puerta, no se la vuelvas a abrir, volverán a fatigarte con sus lamentos y con sus intrnasigencias.
Si el estrés afecta a tu salud, algo nunca descartable, cambia tus hábitos de comida: nada de comida preparada, nada trabajar y comer mientras trabajas, dedícale su tiempo a comer y a reposar la comida. el estrés puede hacer que se cojan de repente 10-25kg. si fuera el caso, dedica parte de tu tiempo libre a actividades 'de calle', pasear media hora por las tardes después del trabajo y hacer ejercicio los fines de semana, si tienes medios salir de la ciudad a un lugar que tenga aire puro en vez de contaminación. Establece normas férreas sobre las estancias de tu casa, en la cocina sólo se cocina, en el comedor sólo se come y se come sólo en el comedor, en la habitación sólo se duerme y nada más... si comes en la cocina y ves la tele en la habitación y te llevas el trabajo ala cama acabarás padeciendo insomnio. Dedica cada estancia exclusivamente para la finalidad concebida desde tiempos inmemoriales.
Con todo deberás quererte a tí mismo más que nuncay dedicarte a ti mismo más tiempo que nunca, se egoísta, esto es provisional hasta que retomes el control de tu vida, no te preocupes si la gente te acusa o parece acusarte de lo que sea, cuando todo pase da las explicaciones oportunas, sólo quines merecen la pena aceptarán y comprenderán tus motivaciones y tus explicaciones, los demás olvídate de ellos son paja y son más sólo un estorbo, llenos de intereses egoístas toman pero NUNCA ofrecen, por no ofrecer ni siquera te ofrecerán el oído para hacerles llegar las explicaciones oportunas de tus cambios.
Me he extendido... pero en estos mensajes es difícil ser breve si quieres repasar un poco por encima las cosas...
329
« en: Miércoles 25 de Marzo de 2009, 06:16 »
Si los manuales se meten en un foro sin interacción el visitante, viene, bebe y se va... y adios quien te vió ? Bueno, de eso se trata, te compartir y sobre todo no tener que repetir las mismas explicaciones cada vez que llega alguien y no se lee los temas anteriores. Si vemos que hay temas recurrentes, se planta un tutorial y punto, te lo lees y luego ya preguntas las dudas que tengas.
Bueno de eso y de lo que decías al abrir el hilo : ... Pienso que puede llegar a ser una buena forma de aumentar drásticamente el número de visitas redirigidas por Google.
Si sólo es para compartir, para eso está el FTP del foro, sería cuesión de poner enlaces en el propio foro. Pero si además queremos que más gente nos visite, pero para quedarse que mejor que tengan justo al lado donde hacer preguntas... Ya sabemos que la mayoría no va leer una sola línea, y ya sabemos que muchos ni siquiera van a busca r si el tema ya se ha explicado, no van a usar el buscador del foro, por ignorancia o por vagancia siempre preguntan, es casi inevitable. Lo que no necesitamos es gente pululnado por los foros haciendo preguntas fuera de sitio, para eso lo mejor es que los manuales estuvieran justo en el hilo que versa en el tema, aunque luego hubiera un foro exclusivamente para eso, poniendo enlaces redirigidos a cada foro específico. Sea como fuere al menos hemos conseguido que Iron Man siguiera mi consejo de cambiar el fondo de los stickies... se gana en claridad.
330
« en: Miércoles 25 de Marzo de 2009, 06:01 »
Tienes que poner los métodos gráficos dentro del evento paint del contenedor deseado. Si no sabes como dibujar líneas, te pongo un copy/paste de otro mensaje anterior: http://foros.solocodigo.com/viewtopic.php?f=53&t=37584&p=136812#p136812Si en vb6.0 querías hacer una línea dentro de un picture hacía como indicas picture1.line(xo,yo)-(xf,yf),color . Al hacer esto fíjate que el grueso de línea y algunas otras opciones gráficas quedaban definidas por el contenedor donde se dibujaba es decir picture1.DrawWidth implicaba el ancho de los métodos gráficos referidos al picture1.
Ahora en VB2005-2008... se ha querido separar e independizar, te pongo un ejemplo que será más significativo y te comento dentro del mismo:
Dim p = New Pen(Color.Red, 2) ' Creo una 'brocha' del color y ancho indicados ' suele ser útil si vamos a emplear mucho gráfico importar la clase Imports System.Drawing.Graphics ' cuando queremos utilizar un gráfico a nivel de formulario suele ser útil describir una variable para usar los gráficos Dim g As Graphics ' para usarlo en un momento dado, por ejemplo en un picturebox g = PictureBox1.CreateGraphics ' esto indica que g vamos a usarlo dentro del picturebox1 ' finalmente de ejemplo una línea: g.DrawLine(p, xo, yo, xf, yf) ' el pen que indicamos, y las cordenadas todas juntitas...
331
« en: Miércoles 25 de Marzo de 2009, 05:33 »
Esto ya sería una tarea. Te he proporcionado toda la base, sólo te falta 'decorar'... Si no sabes como cambiar 4 textbox, entonces es mejor que tomes un manual y te apliques a la lectura.
332
« en: Lunes 23 de Marzo de 2009, 07:42 »
el SSTab funciona perfectamente con activeSkin y si se "VE", lo unico es que no se le puede aplicar el skin nada mas porque como dijiste soporta solo algunos...yo nunca lo he usado, simplemente se como funciona... Al decir que 'no lo ve' no quise decir que se quede invisible ni que deje de funcionar, sino que causa espanto ver 30 controles en un formulario con un skin y un control 'desnudo'... Cuando se usa un skin, o se lo aplica a todos o a ninguno. Controles como el SSTab tienen la particularidad de que ni siquiera se puede establecer el color de fondo para que al menos entrara en consonancia, con el color del skin. dicho de otro modo, el color del fondo es el fondo del contenedor original. Yo no desanimo a la gente para que no lo use, sino solamente señalo que tengan en cuenta que si piensan usarlo que se pare a pensar de antemano que controles va a llevar su aplicación y si todos se podrrán revestir con el skin. Nada más.
333
« en: Lunes 23 de Marzo de 2009, 07:32 »
sin crear estar matandose creando un .bat ni nada, sin usar el IExpress que de paso no creo que le llege al talon m al INNO SETUP en opcion para instaladores de aplicaciones saludos. Eso está bién para los usuarios, si alguien que se pretende programador no es capaz de poner en orden 4 líneas que tiene un bat, más vale que se dedique a otra cosa. Como indica Jimbenit, 'cuando se lea las 8 páginas del Inno Setup' del manual que le indica no se acordará de casi nada, y para entonces ya habrá experimentado 20 veces con Iexpress, que desde luego no tiene 40 opciones, por algo lo llamaron Iexpress, y para programas que se componen de una docena de archivos son apenas 30 clicks y 10 líneas de código. antes de correr es mejor aprender a andar, pienso yo. El Iexpress viene con Windows, de modo que estés donde estés lo tienes a mano, es otra ventaja...
334
« en: Domingo 22 de Marzo de 2009, 19:49 »
Hola, el activeskin no soporta controles que no tienen la propiedad HWND como el label o el image, saludos. Esto no es exactamente así. Para ser más exactos, el activeskin, sólo funciona con un puñado de controles estándard, razón por la que nunca lo he usado, por ejemplo el SSTab tiene Hwnd, como contenedor que es, pero ni lo 've'... Si tu aplicación se remite a usar cuatro botones y unas cajas de texto, pués vale, pero como te salgas de la 'caja de arena' ya 'embarras toda la cocina', algo así como les ocurre a los gatos...
335
« en: Domingo 22 de Marzo de 2009, 19:41 »
Hola, ni hace falta ejecutar un .bat , el inno setup tiene para registrar automaticamente...algo asi: para los OCX cambia , pero es asi de facil...
No mezcles cosas. Estamos hablando del IExpress no del INNO Setup, tu mensaje, lleno de buenas intenciones sólo ayuda a confundir a nuestro aprendiz... Cuando pregunte algo acerca del INNO Setup, seguro que tu respuesta será apropiada, pero si pregunta por la 'librería de la localidad' no le mandes a la 'barbería de la localidad'. basicamente son solo regserver... regserver activeskin.ocx...
El Comando es: Regsvr32 Ruta (si tiene espacios es obligatorio que vaya entre comillas) , por ejemplo: regsvr32 "C:WINDOWSsystem32MiControl.ocx"
La ruta puede ser la de la carpeta de instalación, o bien mover los archivos directamente a la carpeta system32 del equipo... Para especificar la ruta de windows puedes utilizar las constantes del sitema, por ejemplo: regsvr32 "%windir%system32MiControl.ocx"
. Donde : %Windir% implica la ruta donde está instalado el S.O. El resto creo (porque no expones el bat que se pueda consultar) que es un simple problema de prioridad, si el orden no es el correcto, es normal que ocurra un error. Deberías primero desempaquetar y distribuir los ficheros, luego registrar las librerías y al final, sólo entonces ejecutar la aplicación. Si primero distribuyes los ficheros y luego ejecutas sin previamente haber registrado las librerías es razonable que te dé error. Si tienes que mover desde el bat alguno archivo de sitio, por ejemplo si el ocx lo desempaquetas en c:MiProgramamicontrol.ocx , y qieres registrarlo en la carpeta de windows, previamente deberás moverlo.. tal que así: move c:MiProgramamicontrol.ocx %windor%system32micontrol.ocx regsvr32 "%windir%system32MiControl.ocx"
336
« en: Domingo 22 de Marzo de 2009, 10:52 »
Yo no lo creo: Los "stickies" son aceptables cuando son menos de 5, porque cuando son mas, el foro se ve caotico.
Los stickies son molestos porque tardas unos segundos en ver donde acaban y donde empiezan los temas del foro. Pero esto tendría fácil solución si el fondo del stickie tuviera un color destacable y muy diferenciable del fondo del resto, ... la vista entonces se posiciona rápidamente y resulta mucho menos molesto. Si los manuales se meten en un foro sin interacción el visitante, viene, bebe y se va... y adios quien te vió ?... es mejor que estén en el foro específico al que el manual está dedicado, con ello existe la posibilidad de que el visitante decida si consultar las dudas por las que quiere conseguir un manual y/o a pesar de que se descargue el manual existe la posibilidad de que todavía intervenga.
337
« en: Domingo 22 de Marzo de 2009, 06:43 »
... a ver , te explico Un bucle for...next es un contador, un repetidor o si se prefiere un condicionador... la función que hace es repetir algo x veces por ejmplo: coloca un botón en el formulario, ariba a la derecha , agranda el formulario verticalmente y no muy estrecho... copia este código y ejecútalo. Private Sub Command1_Click() Dim año As Integer, k As Byte Static veces As Integer Form1.Cls Form1.CurrentX = ScaleX(20 + veces, vbPixels, vbTwips) Form1.CurrentY = ScaleY(10, vbPixels, vbTwips) Form1.Print "Este año nace un niño..." año = 2009 For k = 1 To 30 Form1.CurrentX = ScaleX(40 + veces, vbPixels, vbTwips) Print "El año " & k + año & " el niño tendrá: " & k & " años de edad... ": Next veces = veces + 3 End Sub
Verás que el programa escribe un montón de líneas... en el código sólo hemos escrito una línea de texto, como ves el bucle se encarga de repetir varias veces lo contenido dentro del mismo... Para entender bien el bucle pulsa varias veces seguidas el botón, verás el texto que 'se va desplazando a la derecha'... En realidad pulsar el botón 20 veces es cansado, es repetitivo, precisamente para eso existen los bucles para ahorrarnos el trabajo de repetir manualmente un bloque de código determinado. Para el programa, ahora pulsa la tecla de función: F8 (encima del par de teclas '9' y '0' ), púlsala una y otra vez verás que el cursor marca una línea (probablemente la resalte de color amarillo) estás en el modo paso a paso... llega así hasta el bucle y verás como al llegar anext, retorna a la 1ª línea del bucle. ...ahora vamos por if... then...else 'if' típicamente es un conndicional, en lenguaje claro diríamos que sirve para hacer preguntas, así de claro... yo puedo preguntarte ¿Qué edad tienes?, pero este dato cuando se pide , se pide para algo, por ejemplo cuando te para un poli por la calle y te dice que llevas el tubo de escape de la moto suelto y te va a hacer de regalito una multa saca su libreta el lápiz y te pide el nombre te dice son X la multa, luego te pide los documentos de la moto y tú le dices, no los llevo, los olvidé en casa, entonces el te dice, si no tienes papeles, la multa sube X más... Estamos usando 'if ' de modo desapercibido, si tienes los papeles de la moto te puedes ir, si no los tienes tendré que aumentarte la multa... programado sería If papeles= true then ---call Vete_Donde_quieras Else ---multa= multa + X end ifPara ilustrarte un ejemplo práctico retocaremos el programa inicial... añadiendo un condicional if.. Le diremos al niño que si ha cumplido los 20 años que se vaya de casa que ya es mayorcito... Observa que el código es el mismo, que el anterior, excepto al final de la línea de texto, hemos sustituído los 2 puntos por una coma y hemos hecho un un añadido... Private Sub Command1_Click() Dim año As Integer, k As Byte Static veces As Integer Form1.Cls Form1.CurrentX = ScaleX(20 + veces, vbPixels, vbTwips) Form1.CurrentY = ScaleY(10, vbPixels, vbTwips) Form1.Print "Este año nace un niño..." año = 2009 For k = 1 To 30 Form1.CurrentX = ScaleX(40 + veces, vbPixels, vbTwips) Print "El año " & k + año & " el niño tendrá: " & k & " años de edad... ", If k >= 20 Then Print " Ya es hora que te vayas de casa eres mayorcito": Else Print: End If Next veces = veces + 3 End Sub
Con esto debería bastarte para entender el if y el for....
338
« en: Sábado 21 de Marzo de 2009, 20:10 »
Hola Lagunax, te comento...
El programa de ejmplo ya está bastante avanzado, no obstante mañana tengo el día bastante ocupado. Así, entre el lunes y el martes espero encontrar otro momento para finalizarlo... probarlo (por si se me coló algún error de bulto9 y subirlo.
339
« en: Sábado 21 de Marzo de 2009, 06:54 »
se abre el instalador, pero no me abre el cmd para registrar las .ocx, sino que me abre el programa, pero no tiene registradas las .ocx da un error, y cuando cierro ese error, se abre la ventana de cmd. no se si me explique bien. Perdona que tarde en responder pero como tardaste bastantes días en contestar, imaginé que lo tenías todo resuelto... Porqué no expones el código del .bat... ? así veremos si tienes las órdenes en la secuncia adecuada...
340
« en: Viernes 20 de Marzo de 2009, 02:58 »
Es realmente corta tu imaginagión...
Aver algo sencillito... Que tal recorer los meses del año y devolver los nombres de aquellos que tienen exactamente 30 días... ? Ó si te resulta complicado trabajar con meses, qué tal recorrer los 1000 primeros números y encontrar todos los primos... ? (empieza por el 2).
341
« en: Jueves 19 de Marzo de 2009, 17:54 »
Bien, aquí en mi localidad nos tomamos 'puente' hasta el lunes, por tanto tengo un tiempo disponible... si no te importa te lo mostraré en 3 o 4 pqueños proyectos de modo que a cada paso el proyecto es lo anterior más algunos cambios o añadidos. De ese modo el seguimiento del mismo te será creo que más fácil entenderlo... Si lo coloco todo terminado es probable que te cueste segurilo y entender la relevancia de cada cosa.
Descripción del primer proyecto: Así pués el primer proyecto será el flujo entre las partes implicadas... para simplificar el caso y no depender de posibles errores y /o malas instalaciones, configuraciones, en ejemplos nunca suelo trabajar con bases de datos sino con estructuras de modo que se separa claramente lo que es entender el problema planteado de los posibles problemas de los defectos o carencias ajenas al puro entendimiento del problema.
En este proyecto proveeremos una clase que trabaje con las colecciones y provea los eventos, es quien despacha las transacciones. Y proveeremos un formulario que actúa del consumidor de esta clase. en el siguiente proyecto se crearían instancias de este formulario para simular diferentes usuarios...
... queda a la espera ...
342
« en: Jueves 19 de Marzo de 2009, 17:35 »
Nebire gracias.... Me encuentro en la parte de creación del instalador, pero al intentar instalar el framework en Windows XP (en algunos PC) me produce un error, me dice que falta el archivo netfx2.msi, ¿Has tenido alguna vez el mismo error?, ¿Como lo solucionas?... Saludos. La idea no debe ser que tu aplicación incoprpore el framework en el instalador por las siguientes razones: 1 : aumenta mucho el volumen del instalador, si es una aplicación gratuita puede hacer desistir a mucha gente de instalar tal cosa para lo que se sopone que va a hacer 2 : fuerzas a que quien lo vaya a instalar deba confiar en que la copia del framework que incluyes no contiene virus... esto no puedes ni garantizarlo tú, porque no es una apalicación tuya, no esperes que confíe nadie por tanto en ello. 3 : Si se diera el caso, de que el framework incorporara un virus (muy a tu pesar), se te podría hacer responsable de alguna manera, aunque sólo fuera para sembrar desconfianza en ti. 4 : Tu instalador puede quedar desfasado en cualquier momento. 5 : quizás quiera instalar tu programa pero no el framework, quizás ya tenga uno más nuevo instalado o quizás tenga uno más viejo pero uno nuevo me ha dado determinados problemas que no quiera repetir... 6 : muy importante, el framework se provee en idiomas, sería adecuado que si existe disponibilidad se instale preferentemente el del idioma de la cultura del equipo donde se va a instalar o bien dejarle elegir... tampoco vas a incluir varios framework en tu instalador para satisfacer todas las posibilidades... 7 : ...hay muchos más peros... no me entretengo ... La solución adecuada es incluir en tu aoplicación la ruta de descarga del framework e indicarle al usuario si desea descargarlo, si dice que si compruebas que la dirección puede descargar el archivo , si es así lo descargas y al término lo lanzas (ejecutas) si no es así le señalas un enlace general por ejemplo: http://www.microsoft.com/DOWNLOADS/Sear ... laylang=es... y fíjate que cambiando al final 'es' por la adecuada le permites cambiar el idioma, para ser más exacto incluye un combobox donde le solicitas el idioma , y por defecto le dejas seleccionado el de su equipo, sólo tendrás que añadir unos caracteres para ambiar la ruta de descargas en el lenguaje deseado. Por último si el usuario tiene problemas de instalación del framework, no es responsabilidad tuya, tu no fabricaste el framework, es de Microsoft, por tanto el soporte para resolver problemas deberá localizarlo el usuario, no tu y deberá buscarlo en Microsoft no recurrir a ti... que por otro lado si tu no lo has construído sabrás resolver cualquier problema que surja ?. sin lugar a dudas no. Si todo esto no te convence allá tú... pero las cosas son tan claras como te las he explicado. p.da.: mientras respondías el mensaje anterior, edité mi primer mensaje añadiendo explicaciones adicionales, quizás te interese volverlo a releer...
343
« en: Jueves 19 de Marzo de 2009, 17:09 »
Es sencillo... Dim framW As String Dim rev As String With System.Environment.Version framW = .Major & "." & .Minor & "." & .Build rev = .Revision End With MsgBox("Framework: " & framW & " revisión: " & rev )
...claro que por otro lado, no es muy aparente... por cierto, a las bravas podrías localizarlo buscando la carpeta en ...C:WINDOWSMicrosoft.NETFramework ... leyendo los nombres de las carpetas, tal que son: vX.Y.zzzzz donde x es el 'mayor, y el 'minor' y z el 'biuld' la por tanto un trabajo de strings retirando la 'v' de (versión) y comparando se sabe cual es la versión más actualizada... claro que existe la posibilidad de que uno cree (y por tanto falsifique) una carpeta de nombre similar... pero bueno para un último recurso valdría... Aquí lo básico, luego sería cuestiónde hacer un bucle examinado lo antedicho con la matriz carp (carpetas) Dim Sf_sistema As String = System.Environment.SpecialFolder.System & "Microsoft.NETFramework" Dim carp() As String = System.IO.Directory.GetDirectories(Sf_sistema) for k=0 to carp.length ' comprobar lo anteriormente indicado... next
344
« en: Jueves 19 de Marzo de 2009, 15:44 »
Básicamente tu programa no tiene que hacer nada excepto detectar cuando la base de datos está inoperante, por exceso de tráfico, para informar al usuario y en todo caso guardar las transacciones localmente si la importancia de guardar los datos es muy elevada.
Casi toda la responsabilidad de esa tarea recáe en la base de datos. Nunca he usado Access2003 por tanto no puedo referirte como se comportará con accesos recurrentes, si te diera problemas trata de trasladarlo a SQLServer. La cuestión es la base de datos la has diseñado tú ? o tú sólo has creado las funciones de consulta y actualización de la BD ?. Si es lo 2º el administrador de la BD es quien debería proveer las transacciones recurrentes. Si todo depende de ti, no te queda más remedio que empollarte la utilización de Access2003, para poder establecer la funcionalidad adecuadamente.
Se supone de entrada que hay un servidor que porta la base de datos y se supone que hay varios terminales que tienen una instancia (copia) del programa que has realizado. si esto es así en teoría no debería haber problemas, si los hay hay que acceder a la parte de administración de la base de datos y hacer lo cambios pertienentes, en SQLServer sería tocar la BD Master para configurar algunos parámetros (de permisos de usuarios más que nada) y quizás crear algunos trigger...
En el supuesto y raro caso de que el acceso a la BD fuere desde un único terminal y se hicieran varias transacciones a la BD desde dicha instancia ver nota para que las llamadas fueran concurrentes estas deberían tratarse como multihilo. Lo cual puede programarse con cierta facilidad usando 2 timers que procesan las transacciones. Un timer está a la escucha de transacciones entrantes, si detecta una lo añade a una coleccion de transacciones, el otro timer procesa la transacciones de la colección si detecta que la colección contiene transacciones toma la 1ª dentro de la colección y la procesa, al final de dicha transacción dedica un evento para notificar el resultado de la transacción y acto seguido elimina dicha transacción de la colección, en un pequeño intervalo volverá a consultar si hay transacciones pendientes...
El manejo de la colección podría y debería incorporar capacidad de prioridades, cada funcionalidad que se realice en una base de datos debería tener una prioridad, cuando se realice una petición de una transacción se consulta su prioridad, para añadirla en la colección de transacciones debe hacerse en la posición que le corresponda. esta posición se determina recorriendo la colección de atrás adelante, y tomando la posición la que se alcance cuando coincida una transacción del mismo nivel de prioridad (va detrás de esa) . Un par te punteros que describan: Transaccion_Espera_prioridad_Minima y Transaccion_Espera_prioridad_Maxima registran cual es la prioridad mínima y máxima actualmente en la colección, entonces añadir una nueva transacción puede colocarse directamente al inicio o al final sin recorrer toda la colección comparando dichos valores, al eliminar una transación de la colección habría que actualizar dichos valores, pero seguiría siendo rentable si la cola de transacciones llegara a ser muy alta, para una concuerrencia de unas pocas decenas es probable que no se note eficiencia. Opcionalmente la prioridad podría ser horaria, es decir última en entrar última en procesarse, por tanto en este caso siempre se añadirían al final y se eliminarían del principio....
Básicamente el mecanismo de recurrencia está descrito en los 2 párrafos anteriores, pero como te digo las bases de datos hoy por hoy incorporan dichos mecanismos, sólo deben hacerse las configuraciones precisas (y especialmente los permisos de acceso de los usuarios)... por ejemplo si se determina una cola máxima de transacciones en la coleccción en espera de procesar, cualquier petición de añadir una nueva transacción en espera será respondida como cola llena "guarde localmente su propia cola de transacciones en espera y vuelva a solicitar dentro del intervalo x"... El cliente al recibir dicha notificación de vuelta si la transacción no procede de otra instancia de este mecanismo lo guarda en una instancia de este mecanismo de modo local y actualiza su timer a un intérvalo sugerido de x, cuando la cola de transacciones esté abierta quizás el intervalo de espera debe cambiarse a uno más fluído, esto se debe enviar como el evento de respuesta de la transacción...
p.d.: si necesitas un ejemplo sencillo para crear y administrar un sistema de cola de transacciones podría escribir un pequeño código ilustrando los pasos sencillos, pero deberías ser paciente ya que tampoco tengo en estos momentos todo el tiempo del mundo para atender en el foro como me gustaría... pero bueno si cabe la posibilidad de que la descripción de tu problema no fuere exactamente como describes y necesitas un mecanismo de este tipo, lo indicas y con paciencia le dedicaría algún ratillo...
nota: (es decir habría una aplicación secundaria por cada operario que envía sus datos a este programa y este los postprocesa para manejarse con la BD... no sería lo más óptimo pero en configuraciones donde sólo un terminal es potente y los demás son poco potentes o viejos quizás sea la solución provisional más aceptable)
345
« en: Martes 17 de Marzo de 2009, 14:56 »
¿Qué es un "pad de firma"?  Supongo que se refiere a utilizar Captcha... ...respondiendo a joshuacun... Si es así, que yo recuerde así al momento, hay una organización-empresa que proporciona funcionalidad: http://www.captcha.net/ y quizás te interese aumentar conocimientos al respecto repasando por ejemplo desde wikipedia, donde además encontrará enlaces a más sitios y enlaces a implementaciones en diferentes lenguajes..: http://es.wikipedia.org/wiki/CaptchaSi no es así, explícate un poco más a fondo (pareciera que en el foro se cobrara por palabras... lo cual denota usuarios perezosos.).
346
« en: Martes 10 de Marzo de 2009, 18:29 »
gracias, me sirvio solo tengo un problemaen .bat me lo correo cuando cierro el programa xD Perdona no te acabé de entender... Dices que tuviste un problema que has corregido o dices que has tenido un problema y que no has posido resolverlo... si es esto último explícalo mejor...
347
« en: Martes 10 de Marzo de 2009, 13:51 »
El modo más sencillo es pulsando la tecla windows + R (menú inicioejecutar) escribe IExpress, y pulsa aceptar.... sigue los pasos del instalador... Teniendo en cuenta que ya has creado el bat e identificado los archivos necesarios ya lo tienes bastante fácil...
p.d.: el Iexpress te ayuda a crear dinámicamente el instalador, tu sólo le tienes que indicar las opciones deseadas y proporcionar lo que solicita en un momento dado... nombres, rutas...
348
« en: Martes 10 de Marzo de 2009, 02:17 »
me marca un error en esta liena: Private Function Salvar_Imagen(ByVal Ruta As String, ByVal Nombre As String, ByRef UltimoIndex As Long, Optional Formato As SapAcquisitionFormts = SAP_FORMAT_JPG) As Boolean
No se ha definido el tipo definido por el usuario
Eso no es un error es una 'ignorancia'... piensa.. yo no tengo el control ese 'sapAdquisition...' como no lo tengo ignoro cuales son los métodos y propiedades que pueda tener, haciendo uso de la lógica ayudado por un poco de imaginación, ASUMO que debe tener una enumeración que refleje los formatos. Pero esto, como digo, yo lo ignoro, porque eso es específico de ese control 'sapadquisition...' como comprenderás yo no voy a conocer al detalle los miles de controles que hay en el mercado de las cámaras de fotos, la enumeración de formatos debes buscarla tú en la documentación de ese control. Yo he SIMULADO (lo puedo poner más grande, pero el problema supongo que no es de vista sino de comprensión) un probable nombre que podría tener la enumeración. dicho de otro modo: esta enumeración 'SapAcquisitionFormts' probablemente no exista pero la que exista debe ser bastante semejante y las contantes como: 'SAP_FORMAT_JPG' probablemente tampoco existan ni se correspondan con el valor que yo les dí. Un arquitecto conoce todos los elementos de un baño y sabe como funcionan, lo que no va a saber un arquitecto es como están distribuidos en tu casa ni de qué color o marca son, eso sólo lo sabes tú que eres quien tiene el control 'sapadquisition...loquesea'... .. capische ??? y otra cosa unicamente tengo que agregar tres txt y un button vdd?... Si no quieres hacer nada más, eso sería todo... sin embargo en vez de usar controles textbox, como te indicaba en comentarios en el mensaje anterior sería más acorde usar un control Drive y un control DirListbox para proveer más cómodamente la ruta, para el nombre y el número si basta con un textbox... pero vamos eso va en el criterio de cada uno.
349
« en: Domingo 8 de Marzo de 2009, 15:03 »
Saludos soy nuevo en VB ...seguro para ustedes sera muy sencillo, tengo este codigo:
Private Sub Command1_Click() Dim i% Dim Result As Boolean Dim FileName As String
Result = SapAcquisition1.Buffer.Save("F:datospbaprueba.jpg", "-format jpg", 0, 1) End Sub
...lo que quiero es que cuando yo le de click a este button me guarde en esa carpeta un archivo prueba1.jpg, ... asi la cantidad de veces que sea, de tal forma que yo pueda llegar a tener un archivo prueba1552.jpg si le di click 1552 veces. ..tambien si yo cierro el programa, apago la maquina y en un mes lo buelo a abrir y le doy de nuevo click me guarde el que continuaria osea prueba1553.jpg Gracias Efectivamente es muy simple.... Básicamente debes trasladar el código del botón a una función, para tenerlo más ordenado. La función debe recibir 3 ó 4 parámetros : ruta donde guardar, nombre del archivo, último nº usado y el formato con que se guardará. El código sería algo parecido a: (las explicaciones al final... ) ' a nivel de formulario proveemos la siguiente variables: public type InfoDatos Ruta as string Nombre as string ImgIndex as long end type const Config= "Config.ini" public ImgSalva as infoDatos ' carga el fichero que tiene la configuración del programa, si no existe se crea Private Sub Form_Load() Dim f As Integer Dim fichero As String On Local Error GoTo errorAbrirConfig fichero = App.Path & "" & Config f = FreeFile ' abrimos el archivo config Open fichero For Binary As #f ' leemos los datos del config Get #f, 1, ImgSalva ' aseguramos que tiene valores válidos Call Verificar_ValoresCorrectos ' por si corregimos valores no válidos los volvemos a guardar Put #f, 1, ImgSalva ' cerramos el archivo Close f ' verter los valores de la estructura a unos controles en el formulario, la ruta sería mejor ponerla en dirbox y drive y el nombre en un textbox y el index en un label o textbox.... ' TxtIndex.Text = ImgSalva.ImgIndex ' TxtRuta.Text = ImgSalva.Ruta ' TxtNombre.Text = ImgSalva.Nombre Exit Sub errorAbrirConfig: Close f Call Guardar_Config MsgBox "Ocurrió un problema al tratar de guardar el archivo config (la ruta es accesible?, de sololectura ?)" & Err.Description, vbCritical, "Error de lectura" End ' si no tenemos los datos adecuados finalizamos el programa. End Sub ' guardamos la configuración actual antes de salir Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) Call Guardar_Config End Sub ' botón guardar imagen/es de la cámara, si se precisa se podría poner un bucle iterativo que recorriera todas las imágenes que tenga el 'buffer' de la cámara... Private Sub Command1_Click() Dim k As Long ' es posible que exista una propiedad count quepueda usarse en un bucle, estos detalles son específicos y hay que referirse a la documentación del control ' for k= 0 to SapAcquisition1.Buffer.count If Salvar_Imagen(ImgSalva.Ruta, ImgSalva.Nombre, ImgSalva.ImgIndex) = False Then Beep ' ... código adicional cuando falló Else '... código adicional cuando todo fue bien End If ' si hay una propiedad count, es posible que deba apuntarse a la siguiente imagen, tal vez un SapAcquisition1.Buffer.next ' o tal vez SapAcquisition1.Buffer.Select(k) ' o tal vez sea uno de los parçametros de la propia función salvar: SapAcquisition1.Buffer.save(,,,,K), en este caso debería pasarse también el parámetro k a la función. ' next End Sub ' intenta guardar una imagen, procedente de un buffer en la cámara a un archivo en la ruta especificada en el formato indicado. Private Function Salvar_Imagen(ByVal Ruta As String, ByVal Nombre As String, ByRef UltimoIndex As Long, Optional Formato As SapAcquisitionFormts = SAP_FORMAT_JPG) As Boolean Dim FileName As String On Local Error GoTo ErrorGuardar FileName = Ruta & "" & Nombre & (UltimoIndex + 1) & CorresponderExtension(Formato) ' para pruebas con y sin dicho control, activar una línea y desactivar la otra Salvar_Imagen = SapAcquisition1.Buffer.Save(FileName,Formato,0,1) 'Salvar_Imagen = True ' False If Salvar_Imagen = True Then UltimoIndex = UltimoIndex + 1 ' el parámetro se pasó por referencia, por tanto se actualiza... End If ErrorGuardar: End Function ' dado un formato se devuelve la extensión que le corresponde... Private Function CorresponderExtension(ByVal Formato As SapAcquisitionFormts) As String Dim ext As String Select Case Formato Case SAP_FORMAT_JPG ext = ".JPG" Case SAP_FORMAT_BMP ext = ".BMP" Case SAP_FORMAT_PNG ext = ".PNG" Case SAP_FORMAT_GIF ext = ".GIF" Case Else ext = ".Imagen_formato_no_determinado" End Select CorresponderExtension = ext End Function ' guardamos la configuración actual Private Sub Guardar_Config() Dim f As Integer Dim fichero As String On Local Error GoTo errorAbrirConfig fichero = App.Path & "" & Config f = FreeFile Call Verificar_ValoresCorrectos ' abrimos el archivo config Open fichero For Binary As #f ' guardamos configuración actual Put #f, 1, ImgSalva ' cerramos el archivo Close f Exit Sub errorAbrirConfig: Close f MsgBox "Ocurrió un problema al tratar de guardar el archivo config (la ruta es accesible?, de sololectura ?)" & vbCrLf & Err.Description End Sub ' sin embargo esto no restituye estos mismos datos a los controles ya queda como trabajo para ti... Private Sub Verificar_ValoresCorrectos() If ImgSalva.Ruta = "" Then ImgSalva.Ruta = App.Path If ImgSalva.Nombre = "" Then ImgSalva.Nombre = "Prueba" If ImgSalva.ImgIndex < 1 Then ImgSalva.ImgIndex = 1 End Sub
De entrada la configuración que ha de permanecer entre sesiones se guarda en un simple fichero llamado config.ini que se localiza en la misma carpeta en la que está ala aplicación (app.path) Cuando se arranca el formulario, se lee dicha configuración, si no existe el archivo se crea, y si existe pero tiene datos no válidos garantiza datos válidos, sisucede un error al tratar de leer y rescribir la configuración la aplicación se finaliza, esto lo podrás cambiar a tu gusto... Tras leer la configuración esta se almacena en una estructura, cuando se invoca a la función de guardar imágenes, se utilizan los valores de la estructura. Estos valores deberían poderse cambiar desde la interfaz cambiando cuando interese la ruta, el nombre para el archivo y si se desea el índice de la imagen, usando para ellos los controles necesarios... quizás un menú y un pequeño formulario de entrada de datos, al cargarse el formulario se escribirían los datos de la estructura en los controles, si se pulsa un botón cambiar, recogería dichos datos en la estructura e invocaría a la función de guardar el archivo config, si se cierra el formulario sin pulsar dicho botón se descaratarían los cambios.... antes de guardar los datos en la estructura habría que validar (evento validate) que los valores tienen valores correctos... En la función de guardar la imagen se envían los parámetros actuales de la estructura (de configuración), el numero que se une al nombre del fichero, sólo se actualiza cuando tuvo éxito guardar la imagen. Importante: el formato que recibe la función no es real es decir se ha simulado una enumeración que se supone que tiene el control 'sapAdqui... ', es decir deberás localizar dicha enumeración si existe, y sustituirla por lo que yo he puesto, si no existe una enumeración pero utiliza valores tu mismo podrás crear una enumeración... si tratas de usar la enumeración que yo he 'supuesto' salvo pura casualidad te saldrá un error de objeto no encontrado.... para simular esta enumeración puede utilizarse el siguiente código de ejemplo añadido al código de arriba, y activando y desactivando las líneas oportunas en la función de salvar_imagen... que in situ se comenta. ' ejemplo para simular una posible enumeración de formatos... si se tiene el control debe usarse la enumeración correcta y los valores adecuados... Public Enum SapAcquisitionFormts SAP_FORMAT_JPG = 0 SAP_FORMAT_BMP = 1 SAP_FORMAT_PNG = 2 SAP_FORMAT_GIF = 3 End Enum
La función que trata la extensión del archivo deberá igualmente atenerse a las indicaciones que señalan en el párrafo anterior... Adicionalmente podrías incluir el formato a la estructura de configuración.... Desconozco el significado de los últimos parámetros de la función (aunque supongo que podrían ser para otras opciones, como por ejemplo definir la calidad para guardar la imagen,etc...), que utlizas para salvar la imagen para cualquier duda al respecto tendrás que dirigirte a la documentación del propio control.... p.d.: el código está hecho 'al vuelo' por lo que es posible que haya algún pequeño error, si sucede así, y no lo descubres informa del error... saludos.
350
« en: Domingo 8 de Marzo de 2009, 12:13 »
Tenía la duda de que pudieras ir por exactamente esa direcci´n, pero como no concretaste, generalcé. No obstante hay una cosa que tienes que tener clara. Una vez que compiles tu programa en cierto modo es como si 'ya no fuera tuyo', es decir el programa no sabe que tu eres su autor aunque a ti te guste pensarlo, digamos que para eso es necesario que tú 'se lo digas'.
Esto es, lo más adecuado es que incluyas EN EL PROGRAMA la funcionalidad deseada para cada grupo de usuarios (perfil, configuracion, permisos), en conjunto con una base de datos donde cada uno hace login para acceder al programa. Dicho de otro modo al iniciar el programa te solicita login, si eres el administrador te muestra un formulario extra, o un menú extra del que se accede a un formulario extra, en ese formulario extra, estarían las funcionalidades de administración (consola, panel de administrador), donde tu señalas que cosas están activas y cuales no para cada grupo de usuarios (perfil, configuración,permisos). Esos cambios se deberían guardar a la base de datos, luego cuando se loguee cualquier otro usuario el programa determina a que grupo de usuarios pertenece y en base a ello habilitará o no las funcionalidades que tu le adjudicaste.
Tal como lo quieres hacer tiene varios inconvenientes: El programa una vez publicado no contempla que tu eres quien lo creó, tampoco contempla el caso de ser un administrador o otro tipo de usuario si el programa no fué diseñado así, es decir te dejará usarlo o no, pero no activará tal o cual funcionalidad... si te peleas contra el 'ActiveDirectory' si podrías hacerlo (también requiere ser diseñado para usarse conjunto a ello), pero el cacao mental para controlarlo es muy superior frente a lo descrito en el párrafo anterior. Aunque 'leas' que un control es de un tipo u otro, la funcionalidad de un programa no está prevista para que se activen o desactiven controles alegremente, sino funcionalidades, una funcionalidad son un puñado de métodos unido a unos controles, eso significa que aunque un control esté deshabilitado podría seguirse usando por una función, o al revés aunque el control esté desactivado una función es accesible ya que las funciones no tienen una interfaz gráfica (sólo es código), lo que requiere que se diseñe una opción gráfica para acceder o no a dicha función.
Con un sencillo ejemplo lo entenderás mejor, supongamos una calculadora, y supongamos 3 usuarios, un niño pequeño que sólo tendrá acceso a las 4 operaciones fundamentales, un usuario normal que tiene acceso a la 'calculadora' estándar y un usuario experto que tiene acceso a la 'calculadora científica'. En este caso, la calculadora puede estár perfectamente definida cada una de sus funcionalidades con los botones que sirven para cada utilidad, pero porque ya se ha previsto durante el diseño de esa manera, no obstante en vez de tener 120 botones y 93 deshabilitados por razones de 'usuario' es mejor reordenar los botones en 3 interfaces distintas (perfiles, configuraciones) una para cada tipo de usuario, cada interfaz gráfica sólo requiere mostrar los botones deseados y reubicarlos de forma 'armoniosa' y útil, los no mostrados son además deshabilitados, sino aunque no se vean todavía serían accesibles con la tecla de tabulación... No queda nada elegante mostrar 120 botones de los cuales nunca tendré acceso a a 80, es mejor que ni siquiera aparezcan se desvanecen las dudas y se evitan ciertas 'intrigas' por ver si se puede 'piratear'...
Ahora observa como aunque entre el usuario niño, si estoy usando la funcionalidad de numeración decimal, las teclas 'A,B,C,D,E' de la numeración hexadecimal están deshabilitadas, todas esas teclas junto a las teclas '0-9' , forman parte de la funcionanildad numérica hexadecimal, por tanto no sería muy útil por ejemplo desactivar una a una cada tecla, o desactivar sólo la 'A', porque aunque no pudiera pulsar la A, siempre podría poner 10 en decimal y luego pulsar al cambio hexadecimal con lo que aparecería la 'A' sin haberla pulsado. Estonces puedes comprender que acceso a una funcionalidad, no implica necesariamente deshabilitar un control. Supongamos que deshabilitas la tecla de cambio de numeración y lo fijas para que no sea posible otra excepto la decimal. ...anular la funcionalidad hexadecimal requerírá también desactivar las teclas ligadas a ello, es decir las teclas antedichas 'A...E', de lo contrario aunque no tenga acceso a uno numérico hexadecimal, se producirían errores si el acceso decimal me dejara usar los botnes 'A,B...E'. Cada funcionelidad está ligada a métodos y controles y un control puede participar en más de una funcionalidad.
En el caso de una calculadora sería más o menos fácil entender que teclas van con una funcionalidad y cuales no, pero además sucede que una misma tecla forma parte de diferente funcuionalidad, si deshabilitamos la tecla lo estamos deshabilitando para que no se use para aquello que queremos evitar pero también para el resto de funciones.... además el caso podría a ser extremadamente complejo según el diseño del programa.
Entonces el modo adecuado de proceder es como te indicaba con CONFIGURACIONES (perfiles, permisos), para establecer configuraciones lo mejor es proveer un formulario aparte (de administración) a la que sólo tiene acceso para ver y modificar el administrador y para ver quizás otro administrador con menos privilegios. en dicho formulario estableces que grupos de usuarios hay y cuales son las funcionalidades a las que tiene acceso. Cuando el usuario se loguea se recoge de la base de datos una estructura (en realidad una tabla) con los permisos que tiene, antes de que aparezca el formulario deseado, durante la carga del mismo se deshabilitan y/u ocultan los botones de acuerdo a la configuración del perfil de permisos, sin embargo ahora se supone que el diseño de permisos está establecido de de forma coherente, y no caóticamente habilitando y deshabilitando botones sin ton ni son.... Esto sólo en la 'consola del administrador'... Y definitivamente como te indico el programa ya debe estar diseñado específicamente para atender cada caso.
Piensa que aunque tengas 700 controles no necesitas deshabilitar uno a uno, sino meterlos todos los deseados en colecciones, por ejemplo: controles disponibles para todos los perfiles en una colección, controles para un perfil concreto en otra colección, controles para un permiso concreto en otra colección, entonces habilitar un perfil es tener una función a la que se le pasa una estructura de permisos, en esa función se invoca a otra función que recibe como parámetro ua colección y el permiso (habilitar deshabilitar), la función lo que hace es recorrer toda la colección y poner cada control al estado que indica el parámetro. Esto es rápido y sencillo. El panel del administrador lo que hace es indicar cuales son las colecciones que tienes (cada formulario y cada contenedor tiene una colección controls), crear y eliminar nuevas colecciones con referencia a un nuevo permiso que crees y habilites y asignar los controles a una u otra colección, finalmente debes guardar la colección y los permisos en una base de datos, pero además debes exponer las funciones y métodos que deben ser controladas, de tal modo que si un control está vinculado a una función activar o desactivar el control hace lo propio con la función y viceversa.
Si por ejemplo reúnes diferentes controles en colecciones en base a permisos, crear y utilizar un perfil, indica el estado para ese permiso activado, desactivado, el procedimiento siempre será el mismo loguear al usuario extraer la tabla de permisos del usuario y filtrar los controles cuando se carga un formulario de acuerdo a los permisos (recorriendo las colecciones de controles que están asignada con cada permiso y activando o activando según indica el estado del permiso),
Si has captado la idea trata de resumirlo aquí mismo y exponer claramente los pasos, luego repaso y corrijo tus dudas... punto por punto. Después de esto haría una pequeña aplicación exponiendo un ejemplo que podrías leer a nivel de código para finiquitar tus dudas.
Páginas: 1 ... 12 13 [14] 15 16 ... 29
|
|
|