@Docbrain

Код записывающий макрос в документ Word, вылетает с непонятной ошибкой. Почему?

Доброе время суток. У меня есть код на Delphi, который должен записывать макрос в документы Word:
const

  vbext_ct_StdModule = 1;

  wdFormatXMLDocumentMacroEnabled = 13;
var
  wdApp, wdDoc, wdVbProj, wdVbModule, wdVbCode : OleVariant;
  FName : String;
  I : Integer;
  begin
  try
    wdApp := CreateOleObject('Word.Application');
    finally
    end;
  wdApp.Visible := False;
  for I := 0 to ListBox1.Count -1 do
  begin
  wdDoc := wdApp.Documents.Open(ListBox1.Items[I]);
    wdVbProj := wdDoc.VBProject;
  wdVbModule := wdVbProj.VBComponents.Add(vbext_ct_StdModule);
  //wdVbModule.Name := 'VBModule1';
  wdVbCode := wdVbModule.CodeModule;
  wdApp.DisplayAlerts := False;
  try
    wdVbCode.DeleteLines(1, wdVbCode.CountOfLines);
    wdVbCode.AddFromString(Memo1.Text);
    finally
    wdApp.DisplayAlerts := True;
    end;
    FName := ListBox1.Items[I] ;
    FName := LeftStr(FName, Length(FName) - Length(ExtractFileExt(FName))) + '.docm';
    wdApp.DisplayAlerts := False;
      wdDoc.SaveAs(FileName:=FName, FileFormat:=wdFormatXMLDocumentMacroEnabled);
      wdApp.DisplayAlerts := True;
wdDoc.Close;
end;
  wdApp.Quit;
end;

однако когда я его запускаю на выполнение, он почему-то вылетает с ошибкой: "Файл поврежден", причем какой именно файл, он не пишет. Отладчик Delphi во всем винит вот эту строку:
wdDoc := wdApp.Documents.Open(ListBox1.Items[I]);
При этом, когда я пробую обратиться к файлу не через ListBox1.Items, а напрямую, все работает нормально. В чем тут дело и как заставить код работать как надо?
P.S. На всякий случай, вот вам еще код, записывающий данные в ListBox:
procedure TForm1.FindFilePattern(root, pattern: String);
var
SR:TSearchRec;
Ext : String;
begin
root:=IncludeTrailingPathDelimiter(root);
  if FindFirst(root+'*.*',faAnyFile,SR) = 0 then
  begin
      repeat
          Application.ProcessMessages;
          if ((SR.Attr and faDirectory) = SR.Attr ) and (pos('.',SR.Name)=0) then
             FindFilePattern(root+SR.Name,pattern)
          else
          begin
           Ext := AnsiUpperCase(ExtractFileExt(SR.Name));
         
           if (Ext = '.DOCX') then
           begin
          
           ListBox1.Items.Add(Root + SR.Name);
           end;
          end;
      until FindNext(SR)<>0;
  end;
end;
  • Вопрос задан
  • 137 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы