Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VisualFoxPro.doc
Скачиваний:
10
Добавлен:
01.07.2025
Размер:
10.6 Mб
Скачать

2.5.12. Упаковка таблиц

Для упаковки, во время которой записи с пометкой удаления удаляются из файла, таблица должна быть открыта в монопольном режиме. Поскольку открытые таблицы, скорее всего, используются по назначению, то программа упаковки такие таблицы не трогает, а открывает монопольно и упаковывает лишь незадействованные таблицы базы данных, выводя затем отчет о проделанной работе.

Предполагается, что псевдонимы и имена таблиц совпадают. Принимается во внимание, что одновременно могут существовать несколько сессий данных.

&& Упаковка таблиц базы данных HomeLibrary

&&

#define NEXTLINE Chr(13) + Chr(10)

&&

nOfTbls = 5 && Число таблиц

declare aTbls(nOfTbls, 3) && Массив таблиц

aTbls(1, 1) = 'Authors'

aTbls(2, 1) = 'Books'

aTbls(3, 1) = 'BooksAuthors'

aTbls(4, 1) = 'BooksContent'

aTbls(5, 1) = 'WorkType'

for ind = 1 to nOfTbls

&& Элемент равен .T., если таблица будет упаковываться

aTbls(ind, 2) = .T.

next

&&

&& Определяем используемые таблицы, проставляя для них

&& в элемент aTbls(*, 2) значение .F.

&& Формируем для начала массив arrayOfSessions с номерами сессий данных

Asessions(aOfSessions)

for each nOfDs in aOfSessions

&& Формируем массив aUsedTbls с псевдонимами таблиц, открытых

&& в сессии данных с номером nOfDs

nOfOpTbls = Aused(aUsedTbls, nOfDs)

for k = 1 to nOfOpTbls

usedTbl = aUsedTbls(k, 1)

for ind = 1 to nOfTbls

if Upper(aTbls(ind, 1)) = usedTbl then

&& Таблица открыта, поэтому упаковываться не будет

aTbls(ind, 2) = .F.

aTbls(ind, 3) = nOfDs

endif

next

next

next

&&

&& Открываем таблицы, для которых aTbls(ind, 2) = .T.,

&& в режиме монопольного доступа

for ind = 1 to nOfTbls

if aTbls(ind, 2) then

tblPath = appPath + aTbls(ind, 1)

use (tblPath) in 0 exclusive && Употребляем выражение с именем

endif

next

&&

&& Упаковка таблиц

for ind = 1 to nOfTbls

if aTbls(ind, 2) then

select (aTbls(ind, 1))

pack

endif

next

&&

&& Закрываем упакованные, монопольно открытые таблицы

for ind = 1 to nOfTbls

if aTbls(ind, 2) then

select (aTbls(ind, 1))

use

endif

next

&&

&& Вывод отчета

sft = Set('SAFETY')

set safety off

set textmerge on

set textmerge to d:\a.txt noshow

\\Упакованы таблицы: <<NEXTLINE>>

set textmerge to d:\a.txt additive noshow

for ind = 1 to nOfTbls

if aTbls(ind, 2) then

\\<<aTbls(ind, 1) + NEXTLINE>>

endif

next

\\<<NEXTLINE>>Не упакованы таблицы:<<NEXTLINE>>

for ind = 1 to nOfTbls

if not aTbls(ind, 2) then

\\<<aTbls(ind, 1)>>; открыта в сессии данных №

\\ <<Transform(aTbls(ind, 3)) + NEXTLINE>>

endif

next

set safety &sft && Употребляем макроподстановку

set textmerge to

modify file d:\a.txt noedit

Возможный результат:

Упакованы таблицы:

Books

BooksAuthors

BooksContent

Не упакованы таблицы:

Authors; открыта в сессии данных № 1

WorkType; открыта в сессии данных № 4

2.5.13. Меню приложения

Приложение функционирует с одним меню (рис. 2.32), вызывающим формы, а также программу упаковки данных.

Рис. 2.32. Меню приложения в проектировщике меню

Меню запускается из главной программы проекта. Для открытия формы, например Authors, используется команда

do form (appPath + 'Forms\Authors')

Процедура пункта меню "Упаковка таблиц" содержит следующий код:

&& Процедура меню приложения, связанная с пунктом меню "Упаковка таблиц"

&&

flag = MessageBox("Упаковать таблицы?", 4 + 32 + 256)

if flag = 6 then

do (appPath + 'Prgs\TblsPacking')

endif

При выборе пункта меню "Закончить" выполняется следующая процедура:

&& Процедура меню приложения, связанная с пунктом меню "Закончить"

&&

flag = MessageBox("Завершить работу?", 4 + 32)

if flag = 6 then

clear events && Завершаем обработку событий

endif

Если приложение функционирует неавтономно, а в составе VFP, то вместо команды CLEAR EVENTS следует поместить команду

set sysmenu to default

восстанавливающую системное меню VFP, а из главного файла изъять команду READ EVENTS.

С каждым пунктом меню связан ускоритель – комбинация клавиш, после нажатия на которую выполняется ассоциированная с пунктом меню команда. Такой ускоритель должен содержать допустимую комбинацию клавиш (см. табл. 5.7).

В рассматриваемом меню употребляются следующие ускорители (перечислены в порядке следования пунктов меню): Alt+A, Alt+B, Alt+C, Alt+P, Alt+T и Alt+Q. Во всех случаях используются буквы английского алфавита.

Меню после его создания нужно сгенерировать, выполнив команду меню Menu – Generate.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]