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

Вниз

Удаление Ole объекта   Найти похожие ветки 

 
Karlson ©   (2004-05-06 23:38) [0]

Добрый вечер! Создаю оле-объект (Excel) CreateOleObject, хочу за завершении работы с ним - удалить его из процессов. Команда Quit не дает желаемого результата.


 
Palladin ©   (2004-05-06 23:40) [1]

Он у тебя видимый?


 
Karlson ©   (2004-05-06 23:43) [2]

нет


 
Rouse_ ©   (2004-05-06 23:48) [3]

Excel.Close(False)
правда не метод для Word - не знаю сработает ли в Excel

короче почитай в MSDN Q229310


 
Palladin ©   (2004-05-06 23:48) [4]

попробуй сделать видимым, посмотри что происходит


 
Rouse_ ©   (2004-05-06 23:49) [5]

> правда не метод = правда это метод
;)


 
Karlson ©   (2004-05-06 23:53) [6]

Close для Excel не проходит вообще как метод
при видимом Excel - закрывается при Quit и остается в памяти


 
Игорь Шевченко ©   (2004-05-07 00:01) [7]

NULL после Quit присвоить OLE-объекту.

var
 E: Variant;
...
begin
 E := CreateOleObject("Excel.Application");
....
 E.Quit;
 E := NULL;
end;


 
Игорь Шевченко ©   (2004-05-07 00:06) [8]

Rouse_ ©   (06.05.04 23:48)


> короче почитай в MSDN Q229310


Почитай сам, к чему относится метод .Close в этом Q229310.

Он относится не к объекту Word, а к объекту Word.Document.


 
Karlson ©   (2004-05-07 00:07) [9]

присвоение NULL ничего не дает - процесс висит в памяти


 
Rouse_ ©   (2004-05-07 00:11) [10]

> [8] Игорь Шевченко ©   (07.05.04 00:06)
Да - невнимательно просмотрел... сори...


 
Игорь Шевченко ©   (2004-05-07 00:14) [11]

Karlson ©   (07.05.04 00:07)


> присвоение NULL ничего не дает - процесс висит в памяти


Код в студию


 
Emperor   (2004-05-07 01:51) [12]

Ничего ни висит... все закрывается...:((


 
Karlson ©   (2004-05-07 09:40) [13]

код:
MsExcel:=CreateOleObject("Excel.Application");
MsExcel.DisplayAlerts := False;
MsExcel.WorkBooks.Add;
sh := 1;
Sheet := MsExcel.WorkBooks[wb].Sheets[sh];
Sheet.Name := ...;
 try
 MsExcel.ActiveWorkbook.SaveAs(... + ".xls");
 except
 MsExcel.ActiveWorkbook.Save;
 end
 MsExcel.Quit;
 MsExcel := Null;


 
den_777   (2004-05-07 10:17) [14]

Попробуй вставить сточку
MsExcel.AutoQuit:=True
Но она может помочь, только если нет открытых Workbook


 
Игорь Шевченко ©   (2004-05-07 10:26) [15]

А если на строку c Quit поставить Breakpoint туда управление передается ?


 
Karlson ©   (2004-05-07 10:29) [16]

Игорь Шевченко ©   (07.05.04 10:26) [15]
> А если на строку c Quit поставить Breakpoint туда управление передается ?

да


 
Karlson ©   (2004-05-07 10:33) [17]

den_777   (07.05.04 10:17) [14]
> Попробуй вставить сточку
> MsExcel.AutoQuit:=True
> Но она может помочь, только если нет открытых Workbook

Этот метод вообще не проходит...


 
Курдль ©   (2004-05-07 10:38) [18]

Вот фрагмент кода, который работает давно и безглючно.
Но в нем применены не OLE-объекты а компоненты "TExcel..."


 try
   try
     excelApp:=TExcelApplication.Create(Application);
     excelApp.ConnectKind:=ckNewInstance;
     excelApp.Connect;
   except
     raise Exception.Create(""Microsoft Excel" не установлен на Вашем компъютере");
   end;
   excelWorkBook := TExcelWorkbook.Create(excelApp);
   excelWorkBook.ConnectTo(excelApp.Workbooks.Open(FName, EmptyParam, False, EmptyParam, EmptyParam,
                                                   EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                                   EmptyParam, EmptyParam, EmptyParam, EmptyParam, xlLCID));
   excelWorkSheet:=TExcelWorkSheet.Create(excelApp);
   excelWorkSheet.ConnectTo(excelWorkBook.WorkSheets[1] as _Worksheet);
   excelApp.Visible[xlLCID]:=True;
   excelApp.WindowState[xlLCID]:=xlNormal;
   excelApp.ScreenUpdating[xlLCID]:=True;
 except
   raise
 end;

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

 excelWorkSheet.Disconnect;
 excelWorkSheet.Free;
 excelWorkBook.Disconnect;
 excelWorkBook.Free;
 excelApp.Quit;
 excelApp.Disconnect;
 excelApp.Free;


 
Karlson ©   (2004-05-07 10:42) [19]

Курдль ©   (07.05.04 10:38) [18]
> Вот фрагмент кода, который работает давно и безглючно.
> Но в нем применены не OLE-объекты а компоненты "TExcel..."

спасибо за код! но мне уже очень интересно как УБИТЬ этот Оле...


 
Курдль ©   (2004-05-07 10:45) [20]


> спасибо за код! но мне уже очень интересно как УБИТЬ этот
> Оле...

А! "Для чистоты экскремента!" Понимаю... Может быть позакрывать все WorkBooks перед Quit?..


 
Игорь Шевченко ©   (2004-05-07 10:58) [21]

unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TForm1 = class(TForm)
   ListBox1: TListBox;
   procedure FormCreate(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation
uses
 ComObj;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
 I, J, Rows, Cols: Integer;
 E, Rng: Variant;
 S: String;
begin
 E := CreateOleObject("Excel.Application");
 E.WorkBooks.open("D:\test.xls",true);
 J := E.WorkBooks[1].WorkSheets[1].Rows.Count;
 Rng := E.WorkBooks[1].WorkSheets[1].UsedRange;
 Rows := Rng.Rows.Count;
 Cols := Rng.Columns.Count;
 ShowMessageFmt("Used rows=%d, used columns=%d", [Rows, Cols]);
 for i := 2 to J do begin
   S := E.WorkBooks[1].WorkSheets[1].Cells[i,1];
   if S = "" then
     Break;
   ListBox1.Items.Add(S);
 end;
 E.Quit;
 E := NULL;
end;

end.


Вот это тоже работает :)


 
Курдль ©   (2004-05-07 11:06) [22]


> Вот это тоже работает :)

Не-а! :)  Без добавления Variants в uses.



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

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

Наверх




Память: 0.52 MB
Время: 0.06 c
14-1083249941
Piter
2004-04-29 18:45
2004.05.23
Как правильно читается слово "Inherited" ?


4-1081405299
alex732
2004-04-08 10:21
2004.05.23
WM_COPYDATA


7-1081867216
nv_
2004-04-13 18:40
2004.05.23
ESC последовательности


11-1071311892
blanco
2003-12-13 13:38
2004.05.23
Позднее связывание


14-1083782911
Drakon
2004-05-05 22:48
2004.05.23
Песни о Software