![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
StringGrid и таблица Word
Максон © (2011-04-11 12:19:00)Уважаемые форумчане, подскажите или наведите на мысль
Каким образом данные из StringGrid можно перенести в готовую таблицу шаблона Word.
OW (2011-04-29 08:42:00) [1]
> q:=i+7;//переменная указывающая количество строк в таблице1
> с 5 строки
т.е. q = 7
> T.Cell(j+q ,1).Range.Text:= IntToStr(j) + '.';
и тут всегда q = 7, т.к. нигде не изменяется
проще всего разбить на 2 цикла
for iRows:=1 to strngrd1.RowCount-1 do
begin
if strngrd1.Cells[19, iRows]='есть' then
begin
i:=i+1;
T.Rows.Add(N);
T.Cell(i+4 ,1).Range.Text:= IntToStr(i) + '.';
end;
end;
for iRows:=1 to strngrd1.RowCount-1 do
begin
if strngrd1.Cells[19, iRows]='нет' then
begin
j:=j+1;
T.Rows.Add(M);
// теперь i - колво записей первой таблицы
// поэтому можно использовать для адресации
T.Cell(j + i + (ЕЩЕ_КАКАЯ_КОНСТАНТА_число_фиксированных_строк),1).Range.Text:= IntToStr(j) + '.';
end;
end;
если правильно понял
Максон (2011-04-29 08:19:00) [2]Столкнулся еще с одной проблемой:
Колонки таблиц стали нессиметричными после заполнения. И пришлось все заново переделывать.
Таблица должна быть единой:(
таблица1
В 4-х первых строках записанны данные.
Добавление строк начинается с 5-ой строки из Stringgrid с событием "есть".
Потом после этих строк 1-а объединенная строка с названием и начиная со следующей должно происходить добавление строк из Stringgrid с событием "нет".
Шаблон таблицы выглядит следующим образом.
1,2,3,4 строки таблицы шаблона - фиксированная запись
5 - добавление строк с событием "есть"
6 - фиксированная запись
7- добавление строк с событием "нет"
procedure TForm2.DocbtnClick(Sender: TObject);
var
W, T,M, N: Variant;
iRows :Integer;
i, j,q: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);
// обозначение номера строки в определенной таблице
N:=W.ActiveDocument.Tables.Item(1).Rows.Item(5);
i:=0;
j:=0;
q:=i+7;//переменная указывающая количество строк в таблице1 с 5 строки
// обозначение номера строки в определенной таблице }
M:=W.ActiveDocument.Tables.Item(1).Rows.Item(q);
//запуск цикла по строкам
for iRows:=1 to strngrd1.RowCount-1 do
begin
if strngrd1.Cells[19, iRows]='есть' then
begin
i:=i+1;
T.Rows.Add(N);
T.Cell(i+4 ,1).Range.Text:= IntToStr(i) + '.';
end;
//Здесь все работает, нумерация и добавление строк происходит нормально
if strngrd1.Cells[19, iRows]='нет' then
begin
j:=j+1;
T.Rows.Add(M);
T.Cell (j+q ,1).Range.Text:= IntToStr(j) + '.';
//а здесь проблема
end;
end;
finally
end;
end;
OW (2011-04-27 09:10:00) [3]
> Вроде бы работает, но все равно что-то не так
что не так?
все должно быть так .
Максон (2011-04-27 07:07:00) [4]Немного разобрался получился код
procedure TForm2.DocbtnClick(Sender: TObject);
var
W, T,L,M, N: Variant;
iRows :Integer;
i, j: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);
// обозначение номера строки в определенной таблице
N:=W.ActiveDocument.Tables.Item(1).Rows.Item(4);
L:=W.ActiveDocument.Tables.Item(2);
// обозначение номера строки в определенной таблице
M:=W.ActiveDocument.Tables.Item(2).Rows.Item(4);
//объявление переменных для таблицы1 и таблицы2
i:=0;
j:=0;
//запуск цикла по строкам
for iRows:=1 to strngrd1.RowCount-1 do
begin
//если значение "есть" то делаем
if strngrd1.Cells[19, iRows]='есть' then
begin
i:=i+1;
T.Rows.Add(N);
T.Cell(i+3 ,1).Range.Text:= IntToStr(i) + '.';
end;
if strngrd1.Cells[19, iRows]='нет' then
begin
j:=j+1;
L.Rows.Add(M);
L.Cell(j+3 ,1).Range.Text:= IntToStr(j) + '.';
end;
end;
finally
end;
end;
Вроде бы работает, но все равно что-то не так
Максон (2011-04-26 17:36:00) [5]Тут два типа счетчика
1. iRows:=1 to strngrd1.RowCount-1
2. for i:=1 to T.Rows.Count-1
А как сделать, чтобы нумеровались строки 1,2,3,4, а в конце не появлялоась 7.
OW (2011-04-26 15:15:00) [6]думай
Максон (2011-04-26 14:38:00) [7]сделал следующим образом
procedure TForm2.DocbtnClick(Sender: TObject);
var
W, T,L,M, N: Variant;
iRows :Integer;
i, j: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);
// обозначение номера строки в определенной таблице
N:=W.ActiveDocument.Tables.Item(1).Rows.Item(4);
L:=W.ActiveDocument.Tables.Item(2);
// обозначение номера строки в определенной таблице
M:=W.ActiveDocument.Tables.Item(2).Rows.Item(4);
//запуск цикла по строкам
for iRows:=1 to strngrd1.RowCount-1 do
begin
if strngrd1.Cells[19, iRows]='есть' then
begin
T.Rows.Add(N);
//объявленная переменная счетчика таблицы1
for i:=1 to T.Rows.Count-1do
begin
T.Cell(i+3 ,1).Range.Text:= IntToStr(i) + '.';
end;
end;
if strngrd1.Cells[19, iRows]='нет' then
begin
L.Rows.Add(M);
//переменная для таблицы2
for j:=1 to L.Rows.Count-1do
begin
L.Cell(j+3 ,1).Range.Text:= IntToStr(j) + '.';
end;
end;
end;
finally
end;
end;
Проблема в том, что строки добавляются и нумеруются, вот только в последней строчке появляется цифра количества строк. Например, нумеруются строки 1,2,3,4, а в конце появляется 7.
В чем причина?
OW (2011-04-26 12:43:00) [8]
> с нумерацией как быть
завести две переменные, куда писать колво строк в соотв. таблице.
если 19 колонка строки = есть, то
начать
Добавить строку в Т1
Увеличить переменную кол-ва строк T1 на 1
Записать в таблицу не общий счетчик, а ее
...
если 19 колонка строки = нет, то
начать
Добавить строку в Т2
аналогично с другой переменной
Максон (2011-04-26 12:37:00) [9]Строки добавляются.
А вот с нумерацией как быть почему-то для всех строчек выполняется один цикл T.Cell(iRows+3 ,1).Range.Text:= IntToStr(iRows) + '.';
OW (2011-04-26 12:19:00) [10]из кода:
по строкам грида
начать
Добавить строку в Т1 --это вот
Добавить строку в Т2 --и это вот
перенести в раздел, где
если 19 колонка строки = есть, то
начать
Добавить строку в Т1
...
если 19 колонка строки = нет, то
начать
Добавить строку в Т2
...
Максон (2011-04-26 12:05:00) [11]да тут не обязательно, они добавляются в Stringgrid из Combobox-а
brother (2011-04-26 12:03:00) [12]на заглавные буквы ты обратил внимание?
Максон (2011-04-26 11:58:00) [13]Если будет стоять "есть", то все строки strngrd1.Cells[19, iRows] должны отображаться в таблице1, а если "нет" , то в таблице2.
brother (2011-04-26 11:48:00) [14]> if strngrd1.Cells[19, iRows]='есть' then
> if strngrd1.Cells[19, iRows]='нет' then
какое будет поведение если там бкдет стоять, например: Есть/ Нет?
Максон (2011-04-26 11:44:00) [15]Здраствуйте, снова мучаюсь со Stringgrid-ом
При вводе в Stringgrid данных , например, 2 строки с событием "есть" и 2 строки с событием "нет" в 2-х таблицах ворд добавляются по 4 строки и нумерация идет дальше, в таблице1 нумерация 1,2 , в таблице 2 нумерация 3,4.
Подскажите, пожалуйста, что здесь неверно?
procedure TForm2.DocbtnClick(Sender: TObject);
var
W, T,L,M, N: Variant;
iRows :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);
// обозначение номера строки в определенной таблице
N:=W.ActiveDocument.Tables.Item(1).Rows.Item(4);
L:=W.ActiveDocument.Tables.Item(2);
// обозначение номера строки в определенной таблице
M:=W.ActiveDocument.Tables.Item(2).Rows.Item(4);
//запуск цикла по строкам, т.к. количество столбцов фиксировано
for iRows:=1 to strngrd1.RowCount-1 do
begin
T.Rows.Add(N);//добавление строк в таблице 1
L.Rows.Add(M);//добавление строк в таблице 2
//если 19 колонка и строка = "есть" тогда
if strngrd1.Cells[19, iRows]='есть' then
begin
//нумерация строкв таблице 1
T.Cell(iRows+3 ,1).Range.Text:= IntToStr(iRows) + '.';
//заполнение таблицы данными
//.....
end;
//если 19 колонка и строка = "нет" тогда
if strngrd1.Cells[19, iRows]='нет' then
begin
//нумерация строк в таблице 2
L.Cell(iRows+3 ,1).Range.Text:= IntToStr(iRows) + '.';
//заполнение таблицы данными
end;
end;
finally
end;
end;
OW (2011-04-15 12:01:00) [16]
> Максон ©
все что надо
доступ к ячейке там
W := CreateOleObject('Word.Application');
try
W.Documents.Open('C:\1.doc',EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam);
T := W.ActiveDocument.Tables.Item(1);
T.Cell(1, 1).Range.Text := 'qwer';
и
доступ к ячейке тут
for i := 0 to sg.rowcount - 1 do
for j := 0 to sg.colcount - 1 do
Showmessage(sg.cells[i,j]);
остальное - логика. Элементарная.
Денис и Ваш покорный, и любой другой программист, могли бы 150 раз написать все это, но это нужно сделать Вам самому. Если Вам, конечно, это надо - стать программистом
А если нет - какие проблемы.. Если я не могу трубу отлить/выкатать, я ее покапаю в магазине, готовую и красивую.
Dennis I. Komarov (2011-04-15 10:21:00) [17]Ну так делай выводы...
З.Ы.
http://lurkmore.ru/%D7%F3%EA%F7%E0_%ED%E5_%F7%E8%F2%E0%F2%E5%EB%FC
Максон (2011-04-15 09:57:00) [18]
> З.Ы. Хотя о чем это я. Чукча писатель...
Денис я всегда за здоровую критику, но вот оскорблять не надо.
Основ delphi не знаю, но очень хочу научится
Dennis I. Komarov (2011-04-15 09:52:00) [19]Не надо хранить данные в визуальных компонентах, создай хотя бы массив записей и храни (экспортируй) там.
З.Ы. Хотя о чем это я. Чукча писатель...
Максон (2011-04-15 09:37:00) [20]Все равно не получается:(
if strngrd1.Cells[18, strngrd1.RowCount-1]='нет' then
Добавляются данные только в ту таблицу по событию последней строчки.
А как сделать чтоб все строки с событием "есть" отражались в таблице1,
все строки с событием "нет" отражались в таблице 2.