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-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.


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

Наверх

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