Здравствуйте, BlackEric, Вы писали:
BE>Здравствуйте, Baskak, Вы писали:
S>>>Или сохранить файл, закрыть эксель и открыть его как процесс указав в командной строке файл или ..
B>>Да, ShellExecute. Оставлю как запасной вариант.
BE>Это, наверное, самый правильный вариант.
| НЮ-НЮ |
| type
TExcelShowDirty = class(TObject)
private
FxlExport: Excel2000.ExcelApplication;
public
procedure BeforeDestruction; override;
procedure xlShowDirty(const FileName: string);
end;
....
{$region 'TExcelShowDirty'}
procedure TExcelShowDirty.xlShowDirty(const FileName: string);
{
Этот код не пропускает Avast :-(
ShellExecute(Application.Handle, 'open', PChar(FileName), nil, nil, SW_SHOWNORMAL);
Приходиться делать через Ж.
}
var
unk: IUnknown;
xl: ExcelApplication;
begin
FxlExport := nil;// отпускаем предыдущий экземпляр
try
{$region 'ActiveObject'}
try
GetActiveObject(CLASS_ExcelApplication, nil, unk);
except
unk := CoExcelApplication.Create();
end;
{$endregion}
try
if not Supports(unk, ExcelApplication, xl) then
Exit;
FxlExport := xl;
FxlExport.Workbooks.Add(FileName, lcid);
// Включаем интерактивность
FxlExport.EnableEvents := True;
FxlExport.UserControl := True;
FxlExport.Interactive[lcid] := True;
FxlExport.DisplayAlerts[lcid] := True;
FxlExport.ScreenUpdating[lcid]:= True;
FxlExport.Visible[lcid] := True;
if FxlExport.WindowState[lcid] = xlMinimized then
FxlExport.WindowState[lcid] := xlNormal;
finally
{ Это и есть Ж - мы не отпускаем экземпляр а оставляем его болтаться в памяти.
xl := nil;
unk := nil;
}
end;
except
//eat exception
end;
end;
procedure TExcelShowDirty.BeforeDestruction;
begin
inherited;
FxlExport := nil;
end;
{$endregion}
|
| |