Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как передать в процедуру открытый экземпляр Excel ? [D7]


anvolkov ©   (2009-07-02 19:30:00) 

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

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.
Как правильно сделать такое действие?


anvolkov   (2009-07-03 13:16:00) [1]

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

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

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

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


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


> if Excel=null then


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


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


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


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


anvolkov   (2009-07-03 13:02:00) [3]

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

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

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


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

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 12:40:00) [5]

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


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


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


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


anvolkov   (2009-07-03 12:20:00) [7]

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


anvolkov   (2009-07-03 12:18:00) [8]

Собственно, вот кусочек кода, при котором вываливается с ошибкой в процедуре 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:17:00) [9]

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

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


sniknik   (2009-07-02 19:37:00) [10]

> if Excel=nullthen
???


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


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


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо