5.2. Передача данных в Microsoft Word

В последних версиях 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

* Поля (1 см = 28 пунктов)

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 (он находится на компакт диске).