Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

StringGrid и таблица Word


Страницы:   1 2 3

Максон ©   (2011-04-11 12:19:00) 

Уважаемые форумчане, подскажите или наведите на мысль
Каким образом  данные из StringGrid можно перенести в готовую таблицу шаблона Word.


OW   (2011-04-14 14:57:00) [21]

Q:почему он добавляет в таблицу по последней записи
A:

>  if strngrd1.Cells[18, strngrd1.RowCount-1]='нет' then
>  begin //

перевод такой
если последняя строка, 18 столбец = 'нет'
то, не даем расслабляться компу дальше..


Dennis I. Komarov   (2011-04-14 14:39:00) [22]


> Код рабочий, единственное что ...

Ужас, а не код, даже смотреть противно...

> Посоветуйте пожалуйста как быть в данной ситуации?

Выброси это чудо и переводи [25]


Максон   (2011-04-14 13:57:00) [23]

Столкнулся еще с одной проблемой
На форме есть 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?
Посоветуйте пожалуйста как быть в данной ситуации?


Dennis I. Komarov   (2011-04-14 09:56:00) [24]

1. Не обязательно.
2. Плохо, а чего с ним разбираться?


Максон   (2011-04-14 09:39:00) [25]

Спасибо, Денис.
Заработало.  begin  и end поставил все пошло.
У меня теперь другой вопрос:
1. цикл по столбцам  обязательно делать. у меня количество столбцов фиксированное - их 20.
2. не могу разобраться с индексом строки

Ребята, вы уж меня извините за тупые вопросы я  чуть больше полгода на delphi подсел. Тяму не хватает


Dennis I. Komarov   (2011-04-14 09:34:00) [26]


> OW ©   (14.04.11 09:26) [26]

Это ему не поможет... код сам писать будет ;)


OW   (2011-04-14 09:26:00) [27]


> Dennis I. Komarov ©   (14.04.11 09:02) [25]
>
>


да он просто издевается, имхо.


Dennis I. Komarov   (2011-04-14 09:02:00) [28]


> Ребята посоветуйте пожалуйста или наведите на мысль

...
прицыпились к MSWord со всеми приблудами;
иницилизировали индекс_строки
пока не вышли за предел строк в SG1 делать:
начало
Таблице в Word добавить строку;
Таблица.ячейка(X, последняя):=SG1.Sells[Y, индекс_строки];
(аналогично поступить) с другими
Inc(индекс_строки);
конец;
Корректно отцепились;


Все. Переводи.

> при компиляции  выдает ошибку

не вижу...


Максон   (2011-04-14 08:30:00) [29]


> например, делал вот так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


Максон   (2011-04-14 07:09:00) [30]

Почитав умные книжки у меня вот что получилось.
Объясните пожалуйста, как добавлять все строки.

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];
//Тут  ошибка


Ребята посоветуйте пожалуйста или наведите на мысль


Dennis I. Komarov   (2011-04-13 14:52:00) [31]


> DTMail   (13.04.11 07:17) [21]

А зачем?
Для этого буфер обмена вроде бы есть...

Хотя, вроде можно...


DTMail   (2011-04-13 07:17:00) [32]

А как организовать аналогичный экспорт данных из StringGrid в открытый документ Word в таблицу в документе, начиная с ячейки, в котоую установлен курсор?


Dennis I. Komarov   (2011-04-12 14:40:00) [33]

У тебя ошибка в программе, ищи...


Smile   (2011-04-12 14:20:00) [34]

Странная, какая-то ветка.
Похоже, что автор ничего читать и искать не желает
:(
Мог бы зайти сюда:
http://articles.org.ru/cn/?c=92
или уж сразу сюда:
Как экспортировать StringGrid в MS Word таблицу http://www.kansoftware.ru/?tid=4061


Максон   (2011-04-12 13:49:00) [35]

извиняюсь вот как должно быть


var
i:integer;
T:variant;

begin
//выбираю таблицу
T := WA.ActiveDocument.Tables.Item(3);

//запускаю цикл
      for i := 1 to strngrd1.RowCount-1 do

         begin
        // Добавляем новую строку
        T.rows.add(EmptyParam);
//нумерация строк
        T.Cell(1, 1).Range.Text := IntToStr(i - 1) + '.';
//ввод данных из Stringgrid
        T.Cell(1, 2).Range.Text := strngrd1.Cells[0, i - 1];
        T.Cell(1, 3).Range.Text := strngrd1.Cells[1, i - 1];
        T.Cell(1, 4).Range.Text := strngrd1.Cells[2, i - 1];


Германн   (2011-04-12 13:43:00) [36]


> //запускаю цикл

Счетчик цикла i. А в теле цикла какой-то непонятный RowPoint.


Максон   (2011-04-12 13:30:00) [37]


> sg := stringgrid1;for i := 0 to sg.rowcount - 1 do for j
> := 0 to sg.colcount - 1 do  Showmessage(sg.cells[i,j]);


у меня вот что вышло.
И добавляются только последние строки


var
i:integer;
T:variant;

begin
//выбираю таблицу
T := WA.ActiveDocument.Tables.Item(3);

//запускаю цикл
       for i := 1 to strngrd1.RowCount-1 do

          begin
         // Добавляем новую строку
         T.rows.add(EmptyParam);
//нумерация строк
         T.Cell(1, 1).Range.Text := IntToStr(RowPoint - 1) + '.';
//ввод данных из Stringgrid
         T.Cell(1, 2).Range.Text := strngrd1.Cells[0, RowPoint - 1];
         T.Cell(1, 3).Range.Text := strngrd1.Cells[1, RowPoint - 1];
         T.Cell(1, 4).Range.Text := strngrd1.Cells[2, RowPoint - 1];


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


OW   (2011-04-12 08:38:00) [38]

sg := stringgrid1;

for i := 0 to sg.rowcount - 1 do
for j := 0 to sg.colcount - 1 do
 Showmessage(sg.cells[i,j]);


Максон   (2011-04-11 18:12:00) [39]

Все равно не получается.


var
RowCount:integer;
begin
....

T.Cell(1, 1).Range.Text:=StringGrid.Cells[1,RowCount-1];


Dennis I. Komarov   (2011-04-11 17:40:00) [40]


> Да есть, так получается.А вот из Stringrid - никак

Ох уж эти сказочники...


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо