Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> COM 
:(
    Опции темы
<Spawn>
Дата 10.8.2003, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Я измучился весь уже с этим долбаным Word-ом. Чтоб я еще раз его использовал. Требуется создать отчет в Word-е. Для этого пользователь выбирает необходимые поля. Далбше дело алгоритма. Но вот не могу понять в чем глюк. Вот код:
Код
begin
if DM.IBDatabase1.Connected then
try
IsOk:=False;
Report:=TFReport.Create(nil);
if pcDataType.ActivePageIndex=0 then
 case PageControlData.ActivePageIndex of
  0:Grid:=DBGrid;
  1:Grid:=DBGrid1;
  2:Grid:=DBGrid2;
  3:Grid:=DBGrid5;
  4:Grid:=DBGrid7;
 end;
for i:=0 to Grid.Columns.Count-1 do
with Report do
 begin
  clbFields.Items.Add(Grid.Columns.Items[i].Title.Caption);
  clbFields.Checked[clbFields.Items.Count-1]:=True;
 end;
Report.clbFields.Items.Add('&#221;&#236;&#225;&#235;&#229;&#236;&#224;');
Report.clbFields.Checked[Report.clbFields.Items.Count-1]:=True;
Report.RecordsCount:=GetRecordsCount(PageControlData.ActivePageIndex);
Report.ShowModal;
IsOk:=Report.btnOk.ModalResult=mrOk;
if IsOk then
 begin
  RecCount:=Report.RecordsCount;
  SetLength(RecNumbers,Length(Report.RecNumbers));
  CopyMemory(RecNumbers,Report.RecNumbers,Length(Report.RecNumbers)*SizeOf(integer));
  Setlength(ColumnUsed,Report.clbFields.Items.Count);
  CopyMemory(ColumnUsed,Report.ColumnUsed,Report.clbFields.Items.Count*SizeOf(Boolean));
 end;
finally
FreeAndNil(Report);
end
else
ShowMessage('&#196;&#235;&#255; &#241;&#238;&#241;&#242;&#224;&#226;&#235;&#229;&#237;&#232;&#255; &#238;&#242;&#247;&#229;&#242;&#224; &#237;&#229;&#238;&#225;&#245;&#238;&#228;&#232;&#236;&#238; &#239;&#238;&#228;&#234;&#235;&#254;&#247;&#232;&#242;&#252;&#241;&#255; &#234; &#225;&#224;&#231;&#229; &#228;&#224;&#237;&#237;&#251;&#245;');

if not IsOk then Exit;

MaxValue:=0;
Counter:=0;
ColumnCount:=0;
ProgressCount:=0;

for j:=0 to Length(RecNumbers)-1 do
if MaxValue<RecNumbers[j] then
 begin
  MaxValue:=RecNumbers[j];
  Inc(ProgressCount);
 end;

try
Progress:=TFProgress.Create(nil);
Progress.glLabel2.Caption:='&#200;&#228;&#229;&#242; &#241;&#238;&#241;&#242;&#224;&#226;&#235;&#229;&#237;&#232;&#229; &#238;&#242;&#247;&#229;&#242;&#224;...';
Progress.Show;

AppProgID:='Word.Application';
Result:=GetActiveObject(ProgIDToClassID(AppProgID),nil,Unknown);
if Result=MK_E_UNAVAILABLE then
Word:=CreateOleObject(AppProgID)
else
Word:=GetActiveOleObject(AppProgID);

for i:=0 to 5 do
if ColumnUsed[i] then
 begin
  TitleString:=Grid.Columns[i].Title.Caption;
  SaveId:=i+1;
  Inc(ColumnCount);
  break;
 end;


for i:=SaveID to 5 do
if ColumnUsed[i] then
 begin
  TitleString:=TitleString+';'+Grid.Columns[i].Title.Caption;
  Inc(ColumnCount);
 end;

Word.Documents.Add;
Doc:=Word.Documents.Item(1);
Doc.Paragraphs.Add;
Doc.Paragraphs.Item(1).Style:='&#199;&#224;&#227;&#238;&#235;&#238;&#226;&#238;&#234; 1';
Range:=Doc.Range(0);
Range.InsertBefore('&#206;&#242;&#247;&#229;&#242;');
//Doc.Paragraphs.Add;
Range.Font.Bold:=1;
//Table:=Range.ConvertToTable(';',Counter,ColumnCount);
try      // Word.Visible:=True;
EnableWindow(Handle,False);
DM.DataSource1.DataSet.First;  //wd.Range.Cells.
Range.Font.Bold:=0;
for i:=1 to RecCount do
begin
 Progress.glProgress1.Percent:=Round((100/MaxValue)*i);  
 if i>MaxValue then Break;
 for j:=0 to Length(RecNumbers) do
  if RecNumbers[j]=i then
   begin
    for n:=0 to 5 do
     if ColumnUsed[n] then
      begin
       RecString:=DM.DataSource1.DataSet.FieldByName(Rec1CFields[n]).AsString;
       SaveID:=n+1;
       break;
      end;
    for m:=SaveID to 5 do
     if ColumnUsed[m] then
      begin
       RecString:=RecString+';'+DM.DataSource1.DataSet.FieldByName(Rec1CFields[m]).AsString;
       //ShowMessage(DM.DataSource1.DataSet.FieldByName(Rec1CFields[m]).AsString);
      end;
    Doc.Paragraphs.Add;
    Range.InsertAfter(TitleString);
    Doc.Paragraphs.Add;
    Range.InsertAfter(RecString);
 
    Range:=Doc.Range(Doc.Paragraphs.Item(Doc.Paragraphs.Count-1).Range.Start,
                                   Doc.Paragraphs.Item(Doc.Paragraphs.Count).Range.End);


    Table:=Range.ConvertToTable(';',2,ColumnCount);

    CurrentWidth:=0;
    RecString:='';
    WidthsCounter:=1;
    Counter:=0;
    for z:=6 to ActiveMainGrid.Columns.Count-1 do
     if ColumnUsed[z] then
      if CurrentWidth+ActiveMainGrid.Columns[z].Width<480 then
       begin
        RecString:=DM.DataSource1.DataSet.FieldByName(ActiveMainGrid.Columns[z].FieldName).AsString;
        TitleString2:=ActiveMainGrid.Columns[z].Title.Caption;
        CurrentWidth:=ActiveMainGrid.Columns[z].Width;
        SaveID:=z+1;
        SetLength(Widths,1);
        Widths[0]:=ActiveMainGrid.Columns[z].Width;
        Break;
       end
      else
       begin
        ShowMessage('&#209;&#242;&#238;&#235;&#225;&#229;&#246; '+ActiveMainGrid.Columns[z].Title.Caption+' &#232;&#236;&#229;&#229;&#242; &#241;&#235;&#232;&#248;&#234;&#238;&#236; &#225;&#238;&#235;&#252;&#248;&#232;&#229; &#240;&#224;&#231;&#236;&#229;&#240;&#251;. &#200;&#231;&#236;&#229;&#237;&#232;&#242;&#229; &#232;&#245; &#232; &#237;&#224;&#247;&#237;&#232;&#242;&#229; &#238;&#242;&#247;&#229;&#242; &#241;&#237;&#238;&#226;&#224;');
        Exit;
       end;

    for z:=SaveID to ActiveMainGrid.Columns.Count-1 do
     if ColumnUsed[z] then
      if CurrentWidth+ActiveMainGrid.Columns[z].Width<480 then
       begin
        RecString:=RecString+';'+DM.DataSource1.DataSet.FieldByName(ActiveMainGrid.Columns[z].FieldName).AsString;
        TitleString2:=TitleString2+';'+ActiveMainGrid.Columns[z].Title.Caption;
        CurrentWidth:=CurrentWidth+ActiveMainGrid.Columns[z].Width;
        Inc(WidthsCounter);
        SetLength(Widths,WidthsCounter);
        Widths[WidthsCounter-1]:=ActiveMainGrid.Columns[z].Width;
       end
      else
       begin{В случае большого количества столбцов, часть переносится}
        Range.InsertAfter(TitleString2);
        Doc.Paragraphs.Add;
        Range.InsertAfter(RecString);
        Range:=Doc.Range(Doc.Paragraphs.Item(Doc.Paragraphs.Count-1).Range.Start,
                         Doc.Paragraphs.Item(Doc.Paragraphs.Count).Range.End);
        Table:=Range.ConvertToTable(';',2,WidthsCounter);
        TitleString2:=ActiveMainGrid.Columns[z].Title.Caption;
        RecString:=DM.DataSource1.DataSet.FieldByName(ActiveMainGrid.Columns[z].FieldName).AsString;
        WidthsCounter:=0;
        CurrentWidth:=0;
       end;
    Range.InsertAfter(TitleString2);

    Doc.Paragraphs.Add;
    Range.InsertAfter(RecString);

    Range:=Doc.Range(Doc.Paragraphs.Item(Doc.Paragraphs.Count-1).Range.Start,
                     Doc.Paragraphs.Item(Doc.Paragraphs.Count).Range.End);

    Table:=Range.ConvertToTable(';',2,WidthsCounter);

    Break;
   end;
 Application.ProcessMessages;
 DM.DataSource1.DataSet.Next;
end;

.....
....
....
.....
....

Код практически еще не оптимизирован, так что не обращайте внимания если будут какие либо глупости. Но вот я ни как не могу понять в чем ошибка. При выводе в Word инфы и при очень большом количестве столбцов( в коде помечен этот участок) резульат для меня совсем не понятный. Названия столбцов переносятся на следующую строку и получается такая чушь, что разобрать ни чего не возможно. Буду признателен всем, кто поможет разобраться в данной проблеме.

Это сообщение отредактировал(а) <Spawn> - 10.8.2003, 13:25


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 10.8.2003, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Вот часть, в которой должны создаваться таблицы, в которых возможно переполнение столбцами одного параграфа. В случае чего должны создаться дополнительные поля
Код


   for z:=SaveID to ActiveMainGrid.Columns.Count-1 do
    if ColumnUsed[z] then
     if CurrentWidth+ActiveMainGrid.Columns[z].Width<480 then
      begin
       RecString:=RecString+';'+DM.DataSource1.DataSet.FieldByName(ActiveMainGrid.Columns[z].FieldName).AsString;
       TitleString2:=TitleString2+';'+ActiveMainGrid.Columns[z].Title.Caption;
       CurrentWidth:=CurrentWidth+ActiveMainGrid.Columns[z].Width;
       Inc(WidthsCounter);
       SetLength(Widths,WidthsCounter);
       Widths[WidthsCounter-1]:=ActiveMainGrid.Columns[z].Width;
      end
     else
      begin{В случае большого количества столбцов, часть переносится}
       Range.InsertAfter(TitleString2);
       Doc.Paragraphs.Add;
       Range.InsertAfter(RecString);
       Range:=Doc.Range(Doc.Paragraphs.Item(Doc.Paragraphs.Count-1).Range.Start,
                        Doc.Paragraphs.Item(Doc.Paragraphs.Count).Range.End);
       Table:=Range.ConvertToTable(';',2,WidthsCounter);
       TitleString2:=ActiveMainGrid.Columns[z].Title.Caption;
       RecString:=DM.DataSource1.DataSet.FieldByName(ActiveMainGrid.Columns[z].FieldName).AsString;
       WidthsCounter:=0;
       CurrentWidth:=0;
      end;
   Range.InsertAfter(TitleString2);

   Doc.Paragraphs.Add;
   Range.InsertAfter(RecString);

   Range:=Doc.Range(Doc.Paragraphs.Item(Doc.Paragraphs.Count-1).Range.Start,
                    Doc.Paragraphs.Item(Doc.Paragraphs.Count).Range.End);

   Table:=Range.ConvertToTable(';',2,WidthsCounter);


Это сообщение отредактировал(а) <Spawn> - 10.8.2003, 12:59


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 10.8.2003, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Хм. Видимо у меня с голово чего то не то уже. Ошибка была в том, что WidthsCounter:=0, а нужно было присвоить 1.(Поскольку эта переменная, необходимая для других целей, используется и для построения таблиц)

Это сообщение отредактировал(а) <Spawn> - 10.8.2003, 13:20


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0825 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.