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

Вниз

Как передать в процедуру открытый экземпляр Excel ?   Найти похожие ветки 

 
anvolkov ©   (2009-07-02 19:30) [0]

Собственно, вот кусочек кода:

Procedure my_my_my(var Excel:OleVariant);
Begin
  if Excel=null then
   Begin
     Excel := CreateOleObject("Excel.Application");
     Excel.Visible := True;
     Excel.WorkBooks.Add; //Создать новую таблицу
   End;
  Excel.Range["A1"].Value2 := "Привет";
End;

procedure TForm1.BitBtn1Click(Sender: TObject);
var Excel : OleVariant;
begin
  Excel := CreateOleObject("Excel.Application");
  Excel.Visible := True;
  Excel.WorkBooks.Add; //Создать новую таблицу
  my_my_my(Excel);
//   my_my_my(null);
end;

Не получается управлять открытым Excel из процедуры my_my_my.
Как правильно сделать такое действие?


 
Игорь Шевченко ©   (2009-07-02 19:36) [1]


> Не получается управлять открытым Excel


В чем выражается "не получается" ?


 
sniknik ©   (2009-07-02 19:37) [2]

> if Excel=null then
???


 
anvolkov ©   (2009-07-03 12:17) [3]

Смысл такой. Если передаю в процедуру my_my_my параметр Null - открывается новый экземпляр экселя, иначе - используется открытый эксель из процедуры-кнопки.
Так вот не получается передать указатель на открытый эксель, т.е. при данном тексте в процедуре my_my_my вываливается с ошибкой при записи в ячейку А1.
Если передать в процедуру Null - все нормально, формируется новый эксель и прекрасно заполняется.

Задача у меня такая. Открывается эксель и разные процедуры наполняют его разными листами.


 
anvolkov ©   (2009-07-03 12:18) [4]

Собственно, вот кусочек кода, при котором вываливается с ошибкой в процедуре my_my_my:

Procedure my_my_my(var Excel:OleVariant);
Begin
 Excel.Range["A1"].Value2 := "Привет";
End;

procedure TForm1.BitBtn1Click(Sender: TObject);
var Excel : OleVariant;
begin
 Excel := CreateOleObject("Excel.Application");
 Excel.Visible := True;
 Excel.WorkBooks.Add; //Создать новую таблицу
 my_my_my(Excel);
end;


 
anvolkov ©   (2009-07-03 12:20) [5]

пробовал ловить еще так:
Excel := GetActiveOleObject("Excel.Application");
тоже ничего не получается...


 
Игорь Шевченко ©   (2009-07-03 12:23) [6]


>  вываливается с ошибкой в процедуре my_my_my


с секретной ошибкой, очевидно


 
anvolkov ©   (2009-07-03 12:40) [7]

Project raised exception class EVariantInvalidOpError with message "Invalid variant operation"


 
Игорь Шевченко ©   (2009-07-03 12:51) [8]

unit main;

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   procedure Foo (var Excel: OleVariant);
 end;

var
 Form1: TForm1;

implementation
uses
 ComObj;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 Excel : OleVariant;
begin
 Excel := CreateOleObject("Excel.Application");
 Excel.Visible := True;
 Excel.WorkBooks.Add; //Создать новую таблицу
 Foo(Excel);
end;

procedure TForm1.Foo(var Excel: OleVariant);
begin
 Excel.Range["A1"].Value2 := "Привет";
end;

end.


Мне стало любопытно, набросал код. Работает без ошибок


 
anvolkov ©   (2009-07-03 13:02) [9]

хм... Действительно, в таком варианте работает.
Но если попробовать добавить в процедуру FOO безобидную проверку на:

procedure TForm1.Foo(var Excel: OleVariant);
begin
if Excel=null then showmessage("Пусто");
Excel.Range["A1"].Value2 := "Привет";
end;

то сразу все перестает работать.
Как мне отследить, связана переменная Excel с объектом или нужно формировать новый эксель?
Можно, конечно, передавать в процедуру еще одну переменную-флаг, но хотелось сделать более красиво.
Есть соображения?


 
Игорь Шевченко ©   (2009-07-03 13:12) [10]


> if Excel=null then


 if VarIsNull(Excel) then
   ShowMessage("пусто")
 else
   Excel.Range["A1"].Value2 := "Привет";


Тоже работает.


> Есть соображения?


Есть соображения: Создать объект Excel один раз и не проверять в каждой процедуре. По окончании работы сказать
Excel.Quit;
Excel := null;


 
anvolkov ©   (2009-07-03 13:16) [11]

if VarIsNull(Excel) then
  ShowMessage("пусто")

Спасибо за это!!! Это вполне подойдет.

К сожалению, один раз создавать эксель и все время его использовать не получится-т.к. будут создаваться множественные книги и листы. И какой эксель подсуну процедуре - чтобы туда она и выводила данные.

С данным вопросом разобрался. Большое спасибо Игорю Шевченко.



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

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

Наверх




Память: 0.5 MB
Время: 0.018 c
2-1246427745
lewka
2009-07-01 09:55
2009.08.30
Отправка электроной почты


4-1215247210
denissoft
2008-07-05 12:40
2009.08.30
kiFastSystemCallRet


2-1246467765
AlexDan
2009-07-01 21:02
2009.08.30
Преобразование строки..


2-1246353205
worldmen
2009-06-30 13:13
2009.08.30
Алгоритм перемещения курсора мыши


2-1246549168
vslabchenko
2009-07-02 19:39
2009.08.30
Парадокс с ShellExecute