Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Serapis

#1061
CitarLos científicos han encontrado materiales orgánicos, azúcares y algunas otras moléculas consideradas precursoras de aminoácidos tanto en meteoritos como en cometas, pero hasta ahora, no se habían encontrado proteínas dentro de un objeto extraterrestre.
Me asombra el asombro de los 'cien-tificos'...
o dicho más precisamente 'vaya tontos de las narices'.

El cosmos está compuesto por los mismos elementos en todas partes... para mi ni siquiera sería sorpresa justamente lo contrario.

Los aminoácidos surgen en medio de procesos eléctricos con la presencia de muchos y diferentes gases, gases que en principio parecen inertes. Que luego lleguen o no a la superficie terrestre, tiene más que ver con el calor generado en la reentrada en la atmósfera y por tanto su evaporación. que los aminoácidos acaben en proteínas requererirá condiciones posteriores de tempertura y presión. en un medio cósmico, si algo se enfría extremadamente, la posibilidad de avanzar de un estado a otro queda limitado, por lo que el cambio exige de alguna manera un medio no extremo prolongado en el tiempo (de tiempo incierto).
#1062
Pués solo por poner un ejemplo: La variable tiempo, es incómoda en un laboratorio... ten por seguro que ninguna investigación va a macerar 50 años un producto, para ver qué pasa. Otro ejemplo: Ningún medicamente se prueba a fondo, tan solo se prueba como reaccina con ciertos otros. De hecho basta leer el prospecto, para leer como declinan responsabilidades con: 'no mezcle este producto con otros medicamentos no citados aquí ... pregunte a su médico para otros no citados aquí' (o sea, ellos que lo han fabricado no saben que puede pasar, lo va a saber el médico de cabecera, de chiste).

...y luego están los efectos secundarios, aquellos a los que no les dan importancia oc solo relativa si solo les ha ocurrido 1 vez de cada 10, 100, 1000, 10000, pero que se dan... pero que por supuesto es una forma de decir: 'no vamos a gastar dinero por estas menudeces'.

No. Por supuesto que no, las variables son incontables e incontrolables una vez sale al mundo real. En una probeta, estará todo muy controlado, pero el destino final de un producto, nunca suele ser ese....
#1063
Hay un modo completamente seguro...
Toma un equipo sin unidades internas, funcionando solo a través de un liveCD.
Se crea una unidad en RAM y mediante un usb sueltas el 'bicho' en el redil... antes de ejecutar nada, retira el USB. ...y hale a torear...

Cuando apagues el equipo, todo 'muere' con él...
Pero vamos requieres un equipo o bien dedicado a eso, o bien que puedas desconectar los discos duros, cuando quieras trastear... Al caso convendría ir bien equipado de memoria.

Aunque aún así, siendo cuerdos hay que reconocer que uno 'confía' en el fabricante de las memorias, pero ciertamente no te puedes fiar, quien sabe si tengan fabricado una puerta trasera en ellas que mantenga ciertos datos después de apagado, alimentados por alguna pila...
#1064
Citar
CADENA = objshell.expandenvironmentstrings("HKEY_USERS\"&SID&"\Software\Microsoft\Windows\CurrentVersion\BackgroundAccessApplications\GlobalUserDisabled")

CADENA2 = objshell.expandenvironmentstrings("HKEY_USERS\"&SID&"\Control Panel\International\User Profile\HttpAcceptLanguageOptOut")

Tienes mal formadas las cadenas...
Las cadenas se concatenan con ' & ', es decir debe haber un espacio a ambos lados del ampersand (no he probado, nada simplemente viendo ese error de sintaxis y debajo un 'on error resume next', no he mirado nada más).

El tratamiento de errores, no debe ser así. Se pone cuando se cree posible que pueda suceder un error y tras la instrucción que cabría haber un errror se le interroga: If err.number <> 0 .... es decir se pone justo delante de donde cree que podría darse un error y en tal caso estás obligado a preguntarle inmediatamente después, si no para qué ponerlo???... tampoco tiene sentido ponerlo en otro sitio si se espera que un error pueda suceder en la línea x, debe preceder a la línea x... indistintamente de que tú luego cometas otros errores. Además errores de sintaxis, no son correctos que lleven un tratamiento de error, para eso está el IDE, si no el código no tendría fin, porque con cada variable se puede cometer errores.


Parece que la gente prefiere usar el bloc de notas, a causa de las idioteces de las películas...: Aunque estés operando con VBScript, usa el IDE de VB6, para editar tus scripts...
Simplemente abre un proyecto, elimina el formulario, añade un módulo escribe una función "Sub Main", escribe dentro tu código, en propiedades del proyecto dile que arranca desde 'Main'...
...y así podrás probar tus scripts si funcionan o no, como mínimo te marcará errores tontos como este con la sintaxis... y cuando algo falle, ejecutas paso a paso (tecla de función 'F8')... el debugger de VB6 es muy potente... Y una vez que esté correcto, ya lo guardas donde quieras...

en la imagen se ve la ayuda y una de las 'cadena's corregidas...
#1065
Citarel nuevo cornona virus , que se transmitio de un murcielago a un pangolin , y de este al ser humano
Esto es un 'cuento chino' además contado por chinos....
Quién leches estaba ahí, para ver como un murciélago (el murciélago 0), pasó la enfermedad a un pangolín (pangolín 0) que a su vez se lo pasó a un humano (paciente 0)...  solo falta un vídeo en youtube mostrando el caso...

Desde el mercado de abastos (que dicen que salieron los primeros infectados) hasta el laboratorio de experimentación con virus peligrosos, hay algo así como 100 metros. Apenas había 50 infectados y ya sabían que era 'culpa del pangolín'... pobrecillo.

A mi me parece más razonable que al propio centro se le haya escapado un virus e infectado y matado a varios de sus trabajadores en el centro y para acallar voces y tapar la realidad, decidieran sacar una 'bestia' más sútil del laboratorio y 'soltarla' en el mercado de abastos... después de las primeras decenas de muertos, podrían simplemente sacar 'los suyos', culpando al 'coronavirus' y al mercado de abastos de sus muertes... total en casos de  infecciones graves y contagiosas el protocolo exige incineración, con lo que se elimina cualquier posibilidad de rastreo e investigación posterior.
Así que si alguien en el gobienro de China no estuviera al tanto de lo que pasó en el laboratorio, posiblemente a estas alturas nunca se enteren ya. A mi, la duda que me queda es esa, si el problema parte del gobierno central, si queda recluído a la dirección del laboratorio o (menos probable) limitado a algún investigador en solitario... pangolines llevan comiendo milenios y seguramente en peores condiciones que a día de hoy.

Sobre los clones, coincido en que cada 'recipiente' que actúe de intermediario podría significar una mutación que anule o magnifique la agresividad de un virus...

El problema grave de los laboratorios es que 'juegan a ser Dios', pero fuera del laboratorio, los conejillos de Indias de sus fracaso somos todos, ya que la cantidad de variables en juego diga lo que diga ningún científico, son de entrada desconocidas e inviables de controlar por ningún laboratorio por muy 'avanzado' que diga ser...

Un laboratorio puede investigar que dados: A, B, C ,G, X y T sucede el evento K (y ninguno otro), lo que no pueden saber es que esa sustancia una vez fuera del laboratorio, se enfrentan a miles de variables más que jamás han considerado, no solo la media docena: A,B,C,G,X,T...

Temperatura y presión son sus favoritas, pero el magentismo (por poner un ejemplo en laboratorios médicos pasa desapercibido, tiene que ser un laboratorio de física para que sea una variable clave que participa en la mayoría de experimentos, en los médicos suele ignorarse en todos o casi todos sus experimentos).

...conque deberíamos de dejar de llamar a los laboratorios 'laboratorios', para llamarlos mejor 'alboroto-rios', define mejor el "ni PU74 idea de lo que pasará después con 'esto' que hemos creado cuando salga de aquí"
#1066
Java / Re: Ayuda con programa en Java
1 Marzo 2020, 16:13 PM
En realidad el programa estará controlado por el mnúmero de asientos libres.
Entrarías en un ciclo infinito, si le dices al viajero que ese asiento está ocupado y que elija otro (que tambié está ocupado).


// Inicialmente AsientosTotales = 21  (ó 20 si te expresaste mal).
// Inicialmente AsientosLibres = AsientosTotales
// Inicialmente un array (para un simple ejercicio es suficiente así):
//    Asientos(AsientosTotales) es declarado y dimensionado al número de
//    asientos totales (0 a 20). Y de tipo buleano como ya te han dicho va perfecto para ejercicios.

Si (AsientosLibres > 0)
    mensaje = "Elija su asiento entre el 0 y el 20 (algunos pueden estar ya ocupados)."
    ocupado = ""

    Hacer
        AsientoElegido = EleccionDelUsuario(mensaje + ocupado, 0, 20)
        ocupado = "El asiento " + Asientoelegido.ToString + " ya está ocupado."
    Repetir mientras (Asientos(AsientoElegido) = TRUE)

    Asientos(AsientoElegido) = TRUE
    AsientosLibres  -=1
    Si (AsientosLibres = 0)
        mensaje "Vuelo lleno..."
    fin si
Sino
    mensaje "Lo sentimos no quedan plazas en este vuelo. Elija otra fecha de vuelo u otro destino..."
fin si

Esto te puede dar alguna idea, pero tendrás que acomodarlo a tu código.

Acostúmbrate a poner algo de código o como mínimo un mensaje más descriptivo (ahora mismo es tan genérico que acepta cualquier cosa)... sino lo más probable es que ni recibas respuesta.
#1067
Bueno, lo hice del tirón y con prisas pués tenía sueño.
Ahora despejado del cansancio y con más calma veo que se me han escapado algunos detalles... saco un tiempo y lo corrijo.




pongo corregido como cita, para colorear donde haya cambios (las tiquetas code, no dejan, y (razonablemente) no hay geshi para pseudocodigo.
Citar
// Si devuelve true, valor contiene un número en caso contrario, se debe ignorar
Buleano = Funcion SiguienteToken(arraybytes Data(), porreferencia entero Indice, porreferencia entero Valor)
   TokenDeNumero tkn
   buleano negativo  // false de entrada

   Si SaltarEspaciosEIgnorarDesconocidos(data, indice) = FALSE devolver FALSE

   tkn = CharsToken(data(indice))
   si (tkn AND TOKEN_SIGNO) luego  // <--- este condicional debía ir por encima del bucle
       Hacer
           negativo  = (tkn = TOKEN_SIGNO_NEG) //true si el signo es negativo
           indice += 1
           Si SaltarEspacios(data, indice) = FALSE devolver FALSE  
           tkn = CharsToken(data(indice))
           si (tkn = TOKEN_DIGITO)
               salir del bucle
           sino
               negativo  = FALSE    // se invalida el resultado previo, hay caracteres desconodicos tras el signo que se encontró.
               Si SaltarEspaciosEIgnorarDesconocidos(data, indice) = FALSE devolver FALSE  
               tkn = CharsToken(data(indice)) // <----linea olvidada
           fin si        
       repetir mientras ( tkn  <> TOKEN_DIGITO)   // <---- la condición de reentrada va mejor abajo
       // visto que al inicio entra si signo, y repite hasta encontrar un dígito, es básicamente lo mismo pero queda más claro así
   fin si
   
   // proveo la solución a los dígitos '0' a la derecha (simplemente se filtran antes):
   Hacer mientras (data(indice) = 48)   // 48 es el valor ASCII del cero.
       indice += 1
       si (indice = Data.Length) devolver FALSE
   repetir
   
   si (indice < Data.Length)  // <--- el bucle anterior anula su necesidad
       indice += 1  //  ídem     "  ----------  "  --------------- " ídem
   
   Si (CharsToken(data(indice)) = TOKEN_DIGITO)  // tras los ceros, podría haber caracteres no dígitos, se resolverá en otra llamada
       Hacer
           indice += 1
           valor *= 10 + (data(indice) - 48)   // <---- Faltaba el -48, tratamos con valores ASCII...
           si (indice = Data.Length) Salir del bucle
       repetir mientras (CharsToken(data(indice)) = TOKEN_DIGITO)   // <--- faltaba el CharsToken(...) para obtener el tipo de token, si no evaluabamos un byte...

       // si no es negativo, se asume que es positivo.
       si (negativo = TRUE)  valor = - valor  // <--- este condicional es preferible bajo el bucle de digitos,
       // (para no complicar la simplicidad del bucle), si no,  daría error con negativos:    ejemplo: -87; -->  -8 * 10 + 7 = -73; --> -73 es distinto de -87
   
       Devolver TRUE  //y valor contiene el valor correcto, si devuelve false, se ignora el valor que contenga...
   sino
       Devolver FALSE
   fin si
fin funcion

en la siguiente función simplemente sobra una línea:
Citarentero = funcion ParseStringToSumasYRestas(arrayBytes Data() )
   entero total, valor, indice
   
   Hacer mientras SiguienteToken(Data, Indice, valor ) = TRUE
       total += valor
       indice +=1 <--- sobra esta línea.
       si (indice = Data.Length) salir del bucle  //  <--- esta línea no sobra, pero podrría omitirse si se recibe info extra de vuelta
       // el último dígito de un número podría ser también el último del string...
   repetir      
   
   Devolver total
fin funcion

Finalmente indicar que es posible optimizarlo más... si uno se fija bien, podría llegar a haber un chorro de multiplicaciones "*10", tantos como dígitos haya, por cada número... técnicamente solo es necesario una única multiplicación, el resto pueden ser convertidas en sumas. Tiene su tiempito hacer dicha modificación, por lo que lo dejo al esfuerzo de los interesados...  
#1068
Es mucho más potente (y sobre todo cómodo cuando la gente no domina las expresiones regulares), realizar un automáta que haga justo la parte que se precisa...

Podremos reconocer algo tan complejo como:  " 22  -134 +45 - 087 +170 voy a beber +44j82k"
cuya salida sería: 22 -134 +45 -87 +170 +44 +82 = lo que sume
" +  232"= 232
"+23" = 23
"23   " = 23
"  23"  = 23
" 2323tf" = 2323
" ++++23" = 23
" +-+-+23" = 23
" +-+-23" = -23
" --- 23ffhj"= -23
" 23.34" = +23  +34 (OJO: no se ha contemplado reconocer decimales, ni con punto ni con coma).
...etc... con negativos...

...cosa que para una expresión regular sería más complejo, dada una falta de uniformidad en el texto...
Nótese que si hay números en el ejemplo que no debieran ser reconocidos, debe ser expresado en las reglas más abajo de la forma conveniente... Como es un ejemplo, no voy a abordarlo en profundidad, lo dejo simple pero que se entienda y el interesado que lo amplíe a sus necesidades. Es decir, no considero 3 casos: decimales ni separadores de miles, tampoco otras bases numéricas que la decimal, una vez entendido el ejemplo, no debería resultar complicado al interesado ampliarlo para admitir tales casos.

Las reglas para número son (uno debe ternerlas claro y hacer los cambos precisos):
regla "=" componentes     // comentario
--------------------------------------------
entero = [signo] [spcs] digitos   // el signo es opcional y puede haber o no espacios entre el signo y los digitos
signo = (positivo|negativo)
positivo = "+"     // en ausencia de '-' se entenderá que es positivo.
negativo = "-"
spcs = espacio [spcs]      // uno o más espacios
espacio = " "
digitos = digito [digitos]    // uno o más dígitos
digito = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" // los digitos decimales, aunque si fuera preciso podrían separararse por bases numéricas, y reconocer números hexadecimales, binarios, octal, etc...

* Como es un ejemplo, no contemplo números con signo (en el pseudocódigo, aquí sería modificar numero y reconocer el caracter separador del decimal. Se ha elegido como separador decimal, la comilla simple como usamos en español (cambiese al gusto).
 numero =  [signo][spcs] digitos  ["'" digitos]   // un número es un entero o un decimal.

* Tampoco contemplo separadores de miles, con las mismas consideraciones que para decimales, se ha elgido el punto como se acostumbra a usar en español:
 entero = [signo][spcs] gruposDig
 gruposDig = primeGrpDig [gruposDigitos]
 primeGrpDig = digito [[digito] digito]      //esto es 1, 2 ó 3 digitos
 gruposDigitos = grupoDigitos [gruposDigitos]   // uno o más grupos de 3 digitos
 grupoDigitos = ["."] digito digito digito   // 3 digitos antecedidos o no, por un punto.

El peudocodigo pués empieza por una enumeración y luego un array que contenga a dicha enumeración.

enumeracion TokenDeNumero  //tipo byte
   TOKEN_DESCONOCIDO = 0
   TOKEN_SEP_ESPACIO = 1
   TOKEN_DIGITO = 2
   '
   TOKEN_SIGNO = 4                  // para no disitnguir positivo de negativo, si no solo un signo.
   TOKEN_SIGNO_POS = 5
   TOKEN_SIGNO_NEG = 6
   // otros token separadores que se quieran considerar.
fin enumeracion

Array CharsToken(0 a 255)  // uno por cada byte...

funcion Inicializar
   byte k

   CharsToken(32) = TOKEN_SEP_ESPACIO   // el espacio es el 32, el espacio duro el 160, aquí se ignora...

   bucle para k desde 48 a 57
       CharsToken(k) = TOKEN_DIGITO         // dígitos del 0 al 9.
   siguiente

   CharsToken(43) = TOKEN_SIGNO_POS
   CharsToken(45) = TOKEN_SIGNO_NEG
   
   // y eso es todo, el resto de caracteres son ignorados... tienen valor 0 en el array.
fin funcion


Ahora las funciones de reconocimeinto del número:

// Si devuelve true, valor contiene un número en caso contrario, se debe ignorar
Buleano = Funcion SiguienteToken(arraybytes Data(), porreferencia entero Indice, porreferencia entero Valor)
   TokenDeNumero tkn
   buleano negativo  // false de entrada

   Si SaltarEspaciosEIgnorarDesconocidos(data, indice) = FALSE devolver FALSE

   tkn = CharsToken(data(indice))
   Hacer mientras ( tkn  AND TOKEN_SIGNO)
       si (tkn AND TOKEN_SIGNO) luego
           negativo  = (tkn = TOKEN_SIGNO_NEG) //true si el signo es negativo
           indice += 1
           Si SaltarEspacios(data, indice) = FALSE devolver FALSE  
           tkn = CharsToken(data(indice))
           si (tkn = TOKEN_DIGITO)
               salir del bucle
           sino
               negativo  = FALSE    // se invalida el resultado previo, hay caracteres desconodicos tras el signo que se encontró.
               Si SaltarEspaciosEIgnorarDesconocidos(data, indice) = FALSE devolver FALSE  
           fin si
       fin si
   repetir   ' es un  bucle porque podría ser falsos positivos, casos como: "+   qwrt +asd -zxc ... pero saltarían aquí +   23"
   
   ' si no es negativo, se asume que es positivo.
   si (negativo = TRUE)
        valor = - Data(indice) // [b]ojo: si el valor es 0[/b]... dejo a tu esfuerzo resolver el caso.
   Sino
        valor = Data(indice)
   fin si
   
   si (indice < Data.Length)
       indice += 1
       Hacer mientras (data(indice) = TOKEN_DIGITO)
           indice += 1
           valor *= 10 + data(indice)
           si (indice = Data.Length) Salir del bucle
       repetir
   fin si

   Devolver TRUE  //y valor contiene el valor correcto, si devuelve false, se ignora el valor que contenga...
fin funcion

// Esta función y la siguiente son casi iguales, y no es baladí asignar el valor 0 a desconocidos y 1 al espacio...
// solo salta espacios,
//  Este caso está permitido solo entre signo y digitos: entero = [signo][spcs] digitos
Buleano = Funcion SaltarEspacios(arraybytes Data(), porreferencia entero Indice)
   Hacer mientras (CharsToken(Data(indice)) =  TOKEN_SEP_ESPACIO)
       indice += 1
       si (indice = Data.Length) Devolver FALSE   //final del array salimos d ela función.
   repetir
   
   Devolver TRUE
fin funcion

// esta funcion ignora espacios y caracteres desconocidos.
//  Este caso está permitido cuando termina un número y hasta que comience otro.
Buleano = Funcion SaltarEspaciosEIgnorarDesconocidos(arraybytes Data(), porreferencia entero Indice)
   Hacer mientras (CharsToken(Data(indice)) <= TOKEN_SEP_ESPACIO)
       indice += 1
       si (indice = Data.Length) Devolver FALSE   //final del array salimos de la función.
   repetir

   Devolver TRUE
fin funcion


y finalmente la función que interesada en ello:


entero = funcion ParseStringToSumasYRestas(arrayBytes Data() )
   entero total, valor, indice
   
   Hacer mientras SiguienteToken(Data, Indice, valor ) = TRUE
       total += valor
       indice +=1
       si (indice = Data.Length) salir dle bucle
   repetir      
   
   Devolver total
fin funcion


Esto siempre será más veloz que una expresión regular, además recoge, casos muy distintos de lo que se considera números, que contemplarlos en una expresión regular complicacría y por tanto ralentizaría su resultado. Claro que usarlo o no, depende de si es muy necesario o no, a veces un código menos eficiente (sin llegar a ser deficiente), expresado en 4 líeas e spreferible a otro más eficiente exresado en 200 líneas:
" +  232"=232
"+23" = 23
"23   " = 23
"  23"  = 23
" 2323tf" = 2323
" ++++23" = 23
" +-+-+23" = 23
" +-+-23" = -23
" --- 23ffhj"= -23
" 23.34" = +23  +34 (OJO: no se ha contemplado reconocer decimales, ni con punto ni con coma).
...etc... con negativos...

Por último, notar que en el pseudocódigo tampoco se ha contemplado la posibiidad de desbordamiento, evidentemente un número declarado de tipo entero, dará desbordamiento si se intenta parsear con "987654321987654321987654321".
Se supone que son valores coherentes 'sumables', en un rango fijado a ser aceptado en el tipo de datos numérico apropiado.
Si fuera el caso, podría llevarse una cuenta de los dígitos que se van hallando y cuando se alcance uno más de lo permitido devolver un error... si se contempla posibles errore,s la funció debería llamarse TryParse... y no Parse...


p.d.: Añado nota, para despistados: "// ojo: si el valor es 0... dejo a tu esfuerzo resolver el caso."
#1069
Vaya, ya es casualidad que justo fuera abrir el que usaba funciones no disponiobles en mi versión (hay otro proyecto más también).

Es un trabajo muy elaborado incluso con los ejemplos, así que "chapeau".
Confunde en principio lo de 'label..' pués esperaba un control label y bueno labelplus, se queda corto, quizás fuera más adecuado 'MultiControlPlus', porque no es un simple label, admite imágenes y muchas cosas más que lo llevan a comportarse como distintos tipos de controles, adecuadamente configurado...

Algunas críticas (constructivas):
- El eterno debate entre múltiples controles sencillos y un solo megacontrol que haga todo, aparece aquí. El control es tan amplio, que su problema básico proviene de aquí, será difícil dominarlo para adaptarlo a cada necesidad, en ese sentido es cuando múltples controles sencillos suponen una mejor oferta, cada cual dispone solo de las propiedades y rutinas que son precisas para su labor.
Forzar al control a comportarse como determinado otro, supone modificar muchas propiedades, para configurarlo adecuadamente, lo que exige eso... un dominio completo del mismo...
Por otro lado, no se adjunta info con cada propiedad/función que al menos te aclare su funcionalidad cuando el nombre resulta insuficiente.

- Otra pega que le veo, es que tiene, mejor dicho se compone todo su tratamiento gráfico de llamadas a API. Esto supone dos cosas:
---- La primera puede no tener sentido en ciertas circunstancias pero conviene anotarla igualmente: Si un proyecto tiene chorrocientas llamadas a API, ¿no sería mejor escribirlo en C en vez de en VB?.
--- La segunda es la reutilización, al estar toda la funcionalidad embutida en el propio control, él mismo es grande, y toda su funcionalidad no resulta reutilizable, yo hubiera movido todas esas rutinas gráficas a alguna clase.
Propongo dos opciones... una clase BackBuffer o una clase Draw (la diferencia entre ambas es que Draw sería un compendio de rutinas gráficas, y BackBuffer se asociaría al Handle del control que crea su instancia, con esas pequeñas  diferencias, suponen solo parámetros a las funciones de idéntico nombre pués mientras que en la clase 'BackBuffer', al crear la instancia convendrá pasarle el hWnd y medidas del control para crear la 'superficie'. En tanto que en la clase 'Draw', dichos valores deben ser pasados como parámetro a cada función que los precise...
El caso es que con una de las dos clases el mismo proyecto podría albergar varios controles, pués todo eso código que lo engrosa sería común para todos los controles. Es más incluso aunque uno piense para sí: "como es un único control, ningún otro piodrá aprovechar que haya código movido a una clase"... lo cierto es que todavía en ese caso, sería mucho más fácil a futuro atender al mantenimiento o búsqueda de errores en el control, separando la funcionalidad que se espera del control de las rutinas que le otorgan la apariencia gráfica.

- Otro asunto que he visto, es que por ejemplo, a veces una 'vista se compone de varios controles 'LabelPlus', si mueves el 'grande' los otros se quedan en su sitio, es decir están superpuestos para dar esa apariencia. Lo que aclaro es que sería útil disponer del mismo control en su versión ParentControl = TRUE, es decir que haya dos versiones, la que tienes y otra que actúe como contenedor... eso facilita que cuando sea preciso ese tipo de superposiciones, simplemente estarían dentro del control 'LabelplusCtn' que actúa como contenedor, por lo que su traslado (move), 'enbled', 'visible', etc... se aplica a todo su contenido... por supuesto en ese caso, ese cntrol contenedor, no precisaría cierta funcionalidad, aunque incluso en un caso como un scroll, el control haría las veces de la línea, y el botón desplazable y el 'labelPlus vs 'tooltip', podrian meterse dentroy así actuar en conjunto los 3... Pero en fin, es solo una idea.

- Y básicamente eso es todo, un asunto menor (pués es un proyecto de ejemplo), es que, por ejemplo veo un calendario en un form, montado a base de controles LabelPlus y otros controles, el caso es que cuento la friolera de 70 controles 'LabelPlus', sin contrar otros controles... es un claro ejemplo de como un control dedicado a la funcionalidad buscada, es preferible (al menos para mí), a un megacontrol del que luego precisas muchas intancias y cada cual con las propiedades específicas para lograr el objetivo deseado... yo (por ejemplo) tengo por ahí un control calendario, que es un solo control. Todo lo más que tiene es un shape (y un timer, pués ofrece la posibilidad de mostrar la hora en tiempo real y el timer se usa para dicho caso)... todos los supuestos botones y labels, son métodos gráficos (y ninguna llamada a APIs (si recuerdo bien))...

(por cierto, en ese mismo proyecto (el del calendario), en Win XP, el calandario emerge y se oculta rápidamente, no se ve. Lo he solucionado poniendo la propiedad del form Autroredraw a TRUE y desactivando el timer en tiempo de diseño, uno solo de los cambios no surte efecto. Ignoro si en otros sistemas sucede así, o si esos ligeros cambios para dichos sistemas impedirían verse adecuadamente, si no es el caso, convendría aplicarlos, pués así también queda 'listo' para XP (sé que habrá quien no separa como solucionarlo, y por ello preguntar aquí o allá).

A pesar de todo, como digo hay mucha elaboración detrás de este control y está muy bien afinado.  ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-)
#1070
Cita de: Dara3n en 24 Febrero 2020, 20:49 PM
Bueno, esto no es ninguna duda ni nada pero simplemente siento la necesidad de xpresar en algún lado mis ganas de empezar en esto, se que soy un chaval y que me queda mucho por aprender, pero la motivación no me la quita nadie!!

Deseadme ánimos y eso gente, y obviamente, cualquier consejillo es agradecido  ;D
Si tus conocimeintos son cero patatero, cualquier cosa para empezar vale, un simple libro es más que suficiente y si por tu edad no cuentas con dinero en tu bolsillo, wikipedia tiene muchos artículos, y en la red pues buscar luego para profundizar (si wikipedia se queda corto en un artículo).

Con esfuerzo y paciencia, a la vuelta de 3 años, la respuesta de Aguijon_zerO, podría  ser asequible... es muy importante no abrumarte al principio, cuando te asomes al abismo que supone el abanico de posibilidade de la computación, lo peor que te pueda pasar es que el exceso de información de desmoralice y desmotive.