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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.04.2011, 09:11
Максон Максон вне форума
Прохожий
 
Регистрация: 10.02.2011
Сообщения: 19
Репутация: 10
По умолчанию Экспорт данных из Stringgrid в таблицу шаблона word

Здраствуйте.
У меня возникла такая проблема:
Нужно экспортировать данные из Stringgrid в заданную таблицу шаблона word.
Код:
procedure TForm2.DocbtnClick(Sender: TObject);
var
W, T, N: Variant;
iRows,Cols, i:Integer;

begin
W :=  CreateOleObject('Word.Application');

W.Visible:=True;
W.DisplayAlerts:=True;

try
 W.Documents.Open(GetCurrentDir +'\mmm.dot',EmptyParam,EmptyParam,EmptyParam,
                             EmptyParam,EmptyParam,EmptyParam,
                             EmptyParam,EmptyParam,EmptyParam);

 //  выбор талицы
 T:=W.ActiveDocument.Tables.Item(1);
 // обозначение номера строки в таблице 1
//Данные будут вноситься с 4 строки
 N:=W.ActiveDocument.Tables.Item(1).Rows.Item(4);
 // запуск цикла строк  от 1 до последнего кол-ва в стринггриде
 for i:=1 to strngrd1.RowCount-1 do
 // добавление строк
 T.Rows.Add(N);

 //запуск цикла по строкам и столбцам
 for   iRows:=1 to strngrd1.RowCount-1 do
 for   Cols:=1 to strngrd1.ColCount-1 do

 // нумерация строчек
 T.Cell(iRows+3 ,1).Range.Text:= IntToStr(iRows ) + '.';
 

//ВОТ ДО ЭТОГО МОМЕНТА ВСЕ РАБОТАЕТ

//ЭТОТ КОД ТОЖЕ РАБОЧИЙ ТОЛЬКО ДОБАВЛЯЕТСЯ 1 СТРОКА
 {T.Cell(4,2).Range.Text:= strngrd1.Cells[0,1]+#13+ strngrd1.Cells[1,1]+#13+ strngrd1.Cells[2,1];

 T.Cell(4,3).Range.Text:= strngrd1.Cells[3,1];
 T.Cell(4,4).Range.Text:= strngrd1.Cells[4,1];
 T.Cell(4,5).Range.Text:= strngrd1.Cells[5,1];
 T.Cell(4,6).Range.Text:= strngrd1.Cells[6,1];
 T.Cell(4,7).Range.Text:= strngrd1.Cells[7,1]+','+#13+ strngrd1.Cells[8,1]+','+#13+ strngrd1.Cells[9,1];
 T.Cell(4,8).Range.Text:= strngrd1.Cells[10,1];
 T.Cell(4,9).Range.Text:= strngrd1.Cells[11,1]+#13+ strngrd1.Cells[12,1];
 T.Cell(4,10).Range.Text:= strngrd1.Cells[13,1];
 T.Cell(4,12).Range.Text:= strngrd1.Cells[14,1];
 T.Cell(4,13).Range.Text:= strngrd1.Cells[15,1];
 T.Cell(4,14).Range.Text:= strngrd1.Cells[16,1];
 T.Cell(4,15).Range.Text:= strngrd1.Cells[17,1];}

finally
end;
end;

Вопрос в том как добавлять все строки из Stringgrid, ведь их количество определяется как strngrd1.RowCount.

Все перерыл, ведь запускается цикл от 1
for iRows:=1 to strngrd1.RowCount-1 do
например, делал вот так


Код:
T.Cell(iRows+3,3).Range.Text:= strngrd1.Cells[3,iRows-1];

//Тут ошибка

при компиляции выдает такое ссобщение
[Warning] Elector.pas(367): FOR-Loop variable 'iRows' may be undefined after loop

Наведите на правильную мыслю
Ответить с цитированием
  #2  
Старый 14.04.2011, 09:26
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Что то я вопроса не пойму.
если после нумерации строк вы вставляете свой код:
Код:
T.Cell(iRows+3,3).Range.Text:= strngrd1.Cells[3,iRows-1];
и он выдает эту ошибку то вы забыли begin end
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #3  
Старый 14.04.2011, 09:32
Максон Максон вне форума
Прохожий
 
Регистрация: 10.02.2011
Сообщения: 19
Репутация: 10
По умолчанию

Спасибо огромное за совет.
Точно работает!!!
Ответить с цитированием
  #4  
Старый 14.04.2011, 13:53
Максон Максон вне форума
Прохожий
 
Регистрация: 10.02.2011
Сообщения: 19
Репутация: 10
По умолчанию из Stringgrid в разные таблицы Word

Столкнулся еще с одной проблемой
На форме есть Radiogroup пользователь вносит данные в edit-ы, выбирает из Radiogroup нужное событие "есть" или "нет" нажимает на кнопку и в Stringgrid вносится запись, далее после внесения всех данных, нажимает на кнопку "распечатать" и данные из Stringgrid экспортируются в шаблон таблицы word.
Теперь вопрос как сделать так чтобы данные из Stringgrid-а отображались в 2-х таблицах, те у кого есть событие "есть" отображались в таблице 1, а те у кого событие - "нет" в таблице 2.



Код:
procedure TForm2.DocbtnClick(Sender: TObject);
var
W, T, N: Variant;
iRows :Integer;
i:Integer;
// индекс строки
//x:string;
//s, r:Integer;
begin


W :=  CreateOleObject('Word.Application');

W.Visible:=True;
W.DisplayAlerts:=True;

try
  W.Documents.Open(GetCurrentDir +'\mmm.dot',EmptyParam,EmptyParam,EmptyParam,
                              EmptyParam,EmptyParam,EmptyParam,
                              EmptyParam,EmptyParam,EmptyParam);

     //  В К Л Ю Ч Е Н Н Ы Е    В    С П И С О К
//данные вносятся в ячейку Stringgrid, но в таблице не отображаются
  if strngrd1.Cells[18, strngrd1.RowCount-1]='есть' then
  begin // 

  //  обозначение  таблицы ее номера
  T:=W.ActiveDocument.Tables.Item(1);
  // обозначение номера строки в определенной таблице
  N:=W.ActiveDocument.Tables.Item(1).Rows.Item(4);
  // запуск цикла строк  от 1 до последнего кол-ва в стринггриде
  for i:=1 to strngrd1.RowCount-1 do
  // добавление строк
   T.Rows.Add(N);
  // добавление строчек


  //запуск цикла по строкам и столбцам
  for   iRows:=1 to strngrd1.RowCount-1 do
  //for   Cols:=1 to strngrd1.ColCount-1 do
  begin
  // нумерация строчек
  T.Cell(iRows+3 ,1).Range.Text:= IntToStr(iRows ) + '.';

  

  T.Cell(iRows+3,2).Range.Text:= strngrd1.Cells[0,iRows+0]+#13+ strngrd1.Cells[1,iRows+0]+#13+ strngrd1.Cells[2,iRows+0];

  ////////////
  T.Cell(iRows+3,3).Range.Text:= strngrd1.Cells[3,iRows+0];
  T.Cell(iRows+3,4).Range.Text:= strngrd1.Cells[4,iRows+0];
  T.Cell(iRows+3,5).Range.Text:= strngrd1.Cells[5,iRows+0];
  T.Cell(iRows+3,6).Range.Text:= strngrd1.Cells[6,iRows+0];
  T.Cell(iRows+3,7).Range.Text:= strngrd1.Cells[7,iRows+0]+','+#13+ strngrd1.Cells[8,iRows+0]+','+#13+ strngrd1.Cells[9,iRows+0];
  T.Cell(iRows+3,8).Range.Text:= strngrd1.Cells[10,iRows+0];
  T.Cell(iRows+3,9).Range.Text:= strngrd1.Cells[11,iRows+0]+#13+ strngrd1.Cells[12,iRows+0];
  T.Cell(iRows+3,10).Range.Text:= strngrd1.Cells[13,iRows+0];
  T.Cell(iRows+3,12).Range.Text:= strngrd1.Cells[14,iRows+0];
  T.Cell(iRows+3,13).Range.Text:= strngrd1.Cells[15,iRows+0];
  T.Cell(iRows+3,14).Range.Text:= strngrd1.Cells[16,iRows+0];
  T.Cell(iRows+3,15).Range.Text:= strngrd1.Cells[17,iRows+0];

  end;
  end;



  //  И С К Л Ю Ч Е Н И Е
  if strngrd1.Cells[18, strngrd1.RowCount-1]='нет' then
  begin // 

  //  обозначение  таблицы ее номера
  T:=W.ActiveDocument.Tables.Item(2);
  // обозначение номера строки в определенной таблице
  N:=W.ActiveDocument.Tables.Item(2).Rows.Item(4);
  // запуск цикла строк  от 1 до последнего кол-ва в стринггриде
  for i:=1 to strngrd1.RowCount-1 do
  // добавление строк
   T.Rows.Add(N);
  // добавление строчек


  //запуск цикла по строкам и столбцам
  for   iRows:=1 to strngrd1.RowCount-1 do
  //for   Cols:=1 to strngrd1.ColCount-1 do
  begin
  // нумерация строчек
  T.Cell(iRows+3 ,1).Range.Text:= IntToStr(iRows ) + '.';

  

  T.Cell(iRows+3,2).Range.Text:= strngrd1.Cells[0,iRows+0]+#13+ strngrd1.Cells[1,iRows+0]+#13+ strngrd1.Cells[2,iRows+0];

  ////////////
  T.Cell(iRows+3,3).Range.Text:= strngrd1.Cells[3,iRows+0];
  T.Cell(iRows+3,4).Range.Text:= strngrd1.Cells[4,iRows+0];
  T.Cell(iRows+3,5).Range.Text:= strngrd1.Cells[5,iRows+0];
  T.Cell(iRows+3,6).Range.Text:= strngrd1.Cells[6,iRows+0];
  T.Cell(iRows+3,7).Range.Text:= strngrd1.Cells[7,iRows+0]+','+#13+ strngrd1.Cells[8,iRows+0]+','+#13+ strngrd1.Cells[9,iRows+0];
  T.Cell(iRows+3,8).Range.Text:= strngrd1.Cells[10,iRows+0];
  T.Cell(iRows+3,9).Range.Text:= strngrd1.Cells[11,iRows+0]+#13+ strngrd1.Cells[12,iRows+0];
  T.Cell(iRows+3,10).Range.Text:= strngrd1.Cells[13,iRows+0];
  T.Cell(iRows+3,12).Range.Text:= strngrd1.Cells[14,iRows+0];
  T.Cell(iRows+3,13).Range.Text:= strngrd1.Cells[15,iRows+0];
  T.Cell(iRows+3,14).Range.Text:= strngrd1.Cells[16,iRows+0];
  T.Cell(iRows+3,15).Range.Text:= strngrd1.Cells[17,iRows+0];

  end;
  end;
 finally
end;
end;
Код рабочий, единственное что не могу сообразить почему он добавляет в таблицу по последней записи, т.е. если последняя запись с событием "есть", то он все данные из Stringgrid перегоняет в первую таблицу и наоборот. Видимо все дело в strngrd1.RowCount-1?
Посоветуйте пожалуйста как быть в данной ситуации?

Последний раз редактировалось Максон, 14.04.2011 в 13:54. Причина: нет заголовка
Ответить с цитированием
  #5  
Старый 14.04.2011, 14:01
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Все дело в том что вы опять с циклами запутались

Эту строчку
Код:
if strngrd1.Cells[18, strngrd1.RowCount-1]='есть' then
begin

надо
примерно тут:
Код:
//запуск цикла по строкам и столбцам
  for   iRows:=1 to strngrd1.RowCount-1 do
  //for   Cols:=1 to strngrd1.ColCount-1 do
  begin
  // нумерация строчек
if strngrd1.Cells[18, strngrd1.RowCount-1]='есть' then
begin
  T.Cell(iRows+3 ,1).Range.Text:= IntToStr(iRows ) + '.';
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #6  
Старый 14.04.2011, 14:17
Максон Максон вне форума
Прохожий
 
Регистрация: 10.02.2011
Сообщения: 19
Репутация: 10
По умолчанию

Попробывал так сделать, но к сожалению он в таблице 1 добавляет пустые строки, а таблице 2 добавляет и строки и данные
Ответить с цитированием
  #7  
Старый 14.04.2011, 14:21
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

if strngrd1.Cells[18, iRows-1]='есть' then

проверьте свой алгоритм.
по идее вы должны проходя по строкам проверять есть или нет и если есть то тогда добавлять строку в таблицу 1 если нет то добавлять в таблицу 2
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #8  
Старый 15.04.2011, 09:30
Максон Максон вне форума
Прохожий
 
Регистрация: 10.02.2011
Сообщения: 19
Репутация: 10
По умолчанию

А как это сделать?
Помогите пожалуйста
Ответить с цитированием
  #9  
Старый 18.04.2011, 14:38
Максон Максон вне форума
Прохожий
 
Регистрация: 10.02.2011
Сообщения: 19
Репутация: 10
По умолчанию

if strngrd1.Cells[18, iRows]='есть' then

Сделал таким образом. Получается чепуха какая-то Вводим первые 2 строчки с событием "есть" и еще 2 строчки с событием "нет". Он в таблицу 1 добавляет 4 строки нумерует их 1,2. Во таблице 2 также добавляется 4 строки и нумеруется в конце 3,4.
А надо чтобы
в таб.1 добавились 2 строчки и номера 1,2.
В таб.2 добавились 2 строчки и номера 1,2.
И не знаю как так сделать, подскажите пожалуйста
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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