![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
StringGrid и таблица Word
Максон © (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 - никак
Ох уж эти сказочники...