Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
4-1216039147
Gec
2008-07-14 16:39
2009.08.30
Получить Canvas фомы


9-1181664878
@!!ex_
2007-06-12 20:14
2009.08.30
Обратная матрица.


15-1246084442
Student85236
2009-06-27 10:34
2009.08.30
Как жестко перегрузить Windows XP


15-1245954371
Kerk
2009-06-25 22:26
2009.08.30
ICFP


15-1246342790
Холивар
2009-06-30 10:19
2009.08.30
Библиотеки DirectX





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский