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



Вернуться   Форум по 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 по маркеру:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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. В первом случае, где
Код:
1
2
Find_T := '%msku%'; // Текст, который меняем
Replese_T := sau; // Заменить на
все заменяется нормально и адекватно.

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

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

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

5. Переменная docs описана в процедуре вывода списка файлов из папки в RichEdit:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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;

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

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
// Создаем реестр документов
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
По умолчанию

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


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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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