![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как передать в процедуру открытый экземпляр 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
В чем выражается "не получается" ?