Форум: "Начинающим";
Текущий архив: 2009.08.30;
Скачать: [xml.tar.bz2];
ВнизКак передать в процедуру открытый экземпляр 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 thenif 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c