Vistas de página en total

sábado, 7 de septiembre de 2013

WINDIR


   Hoy voy a colocar una función que la hice como parte de la librería window, para presentar, de forma emergente, una ventana para la búsqueda de un fichero.
    La función presenta en pantalla una ventana emergente con los ficheros a buscar, y permite mediante los cursores, desplazarse arriba y abajo por ellos para seleccionar el deseado.
   Esta función es un ejemplo más complejo del uso de todas las funciones que he ido implementando en el blog. Aquí incluyo ya funciones de acceso a fichero. Como se va viendo, el uso de las macros para nombrar de forma diferente las llamadas a las funciones resulta muy cómodo para luego leer el programa.
    Igualmente, en esta función aparece un bucle que he implementado con la macro for



   Con esta función se tiene una forma cómoda de abrir ficheros. Es la implementación de una función equivalente a  OpenFileDialog de windows actual, pero hecha en modo texto y en ensamblador en la época de windows 11.
    Se puede añadir las barras de scroll a la derecha y hacer las implementaciones del ratón, pero para lo que necesitaba me era funcional y rápido tal y como está.
     Devuelve el fichero seleccionado.
     Hice dos versiones, una con memoria dinámica y otra con memoria en disco. Debido a que ahora no funciona la reserva de memoria dinámica por culpa de windows, he colocado la versión de disco.
   Esta versión almacena los ficheros encontrados en un fichero temporal, para poder usarlos durante los scroll. Resultaba más lenta y la abandoné, pero ahora es la única manera de reservar memoria, usando swaping en disco



WINDIR.ASM
; Copyright (C) 2013  José Ángel Moneo Fernández

;    This program is free software: you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;   (at your option) any later version.

;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.

;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <http://www.gnu.org/licenses/>.


include main.mac
include dos.mac
include window.mac
include stdio.mac
include io.mac
include string.mac

.model compact,pascal

.data
buffer db 400 dup (0)
ffblk _dta ?
temporal db "temporal.tmp",0
handle dw 0
indice dw 0
seleccionado db 0
op db 0
nficheros dw 0
limpia db 14 dup (' '),0

.code
public _windir
_windir proc near uses bx cx dx si di,FsCiz,mascara,fichero,color
     mov bx,fichero
     mov [bx],byte ptr 0
    ;clacula las coordenadas de la ventana
    mov cx,FsCiz 
    mov dx,cx
    add dx,0A11h
    getwindow ch,cl,dh,dl,buffer ; salva el area de pantalla
    mov si,mascara
     ;   se da el dato de puntero a traves de si por usarse lea en la macro  
    draw_win ch,cl,dh,dl,[si]  
    setdta ffblk
    new_file temporal,_archivo,handle
    jnc seguir
    exit 1

seguir:
    mov nficheros,0
    findfirst [si],_TODOS
    jc find 
    mov cx,size ffblk
    otro: write handle,cx,ffblk
    inc nficheros
    findnext
    jnc otro
    find:
    close handle

     mov indice,0
    mov seleccionado,0
    open temporal,_R,handle

nuevalista:
     mov ax,FsCiz
     push ax
     call printlista
     opcion:
     getch op
     cmp op,27
     jne no_esc
     jmp escapar
no_esc:
    cmp op,0
    je opcion
    cmp op,13
    je fin
    cmp op,80
    jne sube
    call bajar
    jmp nuevalista
sube:
    cmp op,72
    jne pgup
    call subir
    jmp nuevalista
pgup:
    cmp op,81
    jne gdn
    call pagup
    jmp nuevalista
gdn:
    cmp op,73
    jne nada
    call pagdn
    jmp nuevalista
nada:
     jmp opcion

fin:
     mov al,seleccionado
     cbw
     add ax,indice
     mov dx,ax
     rseek handle,dx,ffblk
     mov cx,size ffblk
     read handle,cx,ffblk
     mov bx,fichero
     cmp nficheros,0
     jz escapar
     strcpy [bx],ffblk._nombre

escapar:
     close handle
     delete temporal
     mov cx,FsCiz
     mov dx,cx
     add dx,0A11h
     putwindow ch,cl,dh,dl,buffer ;repone el area de pantalla
     ret
_windir endp
pagup proc near
    mov ax,indice
    add ax,9
    cmp ax,nficheros
    jae n_pagup
    mov indice,ax
n_pagup:
    ret
pagup endp
pagdn proc near
     mov ax,indice
     sub ax,9
     cmp ax,0
     jg a_pagdn
     mov ax,0
a_pagdn:
     mov indice,ax
     ret
pagdn endp
subir proc near
     cmp seleccionado,0
     je su1
     dec seleccionado
      jmp su3
su1:
      cmp indice,0
      je su3
     dec indice
su3:
     ret
subir endp
bajar proc near
     xor ax,ax
     mov al,seleccionado
     add ax,indice
     inc ax
    cmp ax,nficheros
    jae b3
    cmp seleccionado,8
    jae b1
    inc seleccionado
    jmp b3
b1:
    inc indice
b3:
    ret
bajar endp
printlista proc near uses bx cx dx, FsCiz
      mov bx,FsCiz
     inc bl
     inc bl
     inc bh
     mov cx,9 
     cmp nficheros,cx
     ja toda
     mov cx,nficheros
toda:
     cmp cx,0
     je fin_lista
     mov dx,size ffblk
     rseek handle,indice,ffblk
lista:
     gotoxy bl,bh
     puts limpia
     read handle,dx,ffblk
     cmp ax,0
     je ot_n
     gotoxy bl,bh
     puts ffblk._nombre
ot_n:
     inc bh
     loop lista
fin_lista:
     mov bx,FsCiz
     inc bh
     inc bl
     mov dx,bx
     add dx,080fh
     wincolor bh,bl,dh,dl,normal
     add bh,seleccionado
     wincolor bh,bl,bh,dl,inverso
     ret
printlista endp

end

No hay comentarios:

Publicar un comentario

Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.