Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.20;
Скачать: CL | DM;

Вниз

ExcelApplication 2   Найти похожие ветки [судный день]

 
NeVIP.   (2004-06-04 00:49) [0]

Доброго времени суток Мастера.

Как уже писалось в посте ExcelApplication, переделываю я программу и т.п.,
вот, возник ещё 1 непонятный мне баг, подскажите в какую сторону
рыть :
Из базы данных выбираются записи и вставляются в Excel лист-шаблон,
этот лист при этом должен быть виден пользователю и происходит вот
такая неприятность : лист как будто "зависает" :
сначала он себе там чего-то думает, потом, видно, выполняет все
предписанные операции, и при этом в рабочей области листа ничего
не отображается эта область как будто "зависла", при этом доступ
к элементам меню и панелей - свободный - кликай-нехочу...
А при закрытии этого "зависшего" документа он выдаёт запрос на
сохранение изменений, => что нужные данные он всё же занёс, а вот
с отображением их у него проблемы...

Код, отвечающий за помещение :

procedure TSozdanie_price.Button1Click(Sender: TObject);
var i,cnt     : integer;
    zagolovok : string;
begin
 cnt:=0;
 for i:=0 to CheckListBox1.Items.Count-1 do
 if CheckListBox1.Checked[i]=true then cnt:=cnt+1;
 if cnt>0 then
  begin
   dm.Table_kategory.First;
    try
     ShowMessage(GetCurrentDir);
     ShowMessage(IntToStr(Pos("\price-list\",GetCurrentDir)));
     ShowMessage(ExtractFilePath(Application.ExeName));
     ExcelApplication1.Connect;
     ExcelApplication1.Workbooks.Open(ExtractFilePath(Application.ExeName)+
     "price-list\Шаблоны\Прайс",EmptyParam,EmptyParam,EmptyParam,EmptyParam,
     EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
     EmptyParam,EmptyParam,0);
     ExcelApplication1.Visible[0]:=true;
    except
     MessageBox(0,"Произошла ошибка при открытии файла!","Ошибка!",MB_ICONERROR)
   end;
   zagolovok:=dm.Table_kategoryKategory.Value+" / "+dm.Table_FirmFirma.Value;
   Сlose;
 end
 else
  begin
   ShowMessage("Вы не выбрали товар для составления прайс-листа!");
   Exit;
  end;

 Slim_Price;
 
end;

Slim_Price :

Procedure TSozdanie_price.Slim_Price;
var i:integer;
Count_checked:integer;
count_firm:integer;
count_tovar:integer;
begin
   try
     ExcelApplication1.Connect;
     ShowMessage(ExtractFilePath(Application.ExeName));
     ExcelApplication1.Workbooks.Open(ExtractFilePath(Application.ExeName)+
     "price-list\Шаблоны\Прайс",EmptyParam,EmptyParam,EmptyParam,EmptyParam,
     EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
     EmptyParam,EmptyParam,0);
     ExcelApplication1.Visible[0]:=true;
   except
     MessageBox(0,"Произошла ошибка при открытии файла!","Ошибка!",MB_ICONERROR)
   end;
 Count_checked:=0;
 count_firm:=0;
 count_tovar:=0;
 for i:=0 to CheckListBox1.Items.Count-1 do begin
   if CheckListBox1.Checked[i]=true then begin
   dm.Table_kategory.First;
   ExcelApplication1.Cells.Item[7,3].value:=Kurs_ye;
   ExcelApplication1.Cells.Item[8,3].value:=now;
    while not(dm.Table_kategory.Eof) do begin
     if (dm.Table_kategoryKategory.Value=CheckListBox1.Items.Strings[i]) then begin
        dm.Table_Firm.First;
         while not dm.Table_Firm.Eof do begin

           count_firm:=count_firm+1;
           ExcelApplication1.Range[ExcelApplication1.Cells.Item[10+Count_checked+
           count_firm+count_tovar,1],ExcelApplication1.Cells.Item[10+Count_checked+
           count_firm+count_tovar,4]].Merge(false);
           ExcelApplication1.Cells.Item[10+Count_checked+count_firm+
           count_tovar,1].value:=dm.Table_kategoryKategory.Value+" / "+
           dm.Table_FirmFirma.Value;
           ExcelApplication1.Cells.Item[10+Count_checked+count_firm+
           count_tovar,1].Font.size:=10;
           ExcelApplication1.Cells.Item[10+Count_checked+count_firm+
           count_tovar,1].Font.Name:="Arial Cyr";
           ExcelApplication1.Cells.Item[10+Count_checked+count_firm+
           count_tovar,1].Font.Bold:=true;
           ExcelApplication1.Range[ExcelApplication1.Cells.Item[10+Count_checked+
           count_firm+count_tovar,1],ExcelApplication1.Cells.Item[10+
           Count_checked+count_firm+count_tovar,4]].Borders.LineStyle:=xlContinuous;
             dm.Table_Tovar.First;
             while not dm.Table_Tovar.Eof do begin
             // Пробую выполнить следующие действия, ив случае ошибки выдаю сообщение
              try
               inc(count_tovar);
               ExcelApplication1.Cells.Item[10+Count_checked+count_firm+
               count_tovar,1].value:=dm.Table_TovarKOD.Value;
               ExcelApplication1.Range[ExcelApplication1.Cells.Item[10+Count_checked+
               count_firm+count_tovar,1],ExcelApplication1.Cells.Item[10+Count_checked+
               count_firm+count_tovar,1]].Borders.LineStyle:=xlContinuous;

               ExcelApplication1.Cells.Item[10+Count_checked+count_firm+count_tovar,2].value:=dm.Table_TovarName_Tovar.Value;
               ExcelApplication1.Range[ExcelApplication1.Cells.Item[10+Count_checked+
               count_firm+count_tovar,2],ExcelApplication1.Cells.Item[10+Count_checked+
               count_firm+count_tovar,2]].WrapText:=true;
               ExcelApplication1.Range[ExcelApplication1.Cells.Item[10+Count_checked+
               count_firm+count_tovar,2],ExcelApplication1.Cells.Item[10+Count_checked+
               count_firm+count_tovar,2]].Borders.LineStyle:=xlContinuous;

               ExcelApplication1.Cells.Item[10+Count_checked+count_firm+
               count_tovar,3].value:=dm.Table_TovarCena_YE.Value;
               ExcelApplication1.Range[ExcelApplication1.Cells.Item[10+Count_checked+
               count_firm+count_tovar,3],ExcelApplication1.Cells.Item[10+Count_checked+
               count_firm+count_tovar,3]].Borders.LineStyle:=xlContinuous;

               ExcelApplication1.Cells.Item[10+Count_checked+count_firm+
               count_tovar,4].value:=dm.Table_TovarCena_Rub.Value;
               ExcelApplication1.Range[ExcelApplication1.Cells.Item[10+Count_checked+
               count_firm+count_tovar,4],ExcelApplication1.Cells.Item[10+Count_checked+
               count_firm+count_tovar,4]].Borders.LineStyle:=xlContinuous;

               dm.Table_Tovar.Next;
             except
               begin
                MessageBox(Application.Handle,"Ошибка обработки прайс-листа","Ошибка",MB_ICONERROR);
                ExcelApplication1.Disconnect;
                Exit;
               end;
            end;{try}
             end;
           dm.Table_Firm.Next;
         end;//end of firm
     end;
       dm.Table_kategory.Next;
   end;//end of kategory
 end;//end of if checked
 end;//end of for
end;

В самой книге Excel, присутствует макрос :

Sub Макрос1()
"
" Макрос1 Макрос
" Макрос записан 24.04.2004 (Sergey)
"

"
   Selection.Insert Shift:=xlDown
   Range("A11:D11").Select
   Selection.Merge
End Sub

C уважением.


 
Palladin ©   (2004-06-04 02:28) [1]

В такой толпе кода, только жутко бездельничащий будет разбиратся... Реализуй трассировку в журнал исполнения... будет сразу видно где это останавливается...


 
Романов Р.В. ©   (2004-06-04 07:15) [2]

В коде ошибкок не видно. Рекомендую вставлять данные не в каждую ячейку, а заполнить массив и потом присвоить диапазону значение массива.


 
NeVIP.   (2004-06-04 08:07) [3]

2 Palladin : Про код полностью согласен, сам терпеть ненавижу
разбираться в программах которые псал не я... ^_^


 
NeVIP.   (2004-06-05 00:43) [4]

Эврика! Ошибка в том, что Excel остаётся в памяти!
Отсюда у меня к вам ещё вопрос, как правильно убить
в данной ситуации Excel? Объект не создаётся динамически,
так что простой Free здесь, конечно неподходит.
Использовал Disconnect, но в некоторых случаях, Excel
забываться не хочет никак... блин...

Вот код, после которого Excel остаётся :

procedure TForm_Wiev_Price.FormClose(Sender: TObject;
 var Action: TCloseAction);
begin
if MessageBox(Application.Handle,"Закрыть ?","Подтверждение",MB_ICONQUESTION+MB_YESNO) = mrYes
then
 begin
  if ExcelApplication1.Visible[0]=false then Action:=caFree;
try
  if ExcelApplication1.Visible[0]=false then exit;
  ExcelApplication1.ActiveWorkbook.Close(xlDoNotSaveChanges,EmptyParam,EmptyParam,0);
  ExcelApplication1.Disconnect;
//   ExcelApplication1.Quit;
except
  MessageBox(0,"Ошибка закрытия приложения!","Ошибка!",MB_ICONERROR);
  Action:=caFree;
  exit;
end;
//  Main_Form.Load_in_TreeViewClick(nil);
  Action:=caFree;
end
 else Action:=caNone;  
end;

В программе используются Excel"евские компоненты только типа ExcelApplication.
И ещё, вопрос, о совместимости Excel"евских компонентов из Delphi6 с Delphi7,
пробовал компилить под D6 - выдаёт ошибку :
... class EOleSysError with message "Недопустимое число параметров"...
и ошибку непомню какой несовместимости... 0_о



Страницы: 1 вся ветка

Текущий архив: 2004.06.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
11-1071485368
avakss
2003-12-15 13:49
2004.06.20
TCPServer и завершение виндовс98


3-1085494417
linx
2004-05-25 18:13
2004.06.20
После внесения изменений в базу не могу подключиться снова.


14-1086071246
TUser
2004-06-01 10:27
2004.06.20
Посоветуйте алгоритм.


14-1085946163
Drakon
2004-05-30 23:42
2004.06.20
Заработок в Интернете


6-1082858101
FatBase
2004-04-25 05:55
2004.06.20
Отправка почты: как всё объединить?