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.