Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2015, 11:35   #1
Владислав-2012
Пользователь
 
Регистрация: 30.09.2014
Сообщений: 13
По умолчанию Работа с Word

Помогите разобраться, ибо у меня постоянно вылетают ошибки, как на картинке, и последовательность абзацев меняется


Код:
procedure TForm2.Action1Execute(Sender: TObject);
const
  wdAlignParagraphCenter = 1;
  wdAlignParagraphLeft = 0;
  wdAlignParagraphRight = 2;
  wdLineStyleSingle = 1;
var
  wdApp, wdDoc, wdRng, wdTable : Variant;
  i, j, Res : Integer;
  D : TDateTime;
  Bm : TBookMark;
  Sd : TSaveDialog;
  per:integer;
  kod: string;
begin
........................
  try
     // Таблица.
    if not IBQuery1.Active then IBQuery1.Open;
    wdRng.Start := wdRng.End;
    wdTable := wdDoc.Tables.Add(wdRng.Characters.Last, 8, 3);
    wdTable.Columns.item(1).Width:=20;
    wdTable.Columns.item(1).Width:=100;
    wdTable.Columns.item(1).Width:=70;
    wdTable.Borders.InsideLineStyle := wdLineStyleSingle;
    wdTable.Borders.OutsideLineStyle := wdLineStyleSingle;
    wdRng.ParagraphFormat.Reset;
    wdRng.ParagraphFormat.Alignment := wdAlignParagraphleft;
    wdTable.Cell(1, 2).Range.Text := 'Полное наименование юридического лица ';
    wdTable.Cell(2, 2).Range.Text := 'Сокращенное наименование' ;
    wdTable.Cell(3, 2).Range.Text := 'Организационно-правовая форма' ;
    wdTable.Cell(4, 2).Range.Text := 'Место нахождения (из Устава)' ;
    wdTable.Cell(5, 2).Range.Text := 'ОГРН (основной государственный номер записи о создании юридического лица)' ;
    wdTable.Cell(6, 2).Range.Text := 'ИНН (идентификационный номер плательщика)' ;
    wdTable.Cell(7, 2).Range.Text := 'КПП (код причины постановки на учет)' ;
    wdTable.Cell(8, 2).Range.Text := 'Коды ОКВЭД' ;
     for i := 0 to 8 do
     wdTable.Cell(i, 1 ).Range.Text := i;
.....................
      ibquery1.First;
    for i := 0 to 8 do
     begin
      wdTable.Cell(i, 3).Range.Text := ibquery1.Fields[i].AsString;
      end;
    ibquery1.GotoBookMark(Bm);
    ibquery1.EnableControls;
    wdRng := wdDoc.Range.Characters.Last;

    wdRng.InsertAfter('просит подтвердить отнесение вида отходов к конкретному классу опасности  ');
    wdRng.InsertAfter(#13#10);
    wdRng.InsertAfter('для окружающей среды в соответствии с прилагаемым перечнем отходов. ');
    wdRng.Font.Reset;
    wdRng.Font.Name := 'Times New Roman';
    wdRng.Font.Bold := false;
    wdRng.Font.Size := 12;
    wdRng.InsertAfter(#13#10);
     D := Now;
     wdRng.Start := wdRng.End;

    wdRng.Font.Reset;
    wdRng.InsertAfter(#13#10);
    wdRng.InsertAfter('Генеральный директор');
    wdRng.InsertAfter(#13#10);
    wdRng.InsertAfter('ЗАО "Михайловский сахарник"      _________________ /Шаталин Сергей Викторович/');
    wdRng.InsertAfter(#9+#9+#9+#9+#9+#9+#9+#9+'(подпись)'+#9+#9+#9+'(ФИО)');
    wdRng.InsertAfter(#13#10);
    D := Now;
    wdRng.InsertAfter('Телефон: (83140) 54-6-26 ' + #9+ #9+ #9 + FormatDateTime('dd.mm.yyyy', D) + #13 +'года');
    wdRng.Font.Name := 'Times New Roman';
    wdRng.Font.Bold := false;
    wdRng.Font.Size := 10;
    wdRng.InsertAfter(#13#10);
    wdRng.Start := wdRng.End;
    // новая страница -  разрыв
    wdRng.Start := wdRng.End;
    wdTable := wdDoc.Tables.Add(wdRng, 2, QWiev.Fields.Count);
    //Параметры линий
    wdTable.Borders.InsideLineStyle := wdLineStyleSingle;
    wdTable.Borders.OutsideLineStyle := wdLineStyleSingle;
    wdRng.ParagraphFormat.Reset;
    wdRng.ParagraphFormat.Alignment := wdAlignParagraphLeft;
    //Оформление шапки.
    wdRng := wdTable.Rows.Item(1).Range; //Диапазон первой строки.
    wdRng.ParagraphFormat.Alignment := wdAlignParagraphCenter;
    wdRng.Font.Size := 10;
    wdRng.Font.Bold := True;
    wdRng := wdTable.Rows.Item(2).Range; //Диапазон второй строки.
    wdRng.ParagraphFormat.Alignment := wdAlignParagraphLeft;
    wdRng.Font.Size := 10;
    wdRng.Font.Bold := False;
    //Записываем шапку таблицы.
    for i := 0 to DBGrideh1.FieldCount-1 do
      wdTable.Cell(1, i + 1).Range.Text :=  DBGrideh1.Columns[i].Title.Caption;
    //Записываем данные таблицы.
    QWiev.DisableControls;
    Bm := QWiev.GetBookMark;
    QWiev.First;
    i := 1;
    while not QWiev.Eof do
     begin
      Inc(i);
       if i > 2 then wdTable.Rows.Add;
         for j := 0 to QWiev.Fields.Count-1 do
           wdTable.Cell(i, j + 1).Range.Text := QWiev.Fields[j].AsString;
      QWiev.Next;
     end;
     QWiev.GotoBookMark(Bm);
    QWiev.EnableControls;
// начало послетабличных строк 3шт

  
  finally
      wdApp.ScreenUpdating := True;
  end;
  wdApp.DisplayAlerts := False;
  try
    wdDoc.SaveAs(FileName:=Sd.FileName);
  finally
    wdApp.DisplayAlerts := True;
  end;
end;
Изображения
Тип файла: png впр.PNG (8.3 Кб, 159 просмотров)

Последний раз редактировалось Вадим Мошев; 19.06.2015 в 12:19.
Владислав-2012 вне форума Ответить с цитированием
Старый 19.06.2015, 12:27   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

В конце листинга:
Код:
wdDoc.SaveAs(FileName:=Sd.FileName);
Меня одного такой синтаксис не устраивает?

По теме сказать ничего не смогу, лишь дам совет.
Пользуйтесь пошаговой трассировкой.

Перед тем местом, где, по вашему мнению, возникает ошибка, поставьте точку останова (мышкой нажмите на место, обозначенное красным кругом), после чего запустите программу. Выполните ту же последовательность действий, что приводит к ошибке, но программа остановится в том месте, где вы поставили останова. Далее нажимайте F7 - программа будет выполняться пошагово. Одно нажатие - один шаг. Так легко отследить ошибку.
Изображения
Тип файла: png 7.png (3.2 Кб, 171 просмотров)
Вадим Мошев вне форума Ответить с цитированием
Старый 19.06.2015, 12:53   #3
Владислав-2012
Пользователь
 
Регистрация: 30.09.2014
Сообщений: 13
По умолчанию

А как правильно, просто в этой строчке часто возникают ошибки
Владислав-2012 вне форума Ответить с цитированием
Старый 19.06.2015, 13:40   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Меня одного такой синтаксис не устраивает?
Да, только тебя. OLE вызов допускает именование параметров, и при этом остальные параметры, что не были указаны, получают значение EmptyParam. Очень удобная фича еще с Д6 или даже Д5.
Цитата:
этой строчке часто возникают ошибки
На какой именно строчке? Поточнее пожалуйста.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.06.2015, 14:10   #5
Владислав-2012
Пользователь
 
Регистрация: 30.09.2014
Сообщений: 13
По умолчанию

Постоянно ошибки на этой строчке
wdRng := wdDoc.Range.Characters.Last;

либо если ту строчку закомментить и вставить
wdRng.Start := wdRng.End; тогда вылазит ошибка на этой:
wdDoc.SaveAs(FileName:=Sd.FileName) ;
И последовательность абзацев нарушается

никто не подскажет?

Последний раз редактировалось Вадим Мошев; 19.06.2015 в 20:10.
Владислав-2012 вне форума Ответить с цитированием
Старый 19.06.2015, 20:02   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А ты проверил, доступны ли вообще эти свойства в этом месте?
Код:
var ov:OleVariant;
...
ov:=wdDoc.Range;
if Not VarIsClear(ov) then begin
 ov:=ov.Characters;
 if Not VarIsClear(ov) then begin
  if ov.Count<>0 then begin
   ov:=ov.Last;
   if Not VarIsClear(ov) then begin
    try
     wdRng.Start:=ov;
    except
     on e:Exceptio do ShowMessage('wdRng.Start не может принять Рэндж: '+e.Message);
    end;
   end else begin ShowMessage('Last Пусто'); end;
  end else begin ShowMessage('Characters Пусто'); end;
 end else begin ShowMessage('Characters недоступно'); end;
end else begin ShowMessage('wdDoc.Range недоступно'); end;
Я конечно понимаю, что многа букаф и вообще, но если ты хочешь получить стабильный код - нужно приложить усилие, а не просто так вызывать на авось.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.06.2015, 20:54   #7
Владислав-2012
Пользователь
 
Регистрация: 30.09.2014
Сообщений: 13
По умолчанию

никто не подскажет?

я делал строго по шаблону, у меня много мест где все 1 в 1, и там все отлично работает, а есть где 1 в 1 и оно пишет ошибку, я конечно понимаю что надо все досконально понимать в теме чтобы писать этот код, но я с ним столкнулся и 3 день все это создал, подскажите в какой направлении копать

и поверь я уже не мало усилий приложил к этому коду

Последний раз редактировалось Аватар; 20.06.2015 в 00:14.
Владислав-2012 вне форума Ответить с цитированием
Старый 19.06.2015, 21:36   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Код:
wdRng := wdDoc.Range.Characters.Last;
Ошибка здесь.
Какого-то вызваваемого тобой класса нет в этой цепочке свойств и он равен NULL. Гугли в VBA почему и как)
Человек_Борща вне форума Ответить с цитированием
Старый 19.06.2015, 22:09   #9
Владислав-2012
Пользователь
 
Регистрация: 30.09.2014
Сообщений: 13
По умолчанию

Беда в том, что именно это мне и посоветовали использовать, а не просто манипулируя диапазонами

и ошибка возникает не во всех таких строках, а только после комментария разрыв страницы, в коде выше, до этого все четко, и еще, заметил что при закрытии процесса OSPPSVC возникает меньше ошибок, особенно это про сохранения документа

Беда в том, что именно это мне и посоветовали использовать, а не просто манипулируя диапазонами и ошибка возникает не во всех таких строках, а только после комментария разрыв страницы, в коде выше, до этого все четко, и еще, заметил что при закрытии процесса OSPPSVC возникает меньше ошибок, особенно это про сохранения документа

Последний раз редактировалось Аватар; 20.06.2015 в 00:13.
Владислав-2012 вне форума Ответить с цитированием
Старый 19.06.2015, 23:19   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Беда в том, что именно это мне и посоветовали использовать, а не просто манипулируя диапазонами и ошибка возникает не во всех таких строках, а только после комментария разрыв страницы, в коде выше, до этого все четко, и еще, заметил что при закрытии процесса OSPPSVC возникает меньше ошибок, особенно это про сохранения документа
Ещё раз повторюсь, читайте документацию VBA по используемым вами методам MS Word, навернка найдете что-то после чего wdRng где-то получает NULL.

больше тут ничем помочь нельзя, читать доки за вас? Неа.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с Word. Mr_skiner Общие вопросы Delphi 8 14.04.2013 06:00
Работа с MS Word alexchromets Общие вопросы Delphi 12 05.06.2012 00:25
работа с Word Region27 C++ Builder 0 03.06.2012 03:58
Работа с Word Fistashka Помощь студентам 0 02.12.2011 12:36
Работать в Word, не открывая документы (работа с закрытыми документами Word) Георгиевич Microsoft Office Word 10 07.09.2009 11:19