В последних версиях Visual FoxPro компания Microsoft значительно усовершенствовала поддержку модели COM (Component Objects Model) – модели объектных компонентов. Это стандарт,
регламентирующий обмен информацией между приложениями. Основная идея этого
стандарта Microsoft заключается в том, что любой COM-объект может взаимодействовать с другим COM-объектом независимо от того, в какой
среде он разработан. Мы теперь можем напрямую обращаться к объектам Microsoft Word из Microsoft Visual FoxPro.
Воспользуемся этой
возможностью для генерации договора приватизации квартиры. Вернемся к рис.
4.26. На второй странице формы Flat расположена кнопка Договор. Код события Click этой кнопки имеет вид:
*- Кнопка Договор
* Номер выбранной квартиры
SelectFlat=cFlat.Flat
* Остальные
параметры адреса смотри:
* событие Activate второй страницы формы Building
* SelectStreetAddress - номер улицы
* SelectHouseAddress - номер дома
* Список жильцов
для приватизации
SELECT * FROM Owners;
WHERE Street=SelectStreetAddress;
AND House=SelectHouseAddress;
AND Flat=SelectFlat;
INTO
TABLE 'C:\WINNT\TEMP\cOwners.dbf';
ORDER BY
Number
IF RECCOUNT()=0
=MESSAGEBOX('В
квартире нет проживающих!',48,'Ошибка!')
RETURN
ENDIF
DO FORM Treaty && Генерация договора
Если в квартире есть проживающие, то на выполнение будет
запущена форма Treaty (рис. 5.3). Эта форма предназначена для
сбора дополнительных данных, которые наряду с имеющимися в базе данных Visual FoxPro будет переданы в Microsoft Word. На рис. 5.4 показан окончательный вид договора
приватизации.
Рис. 5.3. Сбор дополнительных данных для генерации договора
Код события Init формы Treaty имеет вид:
PUBLIC SelectDateTreaty,SelectChief,SelectText,;
SelectMemorial,SelectTypeFlat,SelectTypeKind,;
FirstStringSource
* Дата заключения договора
SelectDateTreaty=DATE()
* Фамилия
подписавшего договор
SelectChief=1 && Начальник группы
* Первая строчка
договора
SelectText=[]
FirstStringSource=4 && Первой строчки нет
* Здание -
памятник архитектуры
SelectMemorial=.F.
&& Нет
* Тип квартиры
SelectTypeFlat=1 && Отдельная
* Вид
собственности
SelectTypeKind=2 && В равных долях
Код события Click кнопки Генерация договора формы Treaty:
WAIT 'Ждите! Идет
передача данных в Microsoft Word'
WINDOW
NOWAIT
* Решение
"проблемы" русского языка
DO CASE
CASE cFlat.Rooms=1
SelectRoom =[одной комнаты]
SelectRoom1=[однокомнатной]
SelectRoom2=[одну комнату]
CASE cFlat.Rooms=2
SelectRoom =[двух комнат]
SelectRoom1=[двухкомнатной]
SelectRoom2=[две комнаты]
CASE cFlat.Rooms=3
SelectRoom =[трех комнат]
SelectRoom1=[трехкомнатной]
SelectRoom2=[три комнаты]
OTHERWISE
SelectRoom =STR(cFlat.Rooms,2)+[ комнат]
SelectRoom1=STR(cFlat.Rooms,2)+[ комнатной]
SelectRoom2=STR(cFlat.Rooms,2)+[ комнат]
ENDCASE
DO CASE
CASE SelectChief=1
ChiefShot=[Рощин В.Н.]
ChiefLong=[Рощина
Владимира Николаевича]
CASE SelectChief=2
ChiefShot=[Симонова Л.И.]
ChiefLong=[Симоновой Людмилы Ивановны]
ENDCASE
* Дата прописью
STORE [ ] TO DayText,MonthText,YearText
* Процедура
находится в процедурном файле FileProc
DO Detail WITH SelectDateTreaty,DayText,MonthText,YearText
* Запущен ли Word?
ON ERROR oWord=.NULL.
* В случае
возникновения ошибки в следующей строке считаем,
* что объекта oWord нет
oWord=GetObject(, "WORD.Application")
IF ISNULL(oWord)
* Word не запущен
ErrorWord=.T. && Word
на компьютере есть
ON ERROR ErrorWord=.F. && Word
на компьютере нет
* ErrorWord=.F. в
случае возникновения ошибки
* в следующей строке при запуске Word
oWord=CREATEOBJECT("WORD.Application") &&
Запускаем Word
* Вернуть назад
стандартную процедуру обработки ошибок
ON ERROR DO ERRORHND
IF ErrorWord=.F.
=MESSAGEBOX('На Вашем
компьютере отсутствует '+;
'Microsoft Word',48,'Ошибка!')
RETURN
ENDIF
ELSE
=MESSAGEBOX('Microsoft Word уже запущен! Найдите его '+;
' на Панели задач внизу
экрана',48,'Ошибка!')
RETURN
ENDIF
* Константы
Microsoft Word
#DEFINE True .T.
#DEFINE False .F.
#define wdOrientPortrait 0
#define wdToggle 9999998
#DEFINE wdUnderlineNone 0
#DEFINE wdUnderlineSingle 1
#DEFINE wdAlignParagraphLeft 0
#DEFINE wdAlignParagraphCenter 1
#DEFINE wdAlignParagraphRight 2
#DEFINE wdAlignParagraphJustify 3
#DEFINE wdAlignParagraphDistribute 4
#DEFINE wdAlignParagraphJustifyMed 5
#DEFINE wdAlignParagraphJustifyHi 7
#DEFINE wdAlignParagraphJustifyLow 8
#DEFINE wdAllowOnlyRevisions 0
oWord.Visible=.T.
* Заголовок окна Word
oWord.Caption=[Договор на передачу квартиры в собственность ]
oWord.Documents.Add
* Ориентация
книжная бумага А4
* Поля (
WITH oWord.ActiveDocument.PageSetup
.LineNumbering.Active = False
.Orientation = wdOrientPortrait
.LeftMargin = 48
.RightMargin = 40
.TopMargin =56
.BottomMargin=56
ENDWITH
* Включить расстановку переносов
WITH oWord.ActiveDocument
.AutoHyphenation = True
.HyphenateCaps = True
.ConsecutiveHyphensLimit = 0
ENDWITH
WITH oWord.Selection
.Font.Name = "Times
New Roman"
.Font.Size = 14
.Font.Bold = wdToggle
.ParagraphFormat.Alignment = wdAlignParagraphCenter
.TypeText ("Договор")
.TypeParagraph
.Font.Size = 12
lcText=[на передачу квартиры в собственность]
.TypeText (lcText)
IF SelectMemorial=.T.
* Если здание -
памятник
.TypeParagraph
lcText=[в
жилом доме-памятнике истории и культуры]
.TypeText (lcText)
ENDIF
.TypeParagraph
.TypeParagraph
.Font.Size = 12
.Font.Bold = wdToggle
.ParagraphFormat.Alignment = wdAlignParagraphJustify
.TypeText ("г. Хабаровск")
.TypeParagraph
.ParagraphFormat.Alignment = wdAlignParagraphCenter
lcText=ALLTRIM(DayText+MonthText+YearText) &&
Дата прописью
.TypeText (lcText)
.TypeParagraph
* Первая черта
lcText=REPLICATE([_],70)
.TypeText (lcText)
.TypeParagraph
* Первая строчка
IF LEN(ALLTRIM(SelectText))#0
.TypeParagraph
.ParagraphFormat.Alignment = wdAlignParagraphJustifyMed
lcText=[ ]+ALLTRIM(SelectText)
.TypeText (lcText)
ENDIF
.TypeParagraph
.ParagraphFormat.Alignment = wdAlignParagraphJustifyMed
lcText=[
Администрация города Хабаровска в лице]+;
[ начальника Управления жилищного
фонда ]+ChiefLong+;
[ в соответствии с Положением об
Управлении фонда ]+;
[города, утвержденным постановлением
Мэра города от ]+;
[20.12.2001 № 1417, именуемая в
дальнейшем ]+;
["Продавец", c одной стороны и гр.]
.TypeText(lcText)
SELECT cOwners
.TypeParagraph
.Font.Bold = wdToggle
.Font.Underline = wdUnderlineSingle
.ParagraphFormat.Alignment = wdAlignParagraphCenter
SCAN
lcText=ALLTRIM(cOwners.Family)+[ ]+;
ALLTRIM(cOwners.Name)+[ ]+;
ALLTRIM(cOwners.Second)+[ - ]+STR(cOwners.Born)+[ г.р.]
.TypeText (lcText)
.TypeParagraph
ENDSCAN
IF RECCOUNT()>1
* Печатать, если
собственников более одного
DO CASE
CASE SelectTypeKind=1
lcText=[(совместная
собственность)]
CASE SelectTypeKind=2
lcText=[(в равных долях)]
CASE SelectTypeKind=3
lcText=[(долевая собственность)]
ENDCASE
.TypeText (lcText)
ENDIF
.TypeParagraph
.TypeParagraph
.Font.Bold = wdToggle
.Font.Underline = wdUnderlineNone
.ParagraphFormat.Alignment = wdAlignParagraphJustify
lcText=[именуемый в дальнейшем "Покупатель",
заключили ]+;
[настоящий договор о
нижеследующем:]
.TypeText (lcText)
.TypeParagraph
IF SelectTypeFlat=1
* Квартира отдельная
lcText=[
1. "Продавец" передал
в собственность, ]+;
[а "Покупатель" приобрел
квартиру, ]+;
[состоящую из ]+ALLTRIM(SelectRoom)+[ общей площадью ]+;
ALLTRIM(STR(cFlat.SquareFlat,5,1))+;
[ кв. м., в том числе жилой ]+;
ALLTRIM(STR(FLAT.Dwell,5,1))+[ кв. м., по
адресу: ]
ELSE
* Квартира коммунальная
lcText=[ 1. "Продавец" передал в
собственность, ]+;
[а "Покупатель" приобрел
часть коммунальной квартиры ]+;
[общей площадью ]+ALLTRIM(STR(cFlat.SquareFlat,5,1))+;
[ кв. м., в том числе жилой ]+;
ALLTRIM(STR(cFlat.Dwell,5,1))+[ кв. м. ]+;
[Данная доля
включает ]+ALLTRIM(SelectRoom2)+;
[ площадью ]+ALLTRIM(STR(cFlat.SquareFlat,5,1))+;
[ кв. м., в том
числе жилой ]+;
ALLTRIM(STR(cFlat.Dwell,5,1))+[ кв.м. и
часть помещений]+;
[ общего пользования квартиры, ]+;
[пропорционально занимаемой жилой
площади, по адресу: ]
ENDIF
.TypeText (lcText)
lcText=[г. Хабаровск, ]
SELECT cBuilding
* Порядок следования в адресе
IF cBuilding.First=.F.
* Признак адреса стоит первым
RightAddress=ALLTRIM(cBuilding.Sign)+[
]+;
ALLTRIM(cBuilding.Name)
ELSE
* Признак адреса стоит вторым
RightAddress=ALLTRIM(cBuilding.Name)+[
]+;
ALLTRIM(cBuilding.Sign)
ENDIF
lcText=lcText+RightAddress+;
[, дом ]+ALLTRIM(SelectHouse)+[, кв. ]+;
ALLTRIM(STR(SelectFlat))+[.]
.Font.Underline = wdUnderlineSingle
.Font.Bold = wdToggle
.TypeText (lcText)
.TypeParagraph
.Font.Bold = wdToggle
.Font.Underline = wdUnderlineNone
.ParagraphFormat.Alignment = wdAlignParagraphJustifyMed
lcText=[ 2.
"Покупатель" приобрел право ]+;
[собственности с момента государственной
регистрации ]+;
[права в едином государственном реестре
Хабаровским ]+;
[краевым учреждением юстиции.]
.TypeText (lcText)
.TypeParagraph
lcText=[ 3. Права и обязанности, возникающие ]+;
[из настоящего договора,
"Покупателю" разъяснены.]
.TypeText (lcText)
.TypeParagraph
lcText=[ 4. В случае смерти
"Покупателя" все права ]+;
[и обязанности по настоящему договору ]+;
[переходят к его наследникам на общих
основаниях.]
.TypeText (lcText)
.TypeParagraph
lcText=[ 5. Пользование квартирой производится
]+;
["Покупателем" применительно к
Правилам ]+;
[пользования жилыми помещениями,
содержания жилого дома ]+;
[и придомовой территории в РСФСР.]
IF SelectMemorial=.T.
lcText=lcText+[ и Положению ]+;
[об охране и
использовании памятников истории и ]+;
[культуры от 16.09.1982 № 865.]
ENDIF
.TypeText (lcText)
.TypeParagraph
.ParagraphFormat.Alignment = wdAlignParagraphJustifyMed
lcText=[ 6. Настоящий договор составлен в трех ]+;
[экземплярах, из
которых один выдается ]+;
["Покупателю", один -
"Продавцу", один остается в ]+;
[Хабаровском краевом учреждении юстиции
]+;
[по государственной регистрации прав на
недвижимое ]+;
[имущество и сделок с ним.]
.TypeText (lcText)
IF SelectMemorial=.T.
.TypeParagraph
lcText=[ 7. "Покупатель" обязан заключить
Охранное ]+;
[свидетельство по использованию квартиры
]+;
[в доме-памятнике со специально
уполномоченным ]+;
[государственным органом охраны памятников
по ]+;
[установленной форме.]
.TypeText (lcText)
ENDIF
.TypeParagraph
.TypeParagraph
.ParagraphFormat.Alignment = wdAlignParagraphCenter
.Font.Bold = wdToggle
lcText=[Адреса сторон:]
.TypeText (lcText)
.TypeParagraph
.TypeParagraph
lcText=[Подпись "Продавца"]
.ParagraphFormat.Alignment = wdAlignParagraphJustify
.Font.Bold = wdToggle
.TypeText (lcText)
.TypeParagraph
IF RECCOUNT()>1
lcText=[Подписи "Покупателя"]
ELSE
lcText=[Подпись
"Покупателя"]
ENDIF
lcText=REPLICATE([ ],95)+lcText
.TypeText (lcText)
.TypeParagraph
.TypeParagraph
.Font.Name = "Courier new"
.Font.Size = 12
.ParagraphFormat.Alignment = wdAlignParagraphJustify
lcText=[________________ ]
.TypeText (lcText)
.Font.Bold = wdToggle
lcText=ALLTRIM(ChiefShot)
.TypeText (lcText)
.TypeParagraph
.ParagraphFormat.Alignment = wdAlignParagraphRight
SELECT cOwners
SCAN
lcText=LEFT(ALLTRIM(cOwners.Name),1)+[.]+;
LEFT(ALLTRIM(cOwners.Second),1)+[.]+;
ALLTRIM(cOwners.Family)
LenText=LEN(ALLTRIM(lcText))
LineText=Replicate('_',30-LenText)+[ ]
.Font.Bold = wdToggle
.TypeText (lineText)
.Font.Bold = wdToggle
.TypeText (lcText)
.TypeParagraph
.TypeParagraph
ENDSCAN
ENDWITH
* Переход в начало документа
oWord.ActiveWindow.ActivePane.VerticalPercentScrolled = 0
WAIT 'Договор готов!' WINDOW NOWAIT
Рис. 5.4. Окончательный вид сгенерированного договора
приватизации
При написании текста для Microsoft Word на VBA (Visual Basic for
Application) используется
значительное количество системных констант. Visual Basic их «знает», а Visual FoxPro 9.0 – нет. К счастью все они собраны пользователями Visual
FoxPro в отдельный файл Word.h (он находится на компакт диске).