FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Función desde ActionScrip2 a Delphi
Hola, amigos.
Tengo un par de funciones en ActionScript2 y me gustaría incluirlas en código Delphi. LLevo varios días intentando traducirlas, pero no sé nada de ActionScript y (a parte de lo que me está costando) ni siquiera tengo la seguridad de hacerlo correctamente. Os pediría que, si alguien entiende los dos lenguajes y tiene media hora libre para hacerlo, me facilitara la tarea traduciéndolas, yo sólo soy aficionado y no no tengo ni idea de ActionScript (ni sabía que existía). Este es el código en ActionScrip2: Código:
function generar(n) { z="Un texto Unicode que no copio por lo raro que es"; f = Math.floor; r = Math.random; B = 4096; d1 = []; d2 = []; m = []; s0 = ""; kr = []; kf = []; ks = []; kt = []; rd = r()<.5; al = z.length; rg = f(al*r()); for (var j = 0; j<10; j += 9) { for (var h = 0; h<3; h++) { if (!h) { m2(j); } m1(m, j+3*h, 3*h+3+j); } } for (var j = 0; j<3; j++) { m[j] = m[9+j*3].concat(m[10+j*3].concat(m[11+j*3])); } m1(m, 0, 3); m[3] = m[0].concat(m[1].concat(m[2])); for (var j = 0; j<9; j++) { d1[j] = j+1; for (var h = 0; h<3; h++) { v = j*3+h; w = 9*(v%9)+f(v/9); m[0][v] = m[3][w]; m[1][v] = m[3][w+3]; m[2][v] = m[3][w+6]; } } m1(m, 0, 3); m1(d1, 0, 9); sl = m[0].concat(m[1].concat(m[2])); for (var v = 0; v<al; v++) { t = (rg+v)%al; k0 = z.charCodeAt(t); nv = (15 & k0)-n; if (k0<=B && nv>=0 && nv<6) { cn = 0; d = k0 >> 8; s = (240 & k0) >> 4; for (var h = 1+t; h<=s+t; h++) { k1 = z.charCodeAt(h)-B; kf[0] = 15 & k1; kf[1] = (240 & k1) >> 4; kf[2] = (3840 & k1) >> 8; kf[3] = k1 >> 12; for (var j = 0; j<4; j += 2) { cn += kf[j]; if (kf[j+1]) { ks.push(cn, kf[j+1]); cn++; } } } q = f(r()*2)+nv*2+f(r()*(nv+1)); for (var h = s+1+t; h<=s+d+t; h++) { kt[h-s-1-t] = z.charCodeAt(h)-B; } for (var h = 0; h<kt.length-1; h += 3) { m1(kt, 2, h+3); } for (var h = 0; h<q; h++) { k3 = f(kt[h]/10); ks.push(k3, kt[h]-k3*10); } lg = ks.length; break; } } for (var h = 0; h<lg-1; h += 2) { kr[sl[ks[h]]] = d1[ks[h+1]-1]; } for (var j = 0; j<81; j++) { s0 += kr[j] ? kr[j] : "."; } return s0; function m1(b, a, c) { for (var i = c-a; i>1; i--) { e = a+f(i*r()); o = b[i-1+a]; b[i-1+a] = b[e]; b[e] = o; } return (b); } function m2(a) { for (var j = 0; j<9; j++) { m[j+a] = []; for (var h = 0; h<9; h++) { m[j+a][h] = a == 0 ? rd ? j*9+h : h*9+j : m[h][j]; } } } } function resolver(m) { if (m == ".................................................................................") m = "13..........13..........13.............................13..........13..........13"; tablas(); s = []; q = []; ct = 0; act = []; aq = []; for (var j = 0; j<81; j++) { s[j] = 511; } e = m.split(""); for (var h = 0; h<e.length; h++) { if (e[h]>="1" && e[h]<="9") { colocar(s, h, e[h]); } } q[0] = resolver2(s).slice(); cons(q[0]); while (ct<81 && ct>-1) { if (ct2<0) { return q[ct].slice(81, 162).join(""); } colocar(q[ct], ct2, act[ct].pop()); if (!resolver2(q[ct])) { q[ct] = aq[ct].slice(); while (!act[ct][0] && ct>-1) { ct--; ct2 = q[ct][162]; q[ct] = aq[ct].slice(); } } else { ct++; q[ct] = q[ct-1].slice(); cons(q[ct]); } } return "sin solución"; function resolver2(s) { do { sp = []; for (var j = 0; j<81; j++) { if (!s[j+81]) { if (t4[s[j]] == 0) { return false; } if (t4[s[j]] == 1) { sp.push(j, t3[s[j]]); } } } for (var j = 0; j<27; j++) { s1 = []; s2 = 0; for (var h = 0; h<9; h++) { if (!s[t1[j][h]+81]) { s1[s2] = t1[j][h]; s2++; } } s5 = s1.length; if (!s5) { continue; } r1 = 0; r2 = s[s1[0]]; for (var h = 1; h<s5; h++) { r1 = (s[s1[h]] & r2) | r1; r2 = (s[s1[h]] ^ r2) & ~r1; } if (s5 != t4[r1]+t4[r2]) { return false; } if (r2) { for (var h = 0; h<9; h++) { if (s[s1[h]] & r2) { s3 = s1[h]; s4 = t3[s[s1[h]] & r2]; if (s4.length>1) { return false; } if (s3) { sp.push(s3, s4); } } } } } for (var v = 0; v<sp.length; v += 2) { for (var j = 0; j<21; j++) { sa = t[sp[v]][j]; if (sa != sp[v] && s[sa+81] == sp[v+1]) { return false; } } colocar(s, sp[v], sp[v+1]); } } while (sp[0]); return s; } function cons(s) { min = 9; ct2 = -1; for (var j = 0; j<81; j++) { if (!s[j+81] && t4[s[j]]<min) { min = t4[s[j]]; ct2 = j; } if (min == 2) { break; } } s[162] = ct2; aq[ct] = s.slice(); act[ct] = t3[s[ct2]].split(""); } function colocar(s, a, b) { s[81+a] = b; for (var h = 0; h<21; h++) { s[t[a][h]] &= ~(1 << (b-1)); } } function tablas() { t = []; t1 = []; t2 = []; t3 = []; t4 = []; for (var j = 0; j<512; j++) { rt = ""; for (var h = 0; h<9; h++) { if (j & (1 << h)) { rt += h+1; } } t3[j] = rt; t4[j] = t3[j].length; } for (var j = 0; j<81; j++) { t[j] = []; t2[j] = [Math.floor(j/9), 9+j%9, 3*Math.floor(j/27)+Math.floor(j%9/3)+18]; for (var v = 0; v<3; v++) { if (!t1[t2[j][v]]) { t1[t2[j][v]] = []; } t1[t2[j][v]].push(j); } } for (var j = 0; j<81; j++) { t[j] = t1[t2[j][0]].concat(t1[t2[j][1]]).concat(t1[t2[j][2]]); n = 0; t[j].sort(16); while (n<t[j].length-1) { t[j][n+1] == t[j][n] ? t[j].splice(n, 1) : n++; } } } } Este es el código que tengo traducido en 3 días. Ni siquiera sé si está correcto.
Gracias, al menos, por leerme. Lo dicho: si alguien puede ayudarme se lo agradezco. Mientras, seguiré peleándome con la traducción. Saludos a todos. |
#2
|
|||
|
|||
Hola.
Sigo peleando, pero no consigo resultados. Por favor. Ya sé que pido algo muy fuerte. Pero si alguien es bilingüe en As2 y Delphi le agradecería el esfuerzo. Si no fuera importante para mi, no os lo pediría. No consigo el resultado deseado con Delphi. No sé si se pueden llamar las funciones desde Delphi y obtener su resultado. Las tengo en ficheros .FLA, pero no sé si se pueden llamar desde Delphi en Android ni cómo se podría hacer. Saludos a todos. |
#3
|
||||
|
||||
La verdad, dudo que haya aquí mucha gente que sepa ActionScript. Yo sé que es ECMAScript con esteroides (JavaScript también es un dialecto de ECMAScript), pero desconozco hasta qué punto es igual o no.
Claro que en tu caso, quizá sea más fácil escribir el código Pascal desde cero en vez de traducir. Última edición por Ñuño Martínez fecha: 25-04-2016 a las 20:23:21. |
#4
|
|||
|
|||
Gracias Ñuño.
El problema es que no entiendo las funciones. Ni sé cómo usar la minibase de datos que va imbuída en cuatro o cinco líneas en Unicode. Voy intentando traducir lo que voy entendiendo. Según tengo entendido AS1, AS2 y AS3 son como "hermanos" más pequeños de Flash y Flash es parecido a Javascript también. Por éso puse la consulta en este foro. El gran problema de las funciones es que creo que hay alguna parte que trabaja a nivel de bit y entender la forma en que lo hace me está costando mucho. Ya tengo una función generadora de sudokus aleatorios en Delphi(Pascal), pero me parece muy interesante la función que intento traducir porque es más segura y no genera sudokus con más de 1 solución como me he encontrado algunos con la ffunción en Delphi. Además, como la función es aleatoria, en algunos casos tarda demasiado y el dispositivo Android aborta el programa. Un saludo. |
#5
|
||||
|
||||
Se que el tema es antiguo, pero no me he resistido a responder. Yo lo que hubiera hecho, para no complicarme la vida, es hacer la interfaz en Flash y utilizar las funciones que ya tienes, y mostrarlo en Delph (te puedes comunicar con el archivo flash desde Delphi y al revés)i. Se que en la actualidad Flash está tocado de muerte (según parece morirá definitivamente en 2020), pero se pueden hacer interfaces interesantes con él:
Por si alguien quiere descargarse el programa: Desde DROPBOX Desde MEGA Desde MEDIAFIRE Salu2.
__________________
Tengo las manos llenas de dedos... Tengo los dedos llenos de teclas... Tengo las teclas desordenadas... Tengo el desorden muy controlado... Tengo el control en mis manos. |
#6
|
|||
|
|||
Gracias, Germán.
Quizás todavía pudiera utilizar estas funciones, si supiera cómo conectar Delphi y Flash. Pero no tengo ni idea de cómo se utiliza Flash. No sé, si como dices, las funciones quedarían incluídas en el código del programa de Delphi. Si esto no fuera así, no interesaría tener que acompañar el programa con los ficheros Flash. Gracias por tu respuesta. Un saludo.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10) "...si no tengo caridad, nada soy..." (1 Cor 13,1-13) |
#7
|
||||
|
||||
Puedes utilizar el componente SmartFlash de Almdev para tener el archivo Flash embebido en el EXE. Dispone de un método "CallFunction" para poder utilizar una función que incluya el archivo flash desde delphi, o "SetVariable" que cambia variables del archivo Flash desde Delpi también.
Además la interfaz respeta la transparencia del archivo Flash, como en el programa de ejemplo que puse: Salu2.
__________________
Tengo las manos llenas de dedos... Tengo los dedos llenos de teclas... Tengo las teclas desordenadas... Tengo el desorden muy controlado... Tengo el control en mis manos. |
#8
|
|||
|
|||
Hola, Germán.
He descargado SmartFlash de prueba. Tiene 5 componentes, que soportan solamente Windows, no Android, ni FMX. Aún así no he conseguido encontrar, en ninguno de los componentes, las funciones que indicas. No me resuelve nada si sólo funciona en Windows. Agradezco infinito tu esfuerzo. Saludos.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10) "...si no tengo caridad, nada soy..." (1 Cor 13,1-13) |
#9
|
||||
|
||||
Lo siento, no he leído en ninguno de los mensajes que lo necesitaras para Android o FMX, supuse que era para Windows. En cuanto a las funciones que comenté, básicamente se utilizan 3 componentes... tsfFlashList que contiene el/los archivos Flash embebidos, tsfLayeredFlashForm para convertir el Form y respetar las transparencias del archivo Flash, y tsfFlashPlayer que es el que muestra el archivo Flash y es el que contiene las funciones para comunicarte con Flash. La idea en principio seria utilizar la interfaz y funciones ya creadas (en vez de tener que trasladarlo) y mostrar el resultado en un EXE de Delphi, aunque ya no se si era eso lo que buscabas.
__________________
Tengo las manos llenas de dedos... Tengo los dedos llenos de teclas... Tengo las teclas desordenadas... Tengo el desorden muy controlado... Tengo el control en mis manos. |
#10
|
|||
|
|||
Hola Germán.
Toda la razón. Nunca dije que lo intentaba usar multiplataforma. Lo siento. Mi primera intención era traducir la función a Delphi para usarla en cualquier plataforma. Estoy probando los componentes en Delphi XE5, (aunque ahora trabajo con Delphi 10 Seattle, para no contaminarlo con componentes de terceros) He reportado dos dudas al soporte de SmartFlash y estas han sido sus respuestas: Pregunta: "It is possible to use with FMX?" Respuesta: "It only for VCL." Pregunta: "Is it possible incorporate .FLA files?" Respuesta: "No. You can't use fla." La cuestión queda muy clara. Las dos funciones están en un archivo .FLA. Me he bajado de la red un tutorial de Actionscript 2. Ahora que tengo un poco más de tiempo, voy a intentar traducir las funciones a Delphi. Si lo consigo, las pondré en el foro por si alguien está interesado. Gracias especialmente a Germán por su ayuda. Saludos cordiales.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10) "...si no tengo caridad, nada soy..." (1 Cor 13,1-13) |
#11
|
|||
|
|||
Hola...
Hacer una "traducción" de AS2 a Delphi no es tan simple. Muchas de las cosas que se pueden hacer en AS2, no son tan sencillas de realizar en Delphi, un ejemplo es la asignación de valores a un arreglo, en AS2 al hacer: Código:
a = []; a[10] = 534; Dicho lo anterior, adjunto un archivo comprimido con dos clases, una unidad y un archivo .txt que es el código "traducido" de las dos funciones de AS2. Las dos clases son TSudokuGenerator y TSudokuSolver, y como su nombre los indican, una se usa para generar los Sudokus y la otra para resolverlos. La clase TSudokuGenerator contiene un método público Generate(const Level: Integer) al cual se le pasa como parámetro el nivel del Sudoku que se desea generar y al finalizar la ejecución de este método, en la propiedad Sudoku se puede acceder al Sudoku generado. La clase TSudokuSolver se usa para resolver Sudokus y contiene un método Solve(const ASudoku: String) que recibe el Sudoku generado por la clase anterior y devuelve en la propiedad Sudoku el Sudoku ya resuelto. Un par de capturas de pantalla: Saludos... |
#12
|
|||
|
|||
Hola.
Millones de gracias, maeyanes. Por tu esfuerzo y por tu tiempo. Voy a probar tu código y te cuento. (Quizás hoy no pueda...) Te comentaré. Gracias, de nuevo. Recibe un cordial saludo.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10) "...si no tengo caridad, nada soy..." (1 Cor 13,1-13) |
#13
|
|||
|
|||
¡¡FABULOSO!! maeyanes.
Tu trabajo ha sido MAGNÍFICO. Funciona, perfectamente. Sólo una pregunta. ¿Porqué todos los sudokus resueltos terminan con -1? No es que sea un problema. La solución es correcta. Simplemente es una curiosidad. He estado revisando
Pero no encuentro el motivo. No te entretengas en buscar la causa si no lo ves a simple vista. (Ya te dije que era una curiosidad y ya has hecho bastante esfuerzo.) En Google Play tienes el sudoku al que voy a aplicar tu trabajo, (aunque antes tendré que adaptarlo para Android). La App es gratuita y se llama SudokuPlus. Busca por SudokuPlus Jhonalone, si quieres verla. A falta de una solución mejor (como es ésta) estaba utilizando un generador aleatorio, que voy a sustituir por éste que, según su autor siempre genera una solución única. El generador aleatorio, a veces, no lo hace. Nunca olvidaré tu excelente contribución. Un saludo muy cordial. Gracias de nuevo.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10) "...si no tengo caridad, nada soy..." (1 Cor 13,1-13) Última edición por jhonalone fecha: 19-11-2017 a las 20:25:05. |
#14
|
|||
|
|||
Hola...
Me imagino que te refieres a esta parte:
Es un pequeño error, en realidad el ciclo for debería ir de 81 a 161... la posición 162 en la lista Q[FCt] guarda el valor de un índice y este al final del proceso tiene como valor -1, por lo cual no debería agregarse a la cadena de la solución. Saludos... |
#15
|
|||
|
|||
¡Perfecto! maeyanes
Esa era la causa. Como te dije estoy intentando adaptarlo a FMX (Android). El generador, únicamente cambiando la localización de "data.txt", funciona correctamente. En cambio, el solucionador me está dando problemas. El primero era en el procedure "Solve". Consistía en que la function "Solver" me daba un error de "Arguments out of range", he supuesto que podía deberse a que las Strings en FMX comienzan por Cero y he modificado lo siguiente: Cambiándolo por esto:
Ahora la function "Solver" ya devuelve TRUE, pero el procedure "Solve" ahora me está dando error en
Estoy peleando con ello hace 2 días. Si tú sabes porqué y, (abusando de tu generosidad), me sacas de dudas te estaré todavía más agradecido (si es que fuera posible). En cualquier caso, infinitas gracias y un saludo muy afectuoso.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10) "...si no tengo caridad, nada soy..." (1 Cor 13,1-13) |
#16
|
|||
|
|||
Hola...
Sin saber exactamente cual es el error que te reporta Delphi, y leyendo lo de los strings en Android, puedo "adivinar" que el error en Cons(Q[0]); se produce a causa del procedimiento SplitStrToIntList en la unidad SudokuUtils.pas:
Saludos... |
#17
|
|||
|
|||
Hola maeyanes.
El error es: " in not a valid integer value Gracias por estar ahí. Compruebo lo que me has comentado. Saludos.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10) "...si no tengo caridad, nada soy..." (1 Cor 13,1-13) |
#18
|
|||
|
|||
Hola maeyanes.
Toda la razón en SplitStrToIntList . Hemos eliminado el error " is... Ahora tendré que volver a Solve, pues se queda enganchado en un bucle y creo que es alli. Saludos.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10) "...si no tengo caridad, nada soy..." (1 Cor 13,1-13) |
#19
|
|||
|
|||
Hola maeyanes.
Toda la razón en SplitStrToIntList . Hemos eliminado el error " is... Ahora tendré que volver a Solve, pues se queda enganchado en un bucle y creo que es alli. Saludos.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10) "...si no tengo caridad, nada soy..." (1 Cor 13,1-13) Última edición por jhonalone fecha: 21-11-2017 a las 23:17:42. |
#20
|
|||
|
|||
Todo Perfecto, maeyanes.
Estaba cometiendo yo un error. No había tenido en cuenta otra peculiaridad de Android. Sabemos que Windows realiza las instrucciones secuencialmente, pero Android tiene una peculiaridad: los procedimientos los termina completos. Me explico, yo estaba utilizando en mi aplicación de prueba el procedimiento siguiente: Como Android realiza todas las instrucciones del procedimiento en bloque, destruía la clase Resol antes de pasar los valores a Label1.Text y se quedaba colgado el programa. De esta forma:
Todo funciona perfecto. Millones de gracias por tu ayuda. Un saludo muy afectuoso.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10) "...si no tengo caridad, nada soy..." (1 Cor 13,1-13) |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Acceder a Objetos desde una funcion | darkmir | C++ Builder | 3 | 09-12-2013 01:12:41 |
Traducción de función desde delphi | Novás | PHP | 1 | 14-07-2010 19:46:40 |
llamar una función desde un formulario | cjamacaru | PHP | 1 | 03-12-2009 13:52:53 |
Array devuelto desde una función | r1d2m3 | OOP | 3 | 26-11-2009 02:28:20 |
Llamar a una función de una DLL desde PHP | MON___ | Varios | 4 | 06-10-2007 00:06:48 |
|