Форум: "Основная";
Текущий архив: 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