Una "Framework" o marco de trabajo, es un conjunto de archivos de objetos o funciones u operadores ya escritos que permite mediante una inclusión en el proyecto a desarrollar, hacer uso de tales herramientas para acelerar y dar una excelente funcionalidad al proyecto.
La "Framework" de TEIMSI está situada en la carpeta del programa editor (ver "Localizando la carpeta del compilador"), ahí está la carpeta "tco_sources" que tiene varios archivos con código TEIMSI. Algunos archivos que son el código fuente de archivos objeto "Tco", para saberlo hay que observar si tienen la instrucción "@tco_filename:" seguida del nombre del archivo Tco. TCO (TEIMSI compiled object) es el formato de varios archivos dentro de la carpeta "tco_inc", la inclusión de archivos Tco en un proyecto se hace mediante la instrucción "include_tco" y la inclusión de archivos comunes (.thp, .tsi, .Etc) se hace con "includec". Por ejemplo:
includec(º_scriptdir_\local_bmp_compresion.thp) // Incluye un archivo "local_bmp_compresion" (común) que se encuentra en la carpeta del script .Tsi actual. include_tco(tco_inc\bitmaps\bmpobject.tco) // Incluye el archivo objeto "bmpobject.tco" que está en la carpeta "tco_inc\bitmaps" dentro de la carpeta del editor.
La siguiente tabla muestra los archivos disponibles y si se trata del código fuente de un archivo TCO.
Senda y nombre del archivo de la Framework | Es fuente de un TCO. | Sólo en Edición Profesional | Descripción |
---|---|---|---|
tco_sources\bitmaps\bmpobject.thp | Si | No | Permite cargar y guardar desde un archivo .BMP, y también crear, una variable cadena con formato BMP_OBJ. |
tco_sources\bitmaps\bmp_objcompress.thp | Si | No | Tiene funciones que con un algoritmo sencillo, comprime y descomprime una cadena BMP_OBJ. |
tco_sources\bitmaps\bmpdraw.thp | Si | No | Permite las tareas básicas de pintado en cadenas de formato "BMP_OBJ" (leer/escribir píxel, dibujar un línea o círculo). |
tco_sources\bitmaps\bmpfonts.thp | Si | No | Permite dibujar una letra o texto en una cadena BMP_OBJ. |
tco_sources\bitmaps\extend_paintdump.thp | Si | Si | Tiene una función que permite el pintado por "vuelco de pintura de recipiente" en una cadena BMP_OBJ. |
tco_sources\bitmaps\extract_hstrimage.thp | Si | No | Tiene funciones que permiten "extraer" una copia de parte de una imagen BMP_OBJ hacia otra cadena BMP_OBJ. |
tco_sources\bitmaps\img_adj_nitidez.thp | Si | Si | Permite suavizar o anti-suavizar (dar cierta nitidez artificial) a una cadena BMP_OBJ. |
tco_sources\bitmaps\img_escalar_br.thp | Si | No | Permite cambiar el tamaño de una imagen en una variable cadena BMP_OBJ. Escalado de calidad mínima. |
tco_sources\bitmaps\img_hd_escalar.thp | Si | Si | Permite cambiar el tamaño de una imagen en una variable cadena BMP_OBJ. Escalado de alta calidad. |
tco_sources\bitmaps\ipr_filterblack_br.thp | Si | No | Tiene algunas funciones para tareas específicas sobre cadenas BMP_OBJ (convertir a blanco y negro, .Etc) |
tco_sources\bitmaps\ipr_rotate90.thp | Si | No | Permite rotar 90 grados una cadena BMP_OBJ. |
tco_sources\bitmaps\jpg_to_bmpobj.thp | Si | Si | Permite cargar desde un archivo JPG, una cadena BMP_OBJ (utilizando "tco_sources\jpg2bmp.thp", ver ejemplo dentro del archivo). |
tco_sources\bitmaps\load_pscreen.thp | Si | No | Permite capturar parte de la pantalla en una cadena BMP_OBJ. |
tco_sources\bitmaps\paint_hstrimage.thp | Si | No | Tiene funciones que permiten dibujar una imagen BMP_OBJ dentro de otra (usando un color de píxel específico para la transparencia). |
tco_sources\bitmaps\screen_to_jpg.thp | Si | Si | Permite capturar parte de la pantalla y guardar la imagen en un archivo Jpg. |
tco_sources\bitmaps\supercolorln.thp | Si | No | "supercolorln" carga los píxeles de una linea imaginaria trazada en una imagen BMP_OBJ entre dos puntos promediando un color único y transformándolo para su valor sea uno de ocho colores. |
tco_sources\bitmaps\util_bmpfonts\fontobjcreate.tsi | No | No | Transforma un archivo llamado "baseletras.bmp" con dibujos de caracteres en otro con la expresión de datos para ensamblador que puede re-ubicarse en el archivo "bmpfonts.thp" (ver archivo "tco_sources\bitmaps\bmpfonts.thp"). |
tco_sources\array2string.thp | Si | No | Permite convertir los datos de una matriz en una cadena y viceversa. |
tco_sources\click_move.thp | Si | Si | Tiene funciones para simular un "clic" o movimiento del ratón. |
tco_sources\dir2string.thp | Si | Si | Permite obtener el listado de un directorio y otras cosas más. |
tco_sources\encrypt_v1.thp | Si | No | Tiene funciones de encriptación y para obtener un "CRC" de un archivo. |
tco_sources\extract_cab_file.thp | Si | Si | Permite extraer un archivo comprimido en un .Cab |
tco_sources\filesystem.thp | Si | No | Tiene funciones para el sistema de archivos. (Elegir carpeta, mover archivo, .Etc) |
tco_sources\http_post.thp | Si | No | Tiene unas funciones básicas para hacer una visita a una página de Internet enviando una variable por método "POST". |
tco_sources\jpg2bmp.thp | Si | Si | Permite hacer uso de "jpgdll.dll" que puede convertir de un archivo ".bmp" a un ".jpg" y viceversa. |
tco_sources\load_pcinfo.thp | Si | Si | Tiene funciones que brindan cierta información de la computadora actual y sesión actual. |
tco_sources\odbc_teimsi.thp | Si | Si | Tiene funciones para el uso de OBDC (es un archivo Tco experimental). |
tco_sources\report_timelong.thp | Si | Si | Permite obtener una expresión de una fecha a partir de un entero devuelto por la función "timelong" (predeterminada de TEIMSI). |
tco_sources\round2string.thp | Si | No | Permite redondear un número decimal. |
tco_sources\sort_strarr.thp | Si | No | Permite ordenar una matriz con cadenas de texto. |
tco_sources\sqr_matrix.thp | Si | No | Tiene funciones para hallar el determinante de una matriz o bien resolver un sistema de ecuaciones N x N. |
tco_sources\string_compresion_v1.thp | Si | No | Tiene un algoritmo sencillo para comprimir y descomprimir cadenas. |
tco_sources\text2clipboard.thp | Si | No | Permite leer el portapapeles y escribir en el mismo. |
tco_sources\typek.thp | Si | Si | Permite simular la escritura de texto mediante el teclado. |
tco_sources\user_function.thp | Si | No | Permite compilar y ejecutar una expresión matemática en tiempo de ejecución, también vincularla a variables de número personalizadas. |
tco_sources\wave_object.thp | Si | No | Permite leer y escribir un archivo .wav hacia/desde una variable cadena de formato "WAV_OBJ". |
tco_sources\windowx_apps_info.thp | Si | Si | Tiene funciones para obtener información de ventanas de programas corriéndose en la sesión actual. |
tco_sources\winkerinterface\winkerinterface.thp | No | No | Permite crear en tiempo de ejecución la ventana principal de la aplicación y sus controles, también leer y cambiar propiedades de ellos. |
Para más información de las funciones o el contenido del archivo, leer la primer hoja del mismo archivo de la "Framework".
Los proyectos de ejemplo de aplicaciones se encuentran en la carpeta "projects" situada dentro de la carpeta del editor de TEIMSI (ver "Localizando la carpeta del compilador"). Para compilar un ejemplo puede ser necesario por razones de permisos de usuario; copiar la carpeta del ejemplo (o toda la carpeta "projects") hacia la carpeta "Teimsi_projects" dentro de la carpeta "mis documentos" del usuario. Los ejemplos se describen a continuación.
Nombre del proyecto y carpeta | Descripción |
---|---|
1- Simple_hexstruse | Convierte pequeñas cadenas de texto en una notación cuyos códigos ASCII se expresan en notación hexadecimal y viceversa. |
2- Mp3list_randomizer | Carga los renglones de un archivo "m3u" con sendas de archivos de música (mp3, ogg, .Etc), y crea un archivo con los renglones (canciones) en posición aleatoria. |
3- Avisador_actividad | Permite alertar actividades diarias en una hora fija del día. |
4- Files_separator | Permite crear una copia de una carpeta separando de la carpeta original, archivos con cierta extensión. |
5- Icomaker | Permite crear un archivo .ICO desde un archivo .BMP, que tiene 32 x 32 píxeles de tamaño y debe editarse. |
6- Priority_changer | Muestra como trabajar con números ingresados por el usuario. |
7- Mp3_finder | Permite buscar archivos de música en una carpeta. |
8- Bmpbrujula | Dibuja una imagen de fondo de una brújula y la muestra. |
9- Prime_number | Determina una lista con una cantidad arbitraria de números primos partiendo del número 2. |
10- Wav440hz | Crea un sonido con las frecuencias de una guitarra acústica. |
11- Functioncalculator | Permite realizar el cálculo de una expresión matemática cualquiera, que opcionalmente se puede usar las variables X y Z de valor fijo. |
12- Simplewinxcon | Permite crear la ventana principal de la aplicación usando el archivo incluido "tco_sources\winkerinterface\winkerinterface.thp". |
13- Usercol_in_win | Es una aplicación con ventana creada con "tco_sources\winkerinterface\winkerinterface.thp" que convierte un número hexadecimal en un color. |
14- Bintod_sample | Convierte un archivo cualquiera en una notación especial y viceversa. |
15- Iotest | Ejemplo de utilización de señales en el puerto paralelo. |
16- Asteroid1 | Pequeño juego que utiliza Opengl donde se puede cambiar la velocidad de un objeto con el movimiento del mouse y alterar la trayectoria de otros objetos. |
17- Grafica3d | Graficador sencillo de ecuaciones de dos variables X y Z en un espacio de tres dimensiones. |
Por más información sobre lo que hace un proyecto y como funciona, ver el archivo ".tsi" con el nombre del proyecto dentro de la carpeta con el mismo nombre.
Entre los proyectos de ejemplo descritos anteriormente, hay algunos que tienen programación en nivel avanzado.
El siguiente es un ejemplo del código fuente (script) de un programa numerador de líneas en archivos de un texto gigante.
; //######################################################################################################## /* A diferencia de los archivos pequeños (de menos de 500 kilobytes aproximadamente) los archivos de texto de mayor tamaño deben tratarse de forma distinta o de lo contrario se generará un error de falta de memoria en la instrucción "var arr_lines=explode(_nl,binary_read(arr_files[t]));", eso ocurre porque la función "explode" crea una matriz cuyos ítems son cadenas, y cada cadena utiliza un manejador interno cuya cantidad es limitada en nuestra versión del compilador; además se consume tiempo en crear la matriz de renglones. Por tanto para realizar el procesamiento de archivos no pequeños es recomendable acelerar la tarea apoyándose en la ayuda de ensamblador. El ejemplo de a continuación es relativamente rápido en comparación con otros métodos, aunque la suma de cadenas en TEIMSI puede resultar mucho más lenta que en ensamblador. Se mostrará como se buscan los renglones desde una única cadena que tiene el contenido del archivo de entrada. */ main() function main(){ _savelocal: ult_linea dd ?,num_b_nl dd ?, pos_final dd ?, et_tocall dd ?, tmppos_esi dd ? // "_savelocal" declara variables locales en el procedimiento expresado en lenguaje ensamblador. alert_ex("Este programa de ejemplo, intentará cargar el archivo \"gigante.txt\" numerar sus renglones y poner el resultado en el archivo \"gigante2.txt\" !", "Información", _mb_iconinformation); var inputfile="gigante.txt"; var outputfile="gigante2.txt"; if(-fileexists(inputfile)){ alert_ex("No se halló el archivo " + inputfile, "Información", _mb_iconinformation); return; } var file_content=binary_read(inputfile) // Leer el contenido del archivo en una única cadena grande. var maxsizeline=2000, line=str_repeatn(" ", maxsizeline), reco_reti=0, strout="" // Estas variables son utilizadas en el procesamiento del texto de entrada, la variable line tiene un búfer // de espacio donde se colocará cada renglón del archivo y no debe modificarse. var contador=1 // El contador indica el número de renglón inicial, se incrementará con cada renglón procesado. // El siguiente código de ensamblador situado en el bloque "_direct" se encarga de inicializar variables que serán utilizadas por la rutina interna "RECORRER_TEXTO"; dicha rutina será llamada en un "ciclo" que cargará cada renglón del contenido del archivo en la variable "line". jmp(continuacion_temisi) ; //############################### // Estas líneas tienen una rutina que procesa cada renglón cargado, la etiqueta "procesar_renglon" indica el inicio de esta rutina que es llamada desde ensamblador. procesar_renglon: var line2= contador+"- "+line contador++ strout=strout+line2+_nl // En este bloque de TEIMSI, se podría escribir solamente: strout=strout+line+_nl, lo cual dejaría al archivo de salida "gigante2.txt" con el mismo contenido del archivo de entrada "gigante.txt", pero antes de ello procesamos la línea del renglón para efectuar la tarea deseada de numeración. // // En este caso la variable "line" no debe modificarse porque su búfer interno de datos es utilizado por ensamblador. La variable "reco_reti" tiene un cero, pero es posible indicar reco_reti=1 si ocurrió un error (ejemplo: error de sintaxis en el renglón), lo cual hará que el ciclo de lectura de renglones se interrumpa y se muestre el mensaje "Error en línea " (contenido de renglón). _direct{ mov eax, [reco_reti+reg.vo] RET } ; //############################### continuacion_temisi: _direct{ mov [tmppos_esi], 0 ; Se realiza la carga del puntero en memoria y longitud de la cadena "file_content". mov eax, [file_content+reg.vo] NWPOS_eax mov ecx, [file_content+reg.nu] m2ma [et_tocall], (procesar_renglon) mov [reco_reti+reg.vo], 0 call RECORRER_TEXTO } if(reco_reti==1){ alert("Error en línea " +line) sys.quit() } binary_write(outputfile,strout) alert_ex("Se ha escrito en el archivo " + outputfile, "Información", _mb_iconinformation); return; _direct{ RECORRER_TEXTO: ; A continuación se ve el "ciclo" que pone en la variable "line" cada renglón del archivo de texto de entrada. mov eax, [file_content+reg.vo] ; Se determina el puntero en memoria al contenido del archivo. NWPOS_eax mov [tmppos_esi], esi mov ecx, [file_content+reg.nu] mov [ult_linea], 0 lea eax, [esi+ecx] mov [pos_final], eax task_c1: mov ecx, [pos_final] ; Un renglón termina con un carácter chr(10) o también con la cadena chr(13)+chr(10). sub ecx, esi mov edi, esi mov al, 10 or ebx, 1 repnz scasb jz @f mov [ult_linea], 1 ; Se activa indicador del último renglón si se llega al final del archivo. @@: jnz @f mov [num_b_nl], 1 dec edi cmp byte [edi-1], 13 jnz @f mov [num_b_nl], 2 dec edi @@: mov ecx, edi sub ecx, esi push esi ecx ebx cmp ecx, [maxsizeline+reg.vo] ; Para evitar problemas se limita el tamaño de cada renglón leído. jb @f mov ecx, [maxsizeline+reg.vo] @@: mov [line+reg.nu], ecx ; La longitud del renglón ya se tiene, falta copiarlo en la variable "line" y procesarlo. mov eax, [line+reg.vo] NWPOS_eaxedi mov eax, ecx and eax, 3 shr ecx, 2 rep movsd mov ecx, eax rep movsb call dword [et_tocall] mov ebx, [file_content+reg.vo] ; ahora se ajusta la variable [pos_final] en caso de que la posición en memoria del contenido del NWPOS_ebx ; archivo halla cambiado. mov edx, esi sub esi, [tmppos_esi] jz @f mov [tmppos_esi], edx add edx, [file_content+reg.nu] mov [pos_final], edx add [ss:esp+8], esi ; esi = (oldesi - oldloccad) + newloccad @@: pop ebx ecx esi mov byte [esi+ecx], bl cmp eax, 1 jz @f add esi, ecx add esi, [num_b_nl] cmp [ult_linea], 0 jz task_c1 @@: RET } } @eof_file ; //########################################################################################################
El siguiente ejemplo de Script es un programa que determina la memoria física y virtual disponible.
; //######################################################################################################## /* Este programa obtiene información sobre la memoria física y virtual utilizando la función "GlobalMemoryStatus" de la librería kernel32. Más información puede hallarse en la documentación de las API's de sistemas Window* en el archivo "win32.hlp" descargable desde Internet utilizando los enlaces a las herramientas disponibles del capítulo Enlaces. */ place_idata{ struct _MEMORYSTATUS dwLength dd ? dwMemoryLoad dd ? dwTotalPhys dd ? dwAvailPhys dd ? dwTotalPageFile dd ? dwAvailPageFile dd ? dwTotalVirtual dd ? dwAvailVirtual dd ? ends memory_info _MEMORYSTATUS MACRO copy_2tsi_dbl dest_tsi_dbl, mem_dword push dword 0 push dword mem_dword fild qword [ss:esp] fstp qword [dest_tsi_dbl+reg.vo] add esp, 8 ENDM } @import:GlobalMemoryStatus var d_dwLength=0.0, d_dwMemoryLoad=0.0, d_dwTotalPhys=0.0, d_dwAvailPhys=0.0, d_dwTotalPageFile=0.0, d_dwAvailPageFile=0.0, d_dwTotalVirtual=0.0, d_dwAvailVirtual=0.0 _direct{ mov dword [memory_info+_MEMORYSTATUS.dwLength], sizeof._MEMORYSTATUS invoke GlobalMemoryStatus, (memory_info) copy_2tsi_dbl d_dwLength, [memory_info.dwLength] copy_2tsi_dbl d_dwMemoryLoad, [memory_info.dwMemoryLoad] copy_2tsi_dbl d_dwTotalPhys, [memory_info.dwTotalPhys] copy_2tsi_dbl d_dwAvailPhys, [memory_info.dwAvailPhys] copy_2tsi_dbl d_dwTotalPageFile,[memory_info.dwTotalPageFile] copy_2tsi_dbl d_dwAvailPageFile,[memory_info.dwAvailPageFile] copy_2tsi_dbl d_dwTotalVirtual, [memory_info.dwTotalVirtual] copy_2tsi_dbl d_dwAvailVirtual, [memory_info.dwAvailVirtual] } var reporte = "Memoria RAM Total = " + d_dwTotalPhys + _nl + "Memoria RAM en Uso = " + (d_dwTotalPhys - d_dwAvailPhys) + _nl + "Memoria local virtual Total = " + d_dwTotalVirtual + _nl + "Memoria local virtual en Uso = " + (d_dwTotalVirtual-d_dwAvailVirtual) + _nl alert_ex(reporte, "Información sobre la Memoria del sistema:", _mb_iconinformation) @eof_file ; //########################################################################################################