Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.05.2017, 09:33
Аватар для ffpereverzev
ffpereverzev ffpereverzev вне форума
Новичок
 
Регистрация: 14.02.2017
Сообщения: 50
Версия Delphi: Delphi 7
Репутация: 10
Вопрос Сохранение текста в Word

Здравствуйте, уважаемые форумчане!
Вы не могли бы мне немного помочь (как обычно, страницы на 2-3) ?
Когда-то я задавал похожий вопрос в теме http://www.delphisources.ru/forum/sh...ad.php?t=28865, в которой расписывал код. Так вот, все работает, кроме одного момента (который раньше работал, а теперь вообще никак не хочет). Сохранение списка файлов по метке.

Теперь подробнее:

1. Есть код, который сохраняет текст в MS Word по маркеру:

Код:
WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
      Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);

    Find_T := '%msku%'; // Текст, который меняем
    Replese_T := sau; // Заменить на


    WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
      Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);

    Find_T := '%akty%'; // Текст, который меняем
    Replese_T := docs; // Заменить на

2. В первом случае, где
Код:
Find_T := '%msku%'; // Текст, который меняем
Replese_T := sau; // Заменить на
все заменяется нормально и адекватно.

А вот во втором, где список файлов:
Код:
Find_T := '%akty%'; // Текст, который меняем
Replese_T := docs; // Заменить на
замены не происходит.

3. Уже перепробовал разные варианты сохранения (в Memo, ListBox, RichEdit);

4. Пробовал в строке
Код:
Replese_T := docs;
делать не через переменную, а напрямую из окна, куда выводится список файлов, все равно не фунциклирует;

5. Переменная docs описана в процедуре вывода списка файлов из папки в RichEdit:
Код:
var
    docs : String;

...

// Путь к каталогу отсканированных документов
procedure TForm8.SpeedButton2Click(Sender: TObject);
  var
    tsr : tSearchRec;
  begin
    //Путь к папке, в которой нужно произвести поиск. Начальное значение выбираем
    //равным пути к той папке, в которой расположена наша программа.
    if gPath = '' then gPath := ExtractFilePath(ParamStr(0));
    //Диалог выбора папки.
    if not SelectDirectory('Выбор папки', '', gPath) then Exit;
    gPath := IncludeTrailingPathDelimiter(gPath); //Если конечный слеш отсутствует, то добавляем его.
         //Все файлы, исключая тома и папки.
    Edit3.Text :=  gPath;

    if FindFirst (gPath + '*.*',faAnyFile,tsr)=0 then
      repeat
        RichEdit13.Lines.Add(tsr.Name);
        docs := RichEdit13.Text;
      until
        FindNext(tsr)<>0;
      FindClose(tsr);
  end;

Ну и, как водится, привожу полный код:

Код:
// Создаем реестр документов
procedure TForm8.Button2Click(Sender: TObject);
  const
  // массивные маркеры
  marker: array[1..6] of string[25] =
  ('%sotrudnik%', // Маркер выбора сотрудника
  '%date_in%', // Маркер даты начала командировки
  '%date_out%', // Маркер даты окончания командировки
  '%station%', // Маркер трансгаза
  '%msku%', // Маркер шифра системы
  '%akty%'); // Маркер блока "Акты по результатам ПНР"

  var
  FTrue, Ffalse, Template, NewTemplate, ItemIndex1, R, D, DD, Replese_T, Find_T: OleVariant;
  Tbl, L, col: OleVariant;
  j: integer;
  transgaz : String;
  sau : String;

  begin
// Запрет выполнения операции, если не загружен info-файл
    if (trim(Edit1.Text) = '')  Then
      begin
        if MessageBox(Handle,PChar('Не указан путь к info-файлу!'#13#10'Операция не может быть выполнена!'),PChar('Недопустимое значение полей'),MB_ICONERROR+MB_OK)= mrOk then exit;
      end;

    // Запрет выполнения операции, если не указан каталог с документами
    if (trim(Edit3.Text) = '')  Then
      begin
        if MessageBox(Handle,PChar('Не указан каталог с документами!'#13#10'Операция не может быть выполнена!'),PChar('Недопустимое значение полей'),MB_ICONERROR+MB_OK)= mrOk then exit;
      end;

    Xlsdoc := CreateOleObject('Excel.Application');
    Xlsdoc.Workbooks.Open(Edit1.Text);
    Xlsdoc.Visible := False;
    transgaz := Xlsdoc.Range['B3'];
    sau := Xlsdoc.Range['B2'];
    Xlsdoc.Workbooks.Close;
    Xlsdoc.Quit;
    Xlsdoc:=UnAssigned;

     Memo1.Lines.Add('Соединение с шаблоном реестра документов...');
     Application.ProcessMessages;
    try
      WA2.Connect;
      WA2.Visible := False;
      Template := EmptyParam;
      NewTemplate := False;
      FTrue := true;
      Ffalse := false;

    except
      ShowMessage('Не удалось соедениться с шаблоном реестра документов!');
      Memo1.Lines.Add('Не удалось соедениться с шаблоном реестра документов!' );
      Application.ProcessMessages;
      exit;
    end;

    Memo1.Lines.Add('Создаем реестр документов...');
    Application.ProcessMessages;

  // Добавляем документ из имеющегося со статусом несохраненного нового документа

    try
      R := ExtractFilePath(Application.ExeName)+'\Shablon\Reestr.dot';
      ItemIndex1 := WA2.Documents.Add(R, NewTemplate, NewTemplate, Template);
      WD2.ConnectTo(WA2.Documents.Item(ItemIndex1));

    except

      Memo1.Lines.Add('Не удалось соедениться с шаблоном реестра документов (Reestr.dot)! Проверьте расположение файла!' );
      Application.ProcessMessages;
      ShowMessage('Не удалось соедениться с шаблоном реестра документов (Reestr.dot)! Проверьте расположение файла!');
      WD2.Application.Selection.EndOf(Template, Template);
      WA2.Application.WindowState := wdWindowStateMaximize;
      WA2.Application.ScreenUpdating := true;
      WA2.Application.ScreenRefresh;
      WA2.Visible := true;
      WA2.Disconnect;
      WD2.Disconnect;
      exit;
    end;

  try
  // Количество таблиц в документе и количество строк со столбцами
    col := WA2.ActiveDocument.Tables.Count;


    for j := 1 to col do
    begin
      Memo1.Lines.Add('Подключаемся к приложению MS Word...'+Inttostr(j));
      Application.ProcessMessages;

      tbl := WA2.ActiveDocument.Tables.Item(j); // Присоеденяемся к таблице

    end;

    L := wdStory; // В начало документа
    WA2.Selection.HomeKey(L, EmptyParam);

    Memo1.Lines.Add('Заменяем маркеры на текст...' );
    Application.ProcessMessages;

    Find_T := '%sotrudnik%'; // Текст, который меняем
    D := wdFindStop; // Найти один раз
    DD := wdReplaceAll; // Замена все
    Replese_T := ComboBox1.Text; // Заменить на


    WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
      Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);

    Find_T := '%date_in%'; // Текст, который меняем
    Replese_T := DateToStr(DateTimePicker1.Date); // Заменить на


    WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
      Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);

    Find_T := '%date_out%'; // Текст, который меняем
    Replese_T := DateToStr(DateTimePicker2.Date); // Заменить на


    WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
      Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);

    Find_T := '%station%'; // Текст, который меняем
    Replese_T := transgaz; // Заменить на


    WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
      Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);

    Find_T := '%msku%'; // Текст, который меняем
    Replese_T := sau; // Заменить на


    WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
      Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);

    Find_T := '%akty%'; // Текст, который меняем
    Replese_T := docs; // Заменить на


    WA2.Selection.Find.Execute(Find_T, EmptyParam, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
      Replese_T, DD, EmptyParam, EmptyParam, EmptyParam, EmptyParam);

    WD2.Application.Selection.EndOf(Template, Template);

 except
    WA2.Visible := true;
    WA2.Disconnect;
    WD2.Disconnect;
    Memo1.Lines.Add('Ошибка!' );
    Application.ProcessMessages;
    exit;
  end;
  Memo1.Lines.Add('Экспорт завершен.' );
  Application.ProcessMessages;
  WA2.Visible := True;
  Name2 := (ExtractFilePath(Application.ExeName)+'Реестр_документов_'+FormatDateTime('ddmmyyyy_hhmm', Now)+'.doc');
  WD2.SaveAs(Name2);
  WD2.Disconnect;
  WA2.Disconnect;
  WA2.Quit;
  MessageBox(Handle,PChar('Создание реестра документов выполнено успешно!'),PChar('Успех!'),MB_ICONINFORMATION+MB_OK);
 end;

P.S. Самое важное чуть не забыл! Если ввести текст, как константу, то все заменяется нормально и правильно. Видимо, проблема именно из-за того, что это список.

Последний раз редактировалось ffpereverzev, 22.05.2017 в 09:36.
Ответить с цитированием
  #2  
Старый 23.05.2017, 23:12
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от ffpereverzev
...Если ввести текст, как константу, то все заменяется нормально и правильно. Видимо, проблема именно из-за того, что это список.
Видимо в этом месте нужно прикрутить цикл и передавать туда имена файлов по-одному, пока список не кончится
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
ffpereverzev (23.05.2017)
  #3  
Старый 23.05.2017, 23:26
Аватар для ffpereverzev
ffpereverzev ffpereverzev вне форума
Новичок
 
Регистрация: 14.02.2017
Сообщения: 50
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Попробую. Спасибо большое! Как протестирую - отпишусь.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:35.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter