Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.033 c
3-1085637072
Draught
2004-05-27 09:51
2004.06.20
SQL запрос на вывод системной даты


3-1085416337
Nous Mellon
2004-05-24 20:32
2004.06.20
Спец-Операции с таблицами :)


3-1085567789
Draught
2004-05-26 14:36
2004.06.20
Как изменить SQL запрос, что бы и пустые записи тоже были?


1-1086253320
Сергей_И
2004-06-03 13:02
2004.06.20
Помогите создать в гриде чекбокс


4-1084794425
дотошный
2004-05-17 15:47
2004.06.20
Link на статью о потоках





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский