TEIMSI
Plataforma del desarrollador de textos programados
Inicio|Utilidades|Foro|Documentación

Indice de contenido -> Capítulo 17 - La Framework predeterminada y los ejemplos de proyectos


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 FrameworkEs fuente de un TCO.Sólo en Edición ProfesionalDescripción
 
tco_sources\bitmaps\bmpobject.thpSiNoPermite cargar y guardar desde un archivo .BMP, y también crear, una variable cadena con formato BMP_OBJ.
tco_sources\bitmaps\bmp_objcompress.thpSiNoTiene funciones que con un algoritmo sencillo, comprime y descomprime una cadena BMP_OBJ.
tco_sources\bitmaps\bmpdraw.thpSiNoPermite 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.thpSiNoPermite dibujar una letra o texto en una cadena BMP_OBJ.
tco_sources\bitmaps\extend_paintdump.thpSiSiTiene una función que permite el pintado por "vuelco de pintura de recipiente" en una cadena BMP_OBJ.
tco_sources\bitmaps\extract_hstrimage.thpSiNoTiene funciones que permiten "extraer" una copia de parte de una imagen BMP_OBJ hacia otra cadena BMP_OBJ.
tco_sources\bitmaps\img_adj_nitidez.thpSiSiPermite suavizar o anti-suavizar (dar cierta nitidez artificial) a una cadena BMP_OBJ.
tco_sources\bitmaps\img_escalar_br.thpSiNoPermite cambiar el tamaño de una imagen en una variable cadena BMP_OBJ. Escalado de calidad mínima.
tco_sources\bitmaps\img_hd_escalar.thpSiSiPermite cambiar el tamaño de una imagen en una variable cadena BMP_OBJ. Escalado de alta calidad.
tco_sources\bitmaps\ipr_filterblack_br.thpSiNoTiene algunas funciones para tareas específicas sobre cadenas BMP_OBJ (convertir a blanco y negro, .Etc)
tco_sources\bitmaps\ipr_rotate90.thpSiNoPermite rotar 90 grados una cadena BMP_OBJ.
tco_sources\bitmaps\jpg_to_bmpobj.thpSiSiPermite cargar desde un archivo JPG, una cadena BMP_OBJ (utilizando "tco_sources\jpg2bmp.thp", ver ejemplo dentro del archivo).
tco_sources\bitmaps\load_pscreen.thpSiNoPermite capturar parte de la pantalla en una cadena BMP_OBJ.
tco_sources\bitmaps\paint_hstrimage.thpSiNoTiene 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.thpSiSiPermite capturar parte de la pantalla y guardar la imagen en un archivo Jpg.
tco_sources\bitmaps\supercolorln.thpSiNo"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.tsiNoNoTransforma 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.thpSiNoPermite convertir los datos de una matriz en una cadena y viceversa.
tco_sources\click_move.thpSiSiTiene funciones para simular un "clic" o movimiento del ratón.
tco_sources\dir2string.thpSiSiPermite obtener el listado de un directorio y otras cosas más.
tco_sources\encrypt_v1.thpSiNoTiene funciones de encriptación y para obtener un "CRC" de un archivo.
tco_sources\extract_cab_file.thpSiSiPermite extraer un archivo comprimido en un .Cab
tco_sources\filesystem.thpSiNoTiene funciones para el sistema de archivos. (Elegir carpeta, mover archivo, .Etc)
tco_sources\http_post.thpSiNoTiene unas funciones básicas para hacer una visita a una página de Internet enviando una variable por método "POST".
tco_sources\jpg2bmp.thpSiSiPermite hacer uso de "jpgdll.dll" que puede convertir de un archivo ".bmp" a un ".jpg" y viceversa.
tco_sources\load_pcinfo.thpSiSiTiene funciones que brindan cierta información de la computadora actual y sesión actual.
tco_sources\odbc_teimsi.thpSiSiTiene funciones para el uso de OBDC (es un archivo Tco experimental).
tco_sources\report_timelong.thpSiSiPermite obtener una expresión de una fecha a partir de un entero devuelto por la función "timelong" (predeterminada de TEIMSI).
tco_sources\round2string.thpSiNoPermite redondear un número decimal.
tco_sources\sort_strarr.thpSiNoPermite ordenar una matriz con cadenas de texto.
tco_sources\sqr_matrix.thpSiNoTiene funciones para hallar el determinante de una matriz o bien resolver un sistema de ecuaciones N x N.
tco_sources\string_compresion_v1.thpSiNoTiene un algoritmo sencillo para comprimir y descomprimir cadenas.
tco_sources\text2clipboard.thpSiNoPermite leer el portapapeles y escribir en el mismo.
tco_sources\typek.thpSiSiPermite simular la escritura de texto mediante el teclado.
tco_sources\user_function.thpSiNoPermite 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.thpSiNoPermite leer y escribir un archivo .wav hacia/desde una variable cadena de formato "WAV_OBJ".
tco_sources\windowx_apps_info.thpSiSiTiene funciones para obtener información de ventanas de programas corriéndose en la sesión actual.
tco_sources\winkerinterface\winkerinterface.thpNoNoPermite 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.

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 carpetaDescripción
 
1- Simple_hexstruseConvierte pequeñas cadenas de texto en una notación cuyos códigos ASCII se expresan en notación hexadecimal y viceversa.
 
2- Mp3list_randomizerCarga 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_actividadPermite alertar actividades diarias en una hora fija del día.
 
4- Files_separatorPermite crear una copia de una carpeta separando de la carpeta original, archivos con cierta extensión.
 
5- IcomakerPermite crear un archivo .ICO desde un archivo .BMP, que tiene 32 x 32 píxeles de tamaño y debe editarse.
 
6- Priority_changerMuestra como trabajar con números ingresados por el usuario.
 
7- Mp3_finderPermite buscar archivos de música en una carpeta.
 
8- BmpbrujulaDibuja una imagen de fondo de una brújula y la muestra.
 
9- Prime_numberDetermina una lista con una cantidad arbitraria de números primos partiendo del número 2.
 
 
 
 
10- Wav440hzCrea un sonido con las frecuencias de una guitarra acústica.
 
11- FunctioncalculatorPermite 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- SimplewinxconPermite crear la ventana principal de la aplicación usando el archivo incluido "tco_sources\winkerinterface\winkerinterface.thp".
 
13- Usercol_in_winEs una aplicación con ventana creada con "tco_sources\winkerinterface\winkerinterface.thp" que convierte un número hexadecimal en un color.
 
 
 
 
14- Bintod_sampleConvierte un archivo cualquiera en una notación especial y viceversa.
 
15- IotestEjemplo de utilización de señales en el puerto paralelo.
 
16- Asteroid1Pequeñ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- Grafica3dGraficador 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.



Volver arriba


Algunos ejemplos de programación avanzada.

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

; //########################################################################################################


Volver arriba