Как сохранить определения индексов и фильтров для таблиц в текущем каталоге

Эли Линков

* INDEXSAV.PRG
* Эта программа может быть использована 
* для создания справочника 
* по всем индексам и фильтрам в каталоге 
* проекта. Таблица, куда записывается 
* информация, называется DBINFO.DBF.
*       Структура справочника
*       поле   dbfname    12 символов
*       поле   infomemo   memo
*
* В memo-поле помещается имя индекса, 
* выражение индексации и дополнительное 
* ограничение индексного выражения
* в виде <имя индекса>/<выражение>%<фильтр>,
* определение одного индекса занимает 
* строку в memo-поле
*
* Программу следует запускать 
* когда приложение готово к инсталляции,
* она создаст справочник и 
* соответствующий FPT-файл.
* Этот справочник нужно хранить 
* в "системном" каталоге приложения
* вместе с исполняемой версией 
* программы INDEXMAK.
* INDEXMAK.EXE должна быть доступна 
* только через меню администратора
* и не должна появляться как пиктограмма 
* в окне Program Manager.
* Для восстановления индексов 
* нужно запустить программу INDEXMAK.EXE


CLOSE DATABASES
* Следующие две строки указывают 
* на системные каталоги проекта
datapath =  ;
  GETDIR("",'Where the indexed tables') 
workpath =  ;
  GETDIR("",'Where the system EXE is')

IF NOT FILE(workpath + "dbfinfo.dbf")
   SET DEFAULT TO (workpath)
   * создаем таблицу-справочник 
   * (используется программой INDEXMAK.PRG)
   CREATE TABLE dbfinfo ;
    (dbfname C(12), infomemo m)
ENDIF

SET DEFAULT TO &datapath
DIMENSION filelist(1)
=ADIR(filelist,"*.dbf")
CLOSE data
set DEFAULT TO &workpath
SELECT 0
USE dbfinfo EXCLUSIVE
SET SAFETY OFF
ZAP
SET SAFETY ON
APPEND FROM ARRAY filelist
RELEASE filelist
GO TOP
SET DEFAULT TO &datapath

SCAN
   TEXT = ALLTRIM(dbfname)
   IF TEXT = "DBFINFO.DBF"
   ELSE
      REPLACE dbfname ;
        WITH LEFT(TEXT,LEN(TEXT) - 4)
      SELECT 0
      USE  ALLT((dbfinfo.dbfname)) EXCLUSIVE
      DIMENSION taglist(1,3)
      indexstr = ""
      arrct = 1
      DO WHILE NOT EMPTY(TAG(arrct))
         taglist(arrct,1) = TAG(arrct)
         * имя индекса
         taglist(arrct,2) = SYS(14,arrct)
         * выражение индексации
         taglist(arrct,3) = SYS(2021,arrct)
         * фильтр индексации (если есть)
         arrct = arrct + 1
         DIMENSION taglist(arrct,3)
      ENDDO
      SELECT dbfinfo
      FOR x = 1 TO arrct - 1
         indexstr=indexstr+taglist(x,1) ;
            +"/"+taglist(x,2);
            +"%"+taglist(x,3)+CHR(13)
      ENDFOR
      REPLACE infomemo WITH indexstr
   ENDIF
ENDSCAN

SET DEFAULT TO &workpath
CLOSE DATA



PROCEDURE INDEXMAK
* indexmak.prg
* Эта программа используется 
* для восстановления индексов
* в том случае, если таблицы проекта 
* оказались повреждены.

* Программа использует справочник DBFINFO.DBF,
* созданный программой INDEXSAV.PRG, 
* для восстановления имен индексов,
* выражений индексации и фильтров индексов.
*
* Программу нужно поместить в виде 
* исполняемого файла и дать доступ к ней 
* только администратору системы.
*
CLOSE DATABASES
* путь к "системному" каталогу проекта 
* (укажите свой путь)
datapath =  "C:\sxc\sxcbuild\"
workpath = "c:\sxc\sxcmaint\"
SET DEFAULT TO &workpath
SELECT 0
USE dbfinfo EXCLUSIVE
SET SAFETY OFF
GO TOP
SET DEFAULT TO &datapath

SCAN
   TEXT = ALLTRIM(dbfname)
   IF TEXT = "DBFINFO.DBF"
   ELSE
      SELECT 0
      USE (dbfinfo.dbfname) EXCLUSIVE
      DELETE TAG ALL
      memct = 1
      fred = dbfinfo.infomemo
      IF NOT EMPTY(fred)
         DO WHILE NOT EMPTY ;
          (MLINE(dbfinfo.infomemo,memct))
            fred = ALLTRIM ;
              (MLINE(dbfinfo.infomemo,memct))
            colno1 = AT("/",fred)
            colno2 = AT("%",fred)
            tagfield = LEFT(fred,colno1 - 1)
            * имя индекса
            tagname = SUBSTR(fred,colno1 + 1,;
               (colno2 - colno1 - 1)) 
            * выражение индексации
            tagfilt = ALLTRIM ;
              (RIGHT(fred,LEN(fred) - colno2))
            * фильтр индексации
            IF tagfilt <> ""
               INDEX ON &tagfield ;
                 FOR &tagfilt TAG &tagname
            ELSE
               INDEX ON &tagfield TAG &tagname
            ENDIF
            memct = memct + 1
         ENDDO
      ENDIF
   ENDIF
ENDSCAN

SET DEFAULT TO &workpath
SET SAFETY ON
CLOSE DATA

Пароли

* Пример 1
* (Брайан Копеланд /Brian Copeland/) 

* Это пример использования INKEY() 
* для ввода пароля и вывода '*' в поле.

CLEAR
mpassword=''mshowpass=''

@ 10,10 GET mshowpass DEFAULT '' ;
  SIZE 1,10 WHEN checkpass()
READ

PROCEDURE checkpass
DO WHILE .T.
   mkey=INKEY(0)
   DO CASE
      CASE mkey=13         
* нажата ENTER
         EXIT
      CASE BETWEEN(mkey,48,57)         
* это число
         mpassword=mpassword+CHR(mkey)
         mshowpass = mshowpass+'*'
      CASE BETWEEN(mkey,97,122)         
* это буква в нижнем регистре
         mpassword=mpassword+CHR(mkey)
         mshowpass = mshowpass+'*'
      CASE BETWEEN(mkey,65,90)         
* это буква в верхнем регистре
         mpassword=mpassword+CHR(mkey)
         mshowpass = mshowpass+'*'
      CASE mkey=127         
* нажата backspace
         mpassword=;
           LEFT(mpassword,LEN(mpassword)-1)
         mshowpass=;
           LEFT(mshowpass,LEN(mshowpass)-1)
   ENDCASE
   SHOW GETS
ENDDO
CLEAR READ


* Пример 2  (Р. Премкумар /R. Premkumar/)
* 
* Процедура проверки ввода пароля:
* если пароль верен, возвращает .t.,
* иначе возвращает .f. 
* или включает системы защиты (сирену)

* n = максимальная длина пароля, 
*   по вашему усмотрению
* c = строка, которая появляется 
*   по мере ввода пароля
*   (вместо звездочек вы можете увидеть текст 
*   "С добрым утром", который появляется 
*   по мере ввода пароля
* t = заголовок окна 

PROCEDURE password
PARAMETERS N,C,t
PRIVATE ALL

IF (PARA()>0 AND TYPE('n') #'N') OR (PARA()>1 ;
  AND TYPE('c') #'C') OR ;
  (PARA()>2 AND TYPE('t') #'C')
    WAIT WINDOW NOWAIT ;
    'Usage : ? PASSWORD( [ <length> ' +;
    '[, <display string> [, <title> ]]] )'
   * в программе вы можете вызвать 
   * эту функцию как: a=password()
   RETURN
ENDIF

IF PARA()=0
   N=7   
* длина пароля по умолчанию. 
* Используется при вызове функции 
* без параметров
ENDIF


IF PARA()<3
   t='ENTER PASSWORD' && Заголовок по умолчанию
ENDIF

DEFINE WINDOW paswrd  DOUBLE TITLE t ;
   FROM 11,IIF(MAX(N,LEN(t))<10,30,CEIL ;
    (35-MAX(N,LEN(t))/2)) ;
   TO 13,IIF(MAX(N,LEN(t))<10,50,;
    CEIL(45+MAX(N,LEN(t))/2))

ACTIVATE WINDOW paswrd
SET COLOR TO x/N
cd=IIF(PARA()<2,REPL('*',N),PADR(C,N,'.'))  
* по умолчанию выводим звездочки
ps=""

FOR i=1 TO N
   @0,5+I
   p=INKEY(0)
   DO CASE
      CASE LAST()=127 && backspace
         IF i>1
            @0,5+i-1 SAY " "
            ps=LEFT(ps,LEN(ps)-1)
         ENDIF
         i=i-2
         i=IIF(i<0,0,i)
      CASE LAST()=13  && Return
         EXIT
      OTHERWISE
         @0,5+i SAY SUBSTR(cd,i,1) COLOR W/N
         ps=ps+CHR(p)
   ENDCASE
ENDFOR

SET COLOR TO
RELEASE WINDOW paswrd
RETURN ps
Hosted by uCoz