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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.12.2012, 12:02
Syslenish Syslenish вне форума
Прохожий
 
Регистрация: 07.12.2012
Сообщения: 5
Репутация: 10
Вопрос Word в Delphi

Добрый день! Подскажите, пожалуйста, неумехе, я уже весь нет облазила, никак не могу найти ответ
Есть у меня текст в Ворде (калька), который я изменяю с помощью моей программки (ну там ФИО меняется, место проживания и т.п.). Так вот в определенном моменте мне нужно вставить вот такой текст:

Расчетный износ (Иф) ТС по методике Андрианова определяется по формуле:
Иф = 100 х (1 – е-Ω)
где: Ω функция, зависящая от возраста и фактического пробега АМТС с начала эксплуатации. Вид функции Ω для &тс3 &произв производства определяется:
∆T х Тф. + ∆L х Lф; где Lф – пробег с начала эксплуатации, Тф – фактический возраст.

Иф = 100(1-℮-Ω) = 64,32%
где: ТФ– фактический возраст транспортного = 8,18
Lф – пробег, c начала эксплуатации (в тыс. Км.) = 130,880
Расчетный износ (Иф) транспортного средства – 64,32%


Проблема вот в чем:
1) Как сделать так, чтобы первая строчка этого текста записывалась жирным шрифтом, остальные - обычным;
2) как записать, что "е" в степени?
3) как записать подстрочный текст? (Lф - здесь "ф" должна быть подстрочная)
4) у меня при компиляции unit Word_TLB возникает ошибка в procedure TWordDocument.InvokeEvent в
9: if Assigned(FOnXMLBeforeDelete) then
FOnXMLBeforeDelete(Self,
IUnknown(TVarData(Params[0]).VPointer) as Range {const Range},
IUnknown(TVarData(Params[1]).VPointer) as XMLNode {const XMLNode},
Params[2] {WordBool});

Ошибка: [Error] Word_TLB.pas(34708): Operator not applicable to this operand type
Ответить с цитированием
  #2  
Старый 07.12.2012, 12:28
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 297
Репутация: -1806
По умолчанию

я вот понять немогу никак нахрена писать программу которая чегототам пишет в другой программе ? это типа мода такая пошла?
Ответить с цитированием
  #3  
Старый 07.12.2012, 12:30
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

ошибку не знаю, а те строчки должно быть можно добавить в ту кальку(.doc файл как я понял) в уже отформатированном виде, вроде Иф = 100 х (1 – е-%OMEGA%), а из дельфи заменить текст на нужный

(а если эта калька действительно генерируется другой программой, то значит я не так понял, и тоже понять не могу)
__________________
>woweook<

Последний раз редактировалось Pyro, 07.12.2012 в 12:36.
Ответить с цитированием
  #4  
Старый 07.12.2012, 12:47
Syslenish Syslenish вне форума
Прохожий
 
Регистрация: 07.12.2012
Сообщения: 5
Репутация: 10
По умолчанию

Калька у меня уже есть) Калька - это текст в формате .doc, который нужно изменить с помощью программы, которую я пишу. Изменять нужно как простые вещи типа ФИО, так и в зависимости от всяких галочек на моей форме, целый кусок текста. Сразу в эту кальку вставить кусок текста, который я написала нельзя, так как в одном случае этот кусок должен появиться в тексте, в другом случае - не должен
Ответить с цитированием
  #5  
Старый 07.12.2012, 13:16
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Syslenish
Проблема вот в чем:
1) Как сделать так, чтобы первая строчка этого текста записывалась жирным шрифтом, остальные - обычным;
2) как записать, что "е" в степени?
3) как записать подстрочный текст? (Lф - здесь "ф" должна быть подстрочная)
Всё очень просто - записываешь в Word-е макрос с нужными действиями и просто переводишь этот макрос с бейсика на Delphi.
Например:
Код:
  with WordApplication1.Selection do
  begin
    Font.Bold:=1;
    TypeText('Жирный текст');
    Font.Bold:=0;
    TypeText('Обычный текст');
    Font.Superscript:=1;
    TypeText('Верхний индекс');
    Font.Superscript:=0;
    TypeText('Обычный текст');
    Font.Subscript:=1;
    TypeText('Нижний индекс');
    Font.Subscript:=0;
    TypeText('Обычный текст');
  end;
Но вообще лучше работать с Word-документом не через Selection и TypeText, а через Range и InsertAfter/InsertBefore, но я сейчас уже и не помню как это делается.

Ещё есть неплохой вариант - сохранить шаблон документа в формате rtf и работать с ним как с текстом.
Цитата:
Сообщение от Syslenish
4) у меня при компиляции unit Word_TLB возникает ошибка в procedure TWordDocument.InvokeEvent в
А откуда у тебя взялся модуль Word_TLB? С интернета?
В Delphi на вкладке Servers палитры компонентов просто брось на форму компоненты TWordApplication и TWordDocument.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Syslenish (07.12.2012)
  #6  
Старый 07.12.2012, 14:56
Syslenish Syslenish вне форума
Прохожий
 
Регистрация: 07.12.2012
Сообщения: 5
Репутация: 10
По умолчанию

poli-smen, спасибо огромное! Сейчас начну ковыряться с макросами А на счет модуля Word_TLB, нашла вот такую фразу:

"Далее для работы с Word-ом нам потребуется библиотека типов Word-а, это делается так: Project, Import Type Library, Add, далее переходим в папку, где стоит Word ( у меня это - "c:\program files\microsoft office) , заходим в папку Office и выбираем файл - msword8.olb (цифра -? версии Word-а - у Вас может отличаться ) или excel8.olb (для Excel).Нажимаем Оk. Delphi создаст 2 файла - Word_tlb.pas и Office_tlb.pas, их надо включить в раздел uses модуля Main нашего проекта"

ну и решила, что этот модуль будет крайне необходим для моей проги) Но видимо не нужно)) Еще раз огромное спасибо!
Ответить с цитированием
  #7  
Старый 07.12.2012, 16:51
Syslenish Syslenish вне форума
Прохожий
 
Регистрация: 07.12.2012
Сообщения: 5
Репутация: 10
По умолчанию

Так, у меня едет крыша)) Я разобралась с макросами, но теперь не знаю, как мне мой этот замечательный текст впихнуть именно в нужное мне место! Получается, он сразу этот мой жирный текст записывает ) Прям с самого начала документа! А как же его запихать в конкретное место? Этот кусок текста мне нужно вставить вместо метки "&износ" в файл типа .doc (в мою кальку) а он у меня вставляется в начало документа))

Ищу и заменяю текст я таким образом:

Код:
function TForm1.WordFindAndInsert(FindText, ReplacementText: String): boolean;
  const wdReplaceAll=2; //указываю, что это шаблон Word (файл с расширением DOС)
begin
  W.Selection.Find.Text:=FindText; // поиск текста
  W.Selection.Find.Replacement.Text:=ReplacementText;//текст для вставки
  WordFindAndInsert:=W.Selection.Find.Execute(Replace:=wdReplaceAll); //замена текста
end;

а вот кусок в тексте, где я хочу конкретную фразу вставить в конкретное место, но он мне в определенное место вставляет без всяких выделений, а в начале документа тот текст, который нужно))

Код:
text1:='Расчетный износ (Иф) ТС по методике Андрианова определяется по формуле:';
            Wordinsert(text1,true,false,false,false,10,false);
           iznos:= iznos+text1+#13;
           WordFindAndInsert('&износ', iznos);
          W.Selection.Font.Bold:= false;

где

Код:
procedure Wordinsert(info: string; _bold, _italic, _StrikeThrough, _Underline:
  boolean; _Size: integer; _center: boolean);
begin
  W.Selection.Font.Bold := _bold;
  W.Selection.Font.italic := _italic;
  W.Selection.Font.StrikeThrough := _StrikeThrough;
  W.Selection.Font.Underline := _Underline;
  W.Selection.Font.Size := _Size;
  if _center = true then
    W.Selection.ParagraphFormat.Alignment := 1;
  W.selection.TypeText(info);
end;
Ответить с цитированием
  #8  
Старый 07.12.2012, 17:07
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Syslenish
Так, у меня едет крыша)) Я разобралась с макросами, но теперь не знаю, как мне мой этот замечательный текст впихнуть именно в нужное мне место!
Значит так.
Создаёшь новый шаблон документа MSWord. В нужных местах вставляешь закладки: "Вставка" -> "Закладка...", даёшь закладке имя, допустим "Закладка1". Сохраняешь шаблон (допустим в папку с новым проектом) но не как документ, а как шаблон (т.е. файл с расширением .dot, а не .doc).
Далее создаёшь новый проект Delphi. На форму бросаешь компоненты TWordApplication и TWordDocument. У них есть свойство "ConnectKind", которое по-умолчанию имеет значение "ckRunningOrNew", сразу же меняешь это значение на "ckNewInstance". Почему? Потому что меня раздражает, когда я работаю в каком нибудь документе Word/Excel и тут к моему Word/Excel подключается какой-то скрипт, открывает в нём какие-то документы и всячески мешает работать, а ещё после всего этого (особая наглость) пытается закрыть приложение Word/Excel со всеми моими открытыми документами. А с параметром "ckNewInstance", скрипт тихонько себе запустит новое приложение (т.е. новый exe-шник winword.exe) и в нём так же тихонько будет что-то там делать.
Теперь бросай на форму кнопку TButton и цепляй такой обработчик OnClick к кнопке:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  doc: _Document;
  o1, o2: OleVariant;
begin
  WordApplication1.ConnectKind := ckNewInstance; // На всякий случай :)
  WordApplication1.Connect;
  try
    o1 := ExtractFilePath(Application.ExeName) + 'Шаблон.dot';
    doc := WordApplication1.Documents.Add(o1, EmptyParam, EmptyParam, EmptyParam);

    WordDocument1.ConnectTo(doc);
    try
      o1 := wdGoToBookmark;
      o2 := 'Закладка1';
      WordDocument1.GoTo_(o1, EmptyParam, EmptyParam, o2).Select;

      with WordApplication1.Selection do
      begin
        TypeText('Обычный текст ');

        Font.Bold := 1;
        TypeText('Жирный текст ');
        Font.Bold := 0;

        Font.Italic := 1;
        TypeText('Курсивный текст ');
        Font.Italic := 0;

        Font.Superscript := 1;
        TypeText('Верхний индекс ');
        Font.Superscript := 0;

        Font.Subscript := 1;
        TypeText('Нижний индекс ');
        Font.Subscript := 0;

        TypeText('Греческая буква омега: ');
        o1 := True;
        InsertSymbol(937, EmptyParam, o1, EmptyParam);

        TypeParagraph;
        TypeText('Следующий абзац ');
      end;
    finally
      WordDocument1.Disconnect;
    end;
  finally
    WordApplication1.Visible := True;
    WordApplication1.Disconnect;
  end;
end;
Думаю разберёшься
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Syslenish (10.12.2012)
  #9  
Старый 10.12.2012, 16:40
Syslenish Syslenish вне форума
Прохожий
 
Регистрация: 07.12.2012
Сообщения: 5
Репутация: 10
По умолчанию

poli-smen, мой мозг спасен Спасибо, Вы настоящий эксперт!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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