Виста, Excel2007 и DDE

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Виста, Excel2007 и DDE

Сообщение ru_alex »

Всем привет!

При попытке работы с Excel таблицей через DDE, получаем вылет программы на отрытие DDEClient, если предварительно вызвать filedialog.
Вылетает даже если filedialog не имеет отношения к работе с Excel через DDE. В приведенном примере работаем с файлом Книга1.xslx. Если убрать строчку с вызовом filedialog, все нормально. С ней вылетает. Кто-нибудь сталкивался? Как обойти, если filedialog нужен для организации выбора Excel файла и без него не обойтись.

Код: Выделить всё

  progra

  map
    include('DDE.CLW')
  end

Window WINDOW('Caption'),AT(,,234,89),FONT('MS Sans Serif',8,,FONT:regular),CENTER,SYSTEM,GRAY,DOUBLE
     END
loc:exfile   cstring(256)
  code

  open(window)
  accept
    case event()
    of event:openwindow

      filedialog('',loc:exfile,'Файлы Excel | *.XLS;*.XLSX',FILE:LongName+FILE:KeepDir)

      settarget(Window)
      ExcelSheet#=DDEClient('Excel','[книга1.xlsx]лист1')
      if ExcelSheet#
        DDECLOSE(ExcelSheet#)
      else
        stop('файл не открыт')
      end
      stop('ok')
    end
  end
  close(window)
Аватара пользователя
morkovin
Ветеран
Сообщения: 909
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

Re: Виста, Excel2007 и DDE

Сообщение morkovin »

Насчет Filedialog не знаю. Но для экспорта таблиц в эксел использую шаблон DasTools-ExportToExcel(подрихтовал, чтобы переменные имена выходных файлов использовать). Так вот DDE четко работает и в Vista+Office2007
Вот шаблон (DASFEXCEL.TPW, есть нюансы с запускосм Excel - смотри каталоги расположения Excel.exe):


#EXTENSION(DAS_ExportFieldsMSExcel,'(DAS) Export fields to Microsoft Excel'),PROCEDURE,HLP('Export fields to Microsoft Excel')
#SHEET
#TAB ('General')
#PROMPT('Include DDE.CLW ?',CHECK),%INCLUDEDDE,At(10)
#PROMPT('Excel Row Character',@S1),%DasExcelExportRowCharacter,Default('R'),At(,,20),WHENACCEPTED(%DasExportExcelMakeUpper())
#PROMPT('Excel Column Character',@S1),%DasExcelExportColumnCharacter,Default('C'),At(,,20),WHENACCEPTED(%DasExportExcelMakeUpper())
#PROMPT('In what directory is your MS-Excel located ?',@s128),%DasExcelExportExcelFolder,REQ,DEFAULT('C:\Program Files\Microsoft Office\Office')
#PROMPT('What is the executable name of MS-Excel ?',@s128),%DasExcelExportExcelPgmName,REQ,DEFAULT('EXCEL.EXE')
#PROMPT('In which Row you want to start?',SPIN(@N_7,1,999999)),%DasExcelExportExcelRowStart,REQ,DEFAULT(1),VALUE(%DasExcelExportExcelRowStart>0)
#PROMPT('In Which Column you want to start?',SPIN(@N_7,1,999999)),%DasExcelExportExcelColumnStart,REQ,DEFAULT(1),VALUE(%DasExcelExportExcelColumnStart>0)
#PROMPT('Enter the location for saving',@s128),%DasExcelExportSaveLocation,REQ,DEFAULT('C:\My Documents')
#PROMPT('Enter the name of your spreadsheet',@S8),%DasExcelExportSheetSaveName,REQ,DEFAULT('TT_TEMP')
#DISPLAY('Without any extension')
#PROMPT('Use Template ?',CHECK),%DasExcelExportUseTemplate
#PROMPT('Template Directory',@S128),%DasExcelExportTemplateFolder,DEFAULT('C:\Program Files\Microsoft Office\Templates')
#PROMPT('Template Name',@S8),%DasExcelExportTemplateName,DEFAULT('TT_TEMP')
#DISPLAY('Without any extension')
#ENDTAB
#TAB ('Fields')
#PROMPT('Description To First Row',CHECK),%DasExcelExportDescriptionToFirstRow,At(10)
#BUTTON('Multiple FIELDS'),REQ,INLINE,MULTI(%ButtonSymbol,%DasExcelExportField & ' - ' & %DasExcelExportFieldDescription)
#PROMPT('Which fields you want to export',FIELD),%DasExcelExportField,REQ,WHENACCEPTED(%DasExportExcelFindField(%DasExcelExportField,%DasExcelExportFieldPicture,%DasExcelExportFieldDescription))
#PROMPT('What is the format?',@s40),%DasExcelExportFieldPicture,REQ
#PROMPT('Description',@s40),%DasExcelExportFieldDescription,REQ
#ENDBUTTON
#ENDTAB
#ENDSHEET
#!C:\Clarion5\TINGROUP\Autolog
#!-------------------------------------------------------------------------
#! Set Things Up
#!-------------------------------------------------------------------------
#AtStart
#Insert(%TINGROUPSETVERSIONS)
#EndAt
#!-------------------------------------------------------------------------
#! Include DDE
#!-------------------------------------------------------------------------
#At(%GLOBALMAP),Where(%INCLUDEDDE)
INCLUDE('DDE.CLW')
#EndAt
#!-------------------------------------------------------------------------
#! Local Data CFW
#!-------------------------------------------------------------------------
#At(%DeclarationSection),Where(%TINVERCTRLCFWTEMPLATESET = 'CFW')
#Insert(%DasExportExcelLocalData)
#EndAt
#!-------------------------------------------------------------------------
#! Local Data ABC
#!-------------------------------------------------------------------------
#At(%LocalDataAfterClasses),Where(%TINVERCTRLCFWTEMPLATESET = 'ABC')
#Insert(%DasExportExcelLocalData)
#EndAt
#!-------------------------------------------------------------------------
#! ABC Style
#!-------------------------------------------------------------------------
#AT(%WindowManagerMethodCodeSection,'Init','(),BYTE'),WHERE(%TINVERCTRLCFWTEMPLATESET = 'ABC'),PRIORITY(5050)
#Insert(%DasExportExcelInit)
#ENDAT
#!-------------------------------------------------------------------------
#! Old CFW Style
#!-------------------------------------------------------------------------
#AT(%BeforeFileOpen),WHERE(%TINVERCTRLCFWTEMPLATESET = 'CFW')
#Insert(%DasExportExcelInit)
#ENDAT
#!-------------------------------------------------------------------------
#! ABC Style
#!-------------------------------------------------------------------------
#AT(%ProcessManagerMethodCodeSection,'TakeRecord','(),BYTE'),WHERE(%TINVERCTRLCFWTEMPLATESET = 'ABC'),PRIORITY(5050)
Do ExportFieldsToExcel%ActiveTemplateInstance
#ENDAT
#!-------------------------------------------------------------------------
#! Old CFW Style
#!-------------------------------------------------------------------------
#AT(%PROCESSACTIVITY),WHERE(%TINVERCTRLCFWTEMPLATESET = 'CFW')
Do ExportFieldsToExcel%ActiveTemplateInstance
#ENDAT
#!-------------------------------------------------------------------------
#! ABC Style
#!-------------------------------------------------------------------------
#AT(%WindowManagerMethodCodeSection,'Kill','(),BYTE'),WHERE(%TINVERCTRLCFWTEMPLATESET = 'ABC'),PRIORITY(8800)
Do ExportCloseSpreadSheet%ActiveTemplateInstance
#ENDAT
#!-------------------------------------------------------------------------
#! Old CFW Style
#!-------------------------------------------------------------------------
#AT(%ENDOFPROCEDURE),WHERE(%TINVERCTRLCFWTEMPLATESET = 'CFW')
Close(ProgressWindow)
Do ExportCloseSpreadSheet%ActiveTemplateInstance
#ENDAT
#!-------------------------------------------------------------------------
#! Export Procedure Routines (CFW And ABC)
#!-------------------------------------------------------------------------
#At(%ProcedureRoutines)
#If(%DasExcelExportDescriptionToFirstRow)
ExportDescriptionToFirstRow%ActiveTemplateInstance Routine
#EMBED(%DASExcelExportBeforeExportHeader,'DASExcelExport Before Header Export')
FIELDCOUNT::%ActiveTemplateInstance=0
#FOR(%BUTTONSYMBOL)
CELL::%ActiveTemplateInstance = '%DasExcelExportRowCharacter'&format(%DasExcelExportExcelRowStart+RECORDCOUNT::%ActiveTemplateInstance,@P#####P)&'%DasExcelExportColumnCharacter'&FORMAT(%DasExcelExportExcelColumnStart+FIELDCOUNT::%ActiveTemplateInstance,@P#####P)
DDEPOKE(DDECHANNEL::%ActiveTemplateInstance,CELL::%ActiveTemplateInstance,'%DasExcelExportFieldDescription')
FIELDCOUNT::%ActiveTemplateInstance+=1
#ENDFOR
RECORDCOUNT::%ActiveTemplateInstance+=1
#EMBED(%DASExcelExportAfterExportHeader,'DASExcelExport After Header Export')

#EndIf
ExportSetUpDDE%ActiveTemplateInstance Routine
#EMBED(%DASExcelExportBeforeExcelOpen,'DASExcelExport Before Excel Open')
DDECHANNEL::%ActiveTemplateInstance = DDECLIENT('EXCEL','SYSTEM')
IF NOT DDECHANNEL::%ActiveTemplateInstance
!---------MIASOFT------------
#IF(SUB(%DasExcelExportExcelFolder,1,1)='!')
#SET(%ValueConstruct,SUB(%DasExcelExportExcelFolder,2,LEN(%DasExcelExportExcelFolder)-1))
Message('"'&CLIP(%ValueConstruct)&'\%DasExcelExportExcelPgmName"', 'File')
RUN('"'& CLIP(%ValueConstruct)&'\%DasExcelExportExcelPgmName"',0)
#ELSE
RUN('"%DasExcelExportExcelFolder\%DasExcelExportExcelPgmName"',0)
#ENDIF
!-------END MIASOFT ------------
!RUN('"%DasExcelExportExcelFolder\%DasExcelExportExcelPgmName"',0)
ELSE
DDEEXECUTE(DDECHANNEL::%ActiveTemplateInstance,'[FILECLOSEALL(2)]')
END
IF NOT DDECHANNEL::%ActiveTemplateInstance AND ERRORCODE()
Message('Excel Could Not Be Located Or Executed','Warning',ICON:Exclamation,BUTTON:No,BUTTON:No,1)
Exit
END
DDECHANNEL::%ActiveTemplateInstance = DDECLIENT('Excel','System')
#EMBED(%DASExcelExportAfterExcelOpen,'DASExcelExport After Excel Open')

ExportGetSpreadSheetName%ActiveTemplateInstance Routine
#EMBED(%DASExcelExportBeforeFileNameSetup,'DASExcelExport Before File Name Setup')
SpreadSheet::%ActiveTemplateInstance = '%DasExcelExportSaveLocation\%DasExcelExportSheetSaveName.XLS'
!%(%TinGroupSetStringVariable(%DasExcelExportSaveLocation)) & '\' & %(%TinGroupSetStringVariable(%DasExcelExportSheetSaveName)) & '.XLS'
#If(%DasExcelExportUseTemplate)
Template::%ActiveTemplateInstance = '%DasExcelExportTemplateFolder\%DasExcelExportTemplateName.XLT'
#EndIf
#EMBED(%DASExcelExportAfterFileNameSetup,'DASExcelExport After File Name Setup')

ExportOpenSpreadSheet%ActiveTemplateInstance Routine
#EMBED(%DASExcelExportBeforeSheetOpen,'DASExcelExport Before Sheet Open')
#If(%DasExcelExportUseTemplate)
DDEEXECUTE(DDECHANNEL::%ActiveTemplateInstance,'[OPEN("' & Clip(Template::%ActiveTemplateInstance) & '")]')
DDEEXECUTE(DDECHANNEL::%ActiveTemplateInstance,'[SAVE.AS("' & Clip(SpreadSheet::%ActiveTemplateInstance) & '")]')
#Else
DDEEXECUTE(DDECHANNEL::%ActiveTemplateInstance,'[NEW(1)]')
DDEEXECUTE(DDECHANNEL::%ActiveTemplateInstance,'[SAVE.AS("' & Clip(SpreadSheet::%ActiveTemplateInstance) & '")]')
#End
#EMBED(%DASExcelExportAfterSheetOpen,'DASExcelExport After Sheet Open')

ExportCloseSpreadSheet%ActiveTemplateInstance Routine
#EMBED(%DASExcelExportBeforeSheetClose,'DASExcelExport Before Sheet Close')
DDEEXECUTE(DDECHANNEL::%ActiveTemplateInstance,'[CLOSE("%DasExcelExportSaveLocation\%DasExcelExportSheetSaveName.XLS")]')
DDEEXECUTE(DDECHANNEL::%ActiveTemplateInstance,'[FILECLOSEALL(2)]')
DDECLOSE(DDECHANNEL::%ActiveTemplateInstance)
#EMBED(%DASExcelExportAfterSheetClose,'DASExcelExport After Sheet Close')

ExportFieldsToExcel%ActiveTemplateInstance Routine
FIELDCOUNT::%ActiveTemplateInstance=0
#FOR(%BUTTONSYMBOL)
#EMBED(%DASExcelExportBeforeFieldExport,'DASExcelExport Before Field Export')
CELL::%ActiveTemplateInstance = '%DasExcelExportRowCharacter'&format(%DasExcelExportExcelRowStart+RECORDCOUNT::%ActiveTemplateInstance,@P#####P)&'%DasExcelExportColumnCharacter'&FORMAT(%DasExcelExportExcelColumnStart+FIELDCOUNT::%ActiveTemplateInstance,@P#####P)
DDEPOKE(DDECHANNEL::%ActiveTemplateInstance,CELL::%ActiveTemplateInstance,FORMAT(%DasExcelExportField,%DasExcelExportFieldPicture))
FIELDCOUNT::%ActiveTemplateInstance+=1
#EMBED(%DASExcelExportAfterFieldExport,'DASExcelExport After Field Export')
#ENDFOR
RECORDCOUNT::%ActiveTemplateInstance+=1

#EndAt
#!-------------------------------------------------------------------------
#! Export Local Data
#!-------------------------------------------------------------------------
#Group(%DasExportExcelLocalData)
DDECHANNEL::%ActiveTemplateInstance LONG
RECORDCOUNT::%ActiveTemplateInstance LONG
CELL::%ActiveTemplateInstance STRING(20)
FIELDCOUNT::%ActiveTemplateInstance LONG
!BLANKFIELD::%ActiveTemplateInstance STRING(1)
DDECommand::%ActiveTemplateInstance CSTRING(256)
SpreadSheet::%ActiveTemplateInstance CSTRING(256)
#If(%DasExcelExportUseTemplate)
Template::%ActiveTemplateInstance CSTRING(256)
#EndIf
#!-------------------------------------------------------------------------
#! Export Local Data
#!-------------------------------------------------------------------------
#Group(%DasExportExcelInit)
#INSERT(%TINGROUPHEADER,'-----------Export To Excel-------------')
Do ExportSetUpDDE%ActiveTemplateInstance
If Not DDECHANNEL::%ActiveTemplateInstance Then
#If(%TINVERCTRLCFWTEMPLATESET = 'ABC')
Return Level:Notify
#Else
Do ProcedureReturn
#EndIf
End
Do ExportGetSpreadSheetName%ActiveTemplateInstance
IF EXISTS(SpreadSheet::%ActiveTemplateInstance)
CASE MESSAGE('File already exists, Do you want to overwrite','Warning',ICON:Question,BUTTON:Yes+BUTTON:No,BUTTON:No,1)
OF BUTTON:Yes
REMOVE(SpreadSheet::%ActiveTemplateInstance)
Do ExportOpenSpreadSheet%ActiveTemplateInstance
OF BUTTON:NO
#If(%TINVERCTRLCFWTEMPLATESET = 'ABC')
Return Level:Notify
#Else
Do ProcedureReturn
#EndIf
END
DDEEXECUTE(DDECHANNEL::%ActiveTemplateInstance,'[OPEN("' & Clip(SpreadSheet::%ActiveTemplateInstance) & '")]')
DDECLOSE(DDECHANNEL::%ActiveTemplateInstance)
ELSE
Do ExportOpenSpreadSheet%ActiveTemplateInstance
END
DDECHANNEL::%ActiveTemplateInstance = DDECLIENT('EXCEL',SpreadSheet::%ActiveTemplateInstance)
RECORDCOUNT::%ActiveTemplateInstance = 0
#If(%DasExcelExportDescriptionToFirstRow)
Do ExportDescriptionToFirstRow%ActiveTemplateInstance
#EndIf
#INSERT(%TINGROUPHEADER,'-----------Export To Excel-------------')
#!-------------------------------------------------------------------------
#! Make Row And Column Character Upper Case
#!-------------------------------------------------------------------------
#Group(%DasExportExcelMakeUpper)
#Set(%DasExcelExportRowCharacter,Upper(%DasExcelExportRowCharacter))
#Set(%DasExcelExportColumnCharacter,Upper(%DasExcelExportColumnCharacter))
#!-------------------------------------------------------------------------
#! Get Export Field Information
#!-------------------------------------------------------------------------
#Group(%DasExportExcelFindField,%DasExportExcelFieldName,*%DasExportExcelFieldPicture,*%DasExportExcelFieldDescription)
#For(%File)
#!FIX(%File,%ProcFilesUsed)
#Fix(%Field,%DasExportExcelFieldName)
#IF(%Field)
#Set(%DasExportExcelFieldPicture,%FieldDisplayPicture)
#Set(%DasExportExcelFieldDescription,%FieldHeader)
#!%FieldDescription
#Break
#EndIf
#EndFor
WBR, morkovin
Ответить