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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2013, 07:46   #11
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Какую ошибку выдаёт?
FaTaL вне форума Ответить с цитированием
Старый 14.11.2013, 11:39   #12
undead92
Пользователь
 
Регистрация: 26.12.2009
Сообщений: 95
По умолчанию

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

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Edit3: TEdit;
    Label4: TLabel;
    Edit4: TEdit;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    Edit5: TEdit;
    Edit6: TEdit;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  ComObj;

procedure TForm1.Button1Click(Sender: TObject);
const
  BmName = 'TABLE_1';
var
  wdApp, wdDocs, wdDoc, wdBms, wdBm, wdRng, wdTbls, wdTbl, wdRow : Variant;
  i, j, Cnt : Integer;
  iRows, iCols, iGridRows, jGridCols: Integer;
  Path : String;
  Od : TOpenDialog;
begin
  Od := OpenDialog1; //OpenDialog1 уже должен быть на форме.
  Path := ExtractFilePath(ParamStr(0));
  if Od.InitialDir = '' then Od.InitialDir := Path + 'docs\';
  Od.Title := 'Выберите файл документа';
  if not Od.Execute then Exit;
  if not FileExists(Od.FileName) then begin
    MessageBox(0, 'Файл с заданным именем не найден. Действие отменено.'
      ,'Внимание!', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
  try
    wdApp := CreateOleObject('Word.Application');
  except
    MessageBox(0, 'Не удалось запустить MS Word. Действие отменено.'
      ,'Внимание!', MB_OK + MB_ICONERROR + MB_APPLMODAL);
    Exit;
  end;

  //Делаем видимым окно MS Word.
  wdApp.Visible := True;
 // wdDoc := wdApp.Documents.Add;
  //Ссылка на коллекцию документов.
  wdDocs := wdApp.Documents;
  //Открываем документ.
  wdDoc := wdDocs.Open(FileName:=Od.FileName);
  //Подключаемся к коллекции закладок.
  wdBms := wdDoc.Bookmarks;
  //Проверяем, есть ли в документе закладка с заданным именем.
  if not wdBms.Exists(BmName) then begin
    MessageBox(0, 'В документе нет закладки с именем "' + BmName + '". Действие отменено.'
      ,'Внимание!', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;

  //Ссылка на закладку.
  wdBm := wdBms.Item(BmName);
  //Ссылка на диапазон, связанный с закладкой.
  wdRng := wdBm.Range;
  //Удаление закладки.
  wdBm.Delete;

  //Ссылка на коллекцию таблиц.
  wdTbls := wdDoc.Tables;
  //Определеляем, какой таблице принадлежит диапазон закладки.
  wdTbl := Unassigned;
  for i := 1 to wdTbls.Count do
    if wdRng.InRange(wdTbls.Item(i).Range) then begin
      wdTbl := wdTbls.Item(i);
      Break;
    end;
  if VarIsClear(wdTbl) then begin
    MessageBox(0, 'Закладка с именем "' + BmName + '" не принадлежит таблице.'
      + ' Действие отменено.', 'Внимание!', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;

  //Ищем в таблице первую пустую строку.
  wdRow := Unassigned;
  for i := 1 to wdTbl.Rows.Count do begin
    //В конце текста ячейки всегда имеются два специальных символа, обозначающих
    //границу ячейки. Поэтому, если длина текста ячейки равна 2, то эта ячейка пустая.
    j := 1;
    Cnt := wdTbl.Rows.Item(i).Cells.Count;
    while
      (j <= Cnt)
      and (Length(wdTbl.Rows.Item(i).Cells.Item(j).Range.Text) = 2)
    do Inc(j);
    //Если j > Cnt, значит, все ячейки в строке пустые (т. е., мы нашли пустую строку).
    if j > Cnt then begin
      wdRow := wdTbl.Rows.Item(i);
      Break;
    end;
  end;

   iCols := StringGrid1.ColCount;
         iRows := StringGrid1.RowCount;

  //Если пустых строк нет, то добавляем в таблицу новую строку.
  if VarIsClear(wdRow) then wdRow := wdTbl.Rows.Add;

  //Проверка формата строки.
  if wdRow.Cells.Count < 6 then begin
    MessageBox(0, 'В целевой строке таблицы недостаточно ячеек. Действие отменено.',
      'Внимание!', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;

  //Записываем в строку данные из программы.
 { wdRow.Cells.Item(1).Range.Text := Edit1.Text;
  wdRow.Cells.Item(2).Range.Text := Edit2.Text;
  wdRow.Cells.Item(3).Range.Text := Edit3.Text;
  wdRow.Cells.Item(4).Range.Text := Edit4.Text;
  wdRow.Cells.Item(5).Range.Text := Edit5.Text;
  wdRow.Cells.Item(6).Range.Text := Edit6.Text;

                                        }


     for iGridRows := 1 to iRows do
     for jGridCols := 1 to iCols do
     wdTbl.Cell(iGridRows, jGridCols).Range.Text :=
       StringGrid1.Cells[jGridCols - 1, iGridRows - 1];


  //Теперь, в верхней левой ячейке таблицы вновь определяем закладку.
  wdBms.Add(BmName, wdTbl.Rows.Item(1).Cells.Item(1).Range);

  //Если требуется, сохраняем документ.
  //wdDoc.Save;
  //Если требуется, закрываем MS Word.
  //wdApp.Quit;
end;

end.

Последний раз редактировалось undead92; 14.11.2013 в 15:07.
undead92 вне форума Ответить с цитированием
Старый 14.11.2013, 16:08   #13
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

1) Я Вам писал как добавить строки,а не заменять.
3) Сохраняйте не открытый документ, а в другой файл и ничего не будет заменяться.
FaTaL вне форума Ответить с цитированием
Старый 14.11.2013, 16:22   #14
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

надо не документ редактировать, а на основании шаблона делать
eval вне форума Ответить с цитированием
Старый 14.11.2013, 16:36   #15
undead92
Пользователь
 
Регистрация: 26.12.2009
Сообщений: 95
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
1) Я Вам писал как добавить строки,а не заменять.
3) Сохраняйте не открытый документ, а в другой файл и ничего не будет заменяться.
вы читали код? if VarIsClear(wdRow) then wdRow := wdTbl.Rows.Add;

строки если и добавляются, то затирают всю остальную таблицу



3) пользователь может не нажать сохранить как
undead92 вне форума Ответить с цитированием
Старый 14.11.2013, 16:37   #16
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Посмотрел ваш Obrazec.doc и очумел. У Вас весь шаблон как единная таблица! Зачем так делать? Разбейте свой шаблон на несколько таблиц и будет Вам счастье.
Там Вам всего то надо 2 таблицы.
FaTaL вне форума Ответить с цитированием
Старый 14.11.2013, 16:39   #17
undead92
Пользователь
 
Регистрация: 26.12.2009
Сообщений: 95
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Посмотрел ваш Obrazec.doc и очумел. У Вас весь шаблон как единная таблица! Зачем так делать? Разбейте свой шаблон на несколько таблиц и будет Вам счастье.
Там Вам всего то надо 2 таблицы.
давно уже поменял, все равно фигня какаято, чуть чуть добить эту прогу и все, можно нормально клепать документы
undead92 вне форума Ответить с цитированием
Старый 14.11.2013, 16:40   #18
undead92
Пользователь
 
Регистрация: 26.12.2009
Сообщений: 95
По умолчанию

вот, прикрепил обновленный,сделал 1 пустую строку, все равно по ее заполнению, заменяются старые
Вложения
Тип файла: doc schet.doc (117.0 Кб, 9 просмотров)
undead92 вне форума Ответить с цитированием
Старый 18.11.2013, 11:03   #19
undead92
Пользователь
 
Регистрация: 26.12.2009
Сообщений: 95
По умолчанию

проблема в том, что если заранее добавить 2 строки в таблицу, и в гриде заполнить только 2 то все нормально вставляется, низ остается, правда шапка стирается.
undead92 вне форума Ответить с цитированием
Старый 18.11.2013, 11:51   #20
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Добавляй после нужной строки, а не с начала таблицы.
FaTaL вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена закладки в тексте документа WORD на мой текст Tiolic Общие вопросы Delphi 4 23.12.2017 15:18
таблица в Word бобок Помощь студентам 3 22.07.2011 12:28
перенести документ Word (таблица) в MS Excel c сохранением форматирования или обеспечить всплывающие подсказки в Word Serge_Bliznykov Microsoft Office Word 6 11.07.2011 11:02
Шаблон word и закладки hackPNZ Microsoft Office Word 11 26.03.2010 09:48
Таблица в WORD xakkkkker Общие вопросы Delphi 4 15.08.2009 21:02