Revistas en papel
 Amiga World Nº22 - Junio 1991
Anterior
MenĂº
Logotipo
Sí puedes leer esta frase, la página ha sido actualizada.

El Amiga Me Encanta ha conseguido el permiso por escrito de IDG Comunications España
para ofrecer los artículos de la revista Amiga World España.

INFORMACIÓN de ICONOS

Por David T. McClellan

Estamos
acostumbrados
a pulsar una
y otra vez sobre
esos pequeños
gráficos
que nos abren
las puertas
a programas,
proyectos, etc.
Pero ...¿Qué
se esconde
realmente
detrás de estos
gráficos?

Los programas que se ejecutan desde el CLI (Command Line Interface) son sencillos. Sin embargo, los escritos en Modula-2, C o ensamblador, cogen todos sus argumentos desde una simple línea de comandos. Los usuarios no están acostumbrados a estos métodos, no obstante, deben de utilizar cualquiera de estos lenguajes o scripts CLI para ejecutar los programas.

Generalmente, los usuarios prefieren programas que puedan ejecutarse desde el Workbench simplemente haciendo un doble click sobre la aplicación. ¿Cómo conseguir que un programa haga feliz al usuario y a la vez obtener una buena recepción de los argumentos y otras definiciones del usuario?. Esto requiere información en el programa y unos iconos para archivar los datos.

Usted deberá saber como se encuentra almacenada la información de los iconos. Como primer paso, deberá de crear y salvar un pequeño archivo de documento con Notepad o cualquier otro editor de textos, seleccionar el archivo del icono, y cambiar la información desde la opción Info en el menú del Workbench. Esta opción abre una opción, listando el tipo de archivo (proyecto), la herramienta por defecto (el path hacia Notepad), y un listado ampliable de Tipos de Herramientas. Los Tipos de Herramientas se encuentran donde sus programas se almacenan y buscan una información adicional. Cada Tipo de Herramienta esta en el formato:

   NAME: cadena de parámetros Como en:
WINDOW= 100, 10, 400, 1000
FILETYPE= notepad/text

NAME es el nombre de las opciones de Tipo de Herramienta, y la cadena igualada representa los parámetros al usar Notepad. En el segundo ejemplo, la barra (/) separa dos subopciones del Tipo de Herramienta FILETYPE. Ahora, al seleccionar el icono de Notepad, podrá ver la información -el tipo de archivo es herramienta, no es una herramienta por defecto, y es una lista de Tipos de Herramientas.


MODULA-2 Y TIPOS DE HERRAMIENTA

El Workbench pasa muchas clases de información hacia el programa. En C, el segundo (argv) argumento es actualmente una estructura llena de información. En Benchmark Modula-2, recibe un paquete similar en forma de una estructura de datos WBStartup. Esta estructura llama al programa en su propia dirección de disco, el cual recibe los iconos del programa desde la información de este.

La estructura de datos WBStartup consta de distintos y ventajosos punteros y campos: el número de argumentos pasados, un direccionamiento de punteros hacia descriptores WBArg para estos selectores de ratón (iconos), un puerto de mensajes para comunicación con el Workbench, y unos pocos más punteros esotéricos. Ejemplo:

   (* Del Benchmark Modula-2 Manual, Modulo Workbench *)
WBarg=RECORD
waLock : ADDRESS; (* cerrar descriptor si arg es archivo *)
(* no es directorio corriente *)
waName : ADDRESS; (* prt hacia nombre de tool/file/etc *)
END;
WBStartup=RECORD
smMessage: Message;
smProcess: MsgPortPrt;
smSegment: ADDRESS;
smNumArgs: LONGINT; (* El contenido del argumento *)
smToolWindow : ADRESS;
smArgList: WBAregPtr; (* Ptr hacia listado de WBArg's *)
END;

Cada estructura WBArg a la cual el puntero en WBStartup.smArgList da el nombre, y posibilita un directorio cerrado, va hacia archivo. El primer argumento es siempre el nombre de la herramienta (programa), asimismo, también smNumArgs siempre equivale a menos de 1. Usando el propio nombre de la Herramienta desde el primer WBArg, y una pareja de rutinas desde las librerías de iconos del Workbench (icon.library). Su programa puede sacar opciones y almacenarlas en sus iconos con el comando del menú de info Workbench.

Para establecer tu propio
valor, puede modificar
(cuidadosamente)
el listado Tool-Types
(Tipo de Herramientas),
situando memoria extra
sobre el FreeList
de DiskObject
y copiar valores
dentro de él.

El programa puede extraer similar información de los iconos de archivos transferidos a otro WBArgs. Por ejemplo, Notepad contiene un tamaño de ventana, una fuente de letra base, y archivos de tipos de información en el icono de cada documento salvado, y usa estos cuando usted inicia la vía de un icono de cualquier documento.

Cada icono es una estructura DickObject que puede obtener utilizando el nombre del icono. La parte de este DiskObject es una lista de Tipos de Herramientas del programa a los cambios del comando Info del Workbench. Para cargar el DiskObject, su programa deberá llamar al GetDiskObject() con el campo waName de una estructura WBarg. Luego puede analizar las opciones con otros dos métodos desde MODULE Workbench FindToolType() y MatchToolValue(). FindToolType saca la cadena NAME= Tipo de Herramienta, mientras MatchToolValue() escanea estas cadenas para /-separar subopciones y llamar a su programa.

Por ejemplo, usted tiene un pequeño programa en Modula-2 llamado Fred, con un icono llamado fred.info. Usando Info, usted almacena el siguiente Tipo de Herramientas en Fred.info:

   SCREEN=320*200
Prince=title/red/corvette

El veloz juego de los fragmentos de código se muestra a continuación:

   MODULE Fred:
(* lo que necesita para importar desde icono *)
FROM SYSTEM IMPORT ADDRESS, ADR;
FROM AmigaDos IMPORT FileLock, CurrentDir;
FROM System IMPORT argc, argv, WBenchMsg;
FROM Libraries IMPORT OpenLibrary, CloseLibrary;
FROM Workbench IMPORT IconName, IconBase;
DIskObject, DiskObjectPtr, DiskObjectType, WBArg, WBArgPtr, WBStartupPtr, GetDiskObject, FreeDiskObject, FindToolType, MatchToolValue;
(* comenzando el módulo principal *)
1 CONST
ScreenOpt="SCREEN";
PrinceOpt="Prince";
rdOpt="red";
2 VAR
wbArg : WBArgPtr
wbStartup : WBSTartupPtr;
dObj : DiskObjectPtr;
toolType : ADDRESS;
isRed : CARDINAL;
nArgs : INTEGER;
formerDir : FileLock;
BEGIN
3 IF argc=0 THEN
(* llamada desde el Workbench. Abre librería de iconos *)
4 IconBase :=OpenLibrary(ADR(IconName),0D);
IF IconBase=NIL THEN
CleanQuit("No icon.library");
END
wbStartup :=WBenchMsg;
wbArg :=ADDRESS(wbStartup^.smArgList);
nArgs :=wbStartup^.smNumArgs;
(* ahora chequea los iconos del programa *)
5 IF wbArg^.waLock # NIL THEN
formerDir
:=CurrentDir(wbArg^.waLock);END;
dObj :=GetDiskObject (wbArg^.waName);
IF wbArg^.waLock # NIL THEN
formerDir :=CurrentDir(formerDir):END;
IF dObj=NUL THEN
CleanQuit
END;
6 toolType
:=FindToolType(dObj^.doToolTypes, aDR (Screen));
IF toolType # NIL THEN
ELSE
END;
toolType
:=FindToolType(dObj^.doToolTypes,ADR(PrinceOpt));
IF toolType # NIL YHEN
7 isRed := MatchToolValue(toolType,ADR(redOpt));
ELSE
isRed :=0,END;
IF isRed=1 THEN
END;
8 FreeDiskObject (dObj^);
CloseLibrary (IconBase^);

Primero configure las constantes y variables. El paso 1 contiene las constantes de cadenas necesarias para FindToolType() y MatchToolValue(). El paso 2 saca las variables del WBStartup. WBArg y la estructura de datos del archivo, en la misma medida que un puntero regresa hacia la cadena del byte por FindToolType(), se saca un CARDINAL al 1 ó 0 regresando hasta MatchToolValue(), y un FileLock si el programa ha cambiado los directorios al cargar un icono.

En el paso 3, si un programa es llamado desde el Workbench, su valor argc es 0. Si argc es distinto de 0, Fred sería llamado desde el CLI y en denominado de complemento.

Una vez Fred conozca estos datos, comenzará desde el Workbench, cargará la icon.library para usar las funciones de los iconos.

Para hacerlo, se llama al OpenLibrary() para el IconBase. Paso 4 debería comprobar el fallo, Fred llamada CleanQuit(), una rutina lo comprueba y si falla lo anuncia en pantalla. Una vez se ha mostrado el icono, la librería se carga. Fred inicializa la variable WBArg para ser listada en wbStartup y cargada como su propio icono.

Paso 5, el programa chequea para ver si necesita cambiar el directorio en uso para cargar el archivo de icono. Se wbArgwaLock no es NIL, Fred usa CurrentDir (una función del AmigaDOS) con wbArg.waLock para cambiar los directorios hacia el lugar del icono. Después se carga el DiskObject del icono en el interior de dObj y, si es necesario, de nuevo recurre a CurrentDir para regresar al directorio previo.

Paso 6, Fred esta finalmente preparado para chequear los cambios del Tipo de Herramienta SCREEN. Llama a FindToolType() con un puntero hacia la cadena SCREEN y el listado del Tipo de Herramienta DiskObject, en dObj^.doToolTypes. Si FindToolTypes() encuentra SCREEN, regresa el puntero hacia Fred dependiendo del tamaño de la cadena. Si es imposible que esto suceda, FindToolType() regresa a NIL, dejando a Fred libre para elegir por defecto.

A continuación en el paso 7, Fred chequeará para ver si existe Prince y contiene "red" como una subopción. Fred coge primero la cadena para Prince con FindToolType() y rojo. Si MatchToolValue() localiza la subopción "red", regresa a 1, si no regresa a 0. Paso 8, esto es todo amigos.

Para establecer tu propio valor, puede modificar (cuidadosamente) el listado Tool-Types (Tipo de Herramientas), situando memoria extra sobre el FreeList de DiskObject y copiar valores dentro de él. Seguidamente use el procedimiento PutDiskObject() con waName. Intente todo esto fuera, para realizar sus propios programas.


Envía esta página web a un amigo:
Esta opción está desactivada temporalmente, rogamos disculpen las molestias

Volver a la página anterior

Al menú principal