Текущий архив: 2011.08.07;
Скачать: CL | DM;
Вниз
StringGrid и таблица Word Найти похожие ветки
← →
Максон © (2011-04-11 12:19) [0]Уважаемые форумчане, подскажите или наведите на мысль
Каким образом данные из StringGrid можно перенести в готовую таблицу шаблона Word.
← →
clickmaker © (2011-04-11 12:37) [1]н-р, с помощью TWordApplication
← →
Dennis I. Komarov © (2011-04-11 12:42) [2]и вот как же на нее наводить, прикажите?
цикл по всем строкам
цикл по всем столбцам
в ячейку таблицы в word вставить соотверствующее содержимое из StringGrid
← →
OW © (2011-04-11 12:49) [3]var
W, T: Variant;
begin
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";
← →
Максон © (2011-04-11 12:49) [4]Это код почему-то не работает
procedure TForm2.DocbtnClick(Sender: TObject);
var RowPoint: Integer;
begin
if strngrd1.RowCount > 1 then
begin
if FileExists(GetCurrentDir + "\mmm.dot") then
begin
//
WA := CreateOLEObject("Word.Application");
WA.Documents.Add(GetCurrentDir + "\mmm.dot", false, 0);
WA.Options.CheckSpellingAsYouType := false;
WA.Options.CheckGrammarAsYouType := false;
//
// на всю талицу сделал закладку "Таблица"
WA.ActiveDocument.Bookmarks.Item("ТАБЛИЦА").Select;
for RowPoint := 2 to strngrd1.RowCount do
begin
//
// Добавляем новую строку
WA.Selection.Tables.Item(1).Rows.Add(EmptyParam);
// Заполняем строку
WA.Selection.Tables.Item(1).Cell( 2, 1).Range.Text := IntToStr(RowPoint - 1) + "."; // 1-ый столбец
WA.Selection.Tables.Item(1).Cell( 2, 2).Range.Text := strngrd1.Cells[0, RowPoint - 1]; // 2-ой столбец
WA.Selection.Tables.Item(1).Cell( 2, 3).Range.Text := strngrd1.Cells[1, RowPoint - 1]; // 3-тий столбец
WA.Selection.Tables.Item(1).Cell( 2, 4).Range.Text := strngrd1.Cells[2, RowPoint - 1]; // 4-тый столбец
WA.Selection.Tables.Item(1).Cell( 2, 5).Range.Text := strngrd1.Cells[5, RowPoint - 1]; // 6-той столбец
WA.Selection.Tables.Item(1).Cell( 2, 6).Range.Text := strngrd1.Cells[6, RowPoint - 1]; // 7-мой столбец
WA.Selection.Tables.Item(1).Cell( 2, 7).Range.Text := strngrd1.Cells[7, RowPoint - 1]; // 8-мой столбец
end;
end;
end;
end;
← →
Dennis I. Komarov © (2011-04-11 12:59) [5]Кофе или ромашки?
← →
Максон © (2011-04-11 13:01) [6]Ребята, ну я правда не знаю как сделать :(
← →
Максон © (2011-04-11 13:37) [7]Как посоветовали переделал все
procedure TForm2.DocbtnClick(Sender: TObject);
var
W, T: Variant;
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);
T.Cell(5, 2).Range.Text := strngrd1.Cells[0,2];
finally
end;
end;
Но все равно не получается отображение данных в таблице. Уже весь букварь перелистал, не могу назначить нужную ячейку в Stringgrid
← →
OW © (2011-04-11 14:50) [8]
> T.Cell(1, 1).Range.Text := "qwer";
"qwer" в первой таблице, в ячейке (1 1), есть?
← →
Dennis I. Komarov © (2011-04-11 15:27) [9]Универсальный метод для:
Открываем Ворд (файл)
Макрос на запись
Написали текст
Макрос стоп
Смотрим...
← →
Smile (2011-04-11 15:39) [10]YurikGL
Уже как несколько лет назад выложил информацию про это в категорию "Статьи", да и на http://articles.org.ru/ много инфы по этому вопросу
← →
Максон © (2011-04-11 16:57) [11]
> > T.Cell(1, 1).Range.Text := "qwer";"qwer" в первой таблице,
> в ячейке (1 1), есть?
Да есть, так получается.
А вот из Stringrid - никак
← →
Максон © (2011-04-11 17:01) [12]Ребята, спасибо огромное, щас буду разбираться
← →
Dennis I. Komarov © (2011-04-11 17:40) [13]
> Да есть, так получается.А вот из Stringrid - никак
Ох уж эти сказочники...
← →
Максон © (2011-04-11 18:12) [14]Все равно не получается.
var
RowCount:integer;
begin
....
T.Cell(1, 1).Range.Text:=StringGrid.Cells[1,RowCount-1];
← →
OW © (2011-04-12 08:38) [15]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-12 13:30) [16]
> 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];
Посоветуйте пожалуйста как правильно сделать
← →
Германн © (2011-04-12 13:43) [17]
> //запускаю цикл
Счетчик цикла i. А в теле цикла какой-то непонятный RowPoint.
← →
Максон © (2011-04-12 13:49) [18]извиняюсь вот как должно быть
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];
← →
Smile (2011-04-12 14:20) [19]Странная, какая-то ветка.
Похоже, что автор ничего читать и искать не желает
:(
Мог бы зайти сюда:
http://articles.org.ru/cn/?c=92
или уж сразу сюда:
Как экспортировать StringGrid в MS Word таблицуhttp://www.kansoftware.ru/?tid=4061
← →
Dennis I. Komarov © (2011-04-12 14:40) [20]У тебя ошибка в программе, ищи...
← →
DTMail (2011-04-13 07:17) [21]А как организовать аналогичный экспорт данных из StringGrid в открытый документ Word в таблицу в документе, начиная с ячейки, в котоую установлен курсор?
← →
Dennis I. Komarov © (2011-04-13 14:52) [22]
> DTMail (13.04.11 07:17) [21]
А зачем?
Для этого буфер обмена вроде бы есть...
Хотя, вроде можно...
← →
Максон © (2011-04-14 07:09) [23]Почитав умные книжки у меня вот что получилось.
Объясните пожалуйста, как добавлять все строки.
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.
Все перерыл, ведь запускается цикл от 1for iRows:=1 to strngrd1.RowCount-1 do
например, делал вот так
T.Cell(iRows+3,3).Range.Text:= strngrd1.Cells[3,iRows-1];
//Тут ошибка
Ребята посоветуйте пожалуйста или наведите на мысль
← →
Максон © (2011-04-14 08:30) [24]
> например, делал вот так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
← →
Dennis I. Komarov © (2011-04-14 09:02) [25]
> Ребята посоветуйте пожалуйста или наведите на мысль
...прицыпились к MSWord со всеми приблудами;
иницилизировали индекс_строки
пока не вышли за предел строк в SG1 делать:
начало
Таблице в Word добавить строку;
Таблица.ячейка(X, последняя):=SG1.Sells[Y, индекс_строки];
(аналогично поступить) с другими
Inc(индекс_строки);
конец;
Корректно отцепились;
Все. Переводи.
> при компиляции выдает ошибку
не вижу...
← →
OW © (2011-04-14 09:26) [26]
> Dennis I. Komarov © (14.04.11 09:02) [25]
>
>
да он просто издевается, имхо.
← →
Dennis I. Komarov © (2011-04-14 09:34) [27]
> OW © (14.04.11 09:26) [26]
Это ему не поможет... код сам писать будет ;)
← →
Максон © (2011-04-14 09:39) [28]Спасибо, Денис.
Заработало. begin и end поставил все пошло.
У меня теперь другой вопрос:
1. цикл по столбцам обязательно делать. у меня количество столбцов фиксированное - их 20.
2. не могу разобраться с индексом строки
Ребята, вы уж меня извините за тупые вопросы я чуть больше полгода на delphi подсел. Тяму не хватает
← →
Dennis I. Komarov © (2011-04-14 09:56) [29]1. Не обязательно.
2. Плохо, а чего с ним разбираться?
← →
Максон © (2011-04-14 13:57) [30]Столкнулся еще с одной проблемой
На форме есть 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 14:39) [31]
> Код рабочий, единственное что ...
Ужас, а не код, даже смотреть противно...
> Посоветуйте пожалуйста как быть в данной ситуации?
Выброси это чудо и переводи [25]
← →
OW © (2011-04-14 14:57) [32]Q:почему он добавляет в таблицу по последней записи
A:
> if strngrd1.Cells[18, strngrd1.RowCount-1]="нет" then
> begin //
перевод такой
если последняя строка, 18 столбец = "нет"
то, не даем расслабляться компу дальше..
← →
Максон © (2011-04-15 09:37) [33]Все равно не получается:(
if strngrd1.Cells[18, strngrd1.RowCount-1]="нет" then
Добавляются данные только в ту таблицу по событию последней строчки.
А как сделать чтоб все строки с событием "есть" отражались в таблице1,
все строки с событием "нет" отражались в таблице 2.
← →
Dennis I. Komarov © (2011-04-15 09:52) [34]Не надо хранить данные в визуальных компонентах, создай хотя бы массив записей и храни (экспортируй) там.
З.Ы. Хотя о чем это я. Чукча писатель...
← →
Максон © (2011-04-15 09:57) [35]
> З.Ы. Хотя о чем это я. Чукча писатель...
Денис я всегда за здоровую критику, но вот оскорблять не надо.
Основ delphi не знаю, но очень хочу научится
← →
Dennis I. Komarov © (2011-04-15 10:21) [36]Ну так делай выводы...
З.Ы.
http://lurkmore.ru/%D7%F3%EA%F7%E0_%ED%E5_%F7%E8%F2%E0%F2%E5%EB%FC
← →
OW © (2011-04-15 12:01) [37]
> Максон ©
все что надо
доступ к ячейке там
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 раз написать все это, но это нужно сделать Вам самому. Если Вам, конечно, это надо - стать программистом
А если нет - какие проблемы.. Если я не могу трубу отлить/выкатать, я ее покапаю в магазине, готовую и красивую.
← →
Максон © (2011-04-26 11:44) [38]Здраствуйте, снова мучаюсь со 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;
← →
brother © (2011-04-26 11:48) [39]> if strngrd1.Cells[19, iRows]="есть" then
> if strngrd1.Cells[19, iRows]="нет" then
какое будет поведение если там бкдет стоять, например: Есть/Нет?
← →
Максон © (2011-04-26 11:58) [40]Если будет стоять "есть", то все строки strngrd1.Cells[19, iRows] должны отображаться в таблице1, а если "нет" , то в таблице2.
← →
brother © (2011-04-26 12:03) [41]на заглавные буквы ты обратил внимание?
← →
Максон © (2011-04-26 12:05) [42]да тут не обязательно, они добавляются в Stringgrid из Combobox-а
← →
OW © (2011-04-26 12:19) [43]из кода:
по строкам грида
начать
Добавить строку в Т1 --это вот
Добавить строку в Т2 --и это вот
перенести в раздел, где
если 19 колонка строки = есть, то
начать
Добавить строку в Т1
...
если 19 колонка строки = нет, то
начать
Добавить строку в Т2
...
← →
Максон © (2011-04-26 12:37) [44]Строки добавляются.
А вот с нумерацией как быть почему-то для всех строчек выполняется один цикл T.Cell(iRows+3 ,1).Range.Text:= IntToStr(iRows) + ".";
← →
OW © (2011-04-26 12:43) [45]
> с нумерацией как быть
завести две переменные, куда писать колво строк в соотв. таблице.
если 19 колонка строки = есть, то
начать
Добавить строку в Т1
Увеличить переменную кол-ва строк T1 на 1
Записать в таблицу не общий счетчик, а ее
...
если 19 колонка строки = нет, то
начать
Добавить строку в Т2
аналогично с другой переменной
← →
Максон © (2011-04-26 14:38) [46]сделал следующим образом
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-1 do
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-1 do
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 15:15) [47]думай
← →
Максон © (2011-04-26 17:36) [48]Тут два типа счетчика
1. iRows:=1 to strngrd1.RowCount-1
2. for i:=1 to T.Rows.Count-1
А как сделать, чтобы нумеровались строки 1,2,3,4, а в конце не появлялоась 7.
← →
Максон © (2011-04-27 07:07) [49]Немного разобрался получился код
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;
Вроде бы работает, но все равно что-то не так
← →
OW © (2011-04-27 09:10) [50]
> Вроде бы работает, но все равно что-то не так
что не так?
все должно быть так .
← →
Максон © (2011-04-29 08:19) [51]Столкнулся еще с одной проблемой:
Колонки таблиц стали нессиметричными после заполнения. И пришлось все заново переделывать.
Таблица должна быть единой:(
таблица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-29 08:42) [52]
> 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;
если правильно понял
Страницы: 1 2 вся ветка
Текущий архив: 2011.08.07;
Скачать: CL | DM;
Память: 0.66 MB
Время: 0.008 c