Re[6]: Delphi 7, Excel, CreateOleObject
От: glh Россия  
Дата: 07.11.15 20:08
Оценка:
Здравствуйте, 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}
Успехов!
C уважением, Алексей.
------------------------------------------------
Хороших %s не бывает — бывает не худший вариант.
delphi excel instance
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.