"Invaid variant type." при использовании класса.
От: Азамат Россия  
Дата: 05.10.08 14:33
Оценка:
Доброе время суток, господа!
Пишу класс по экспорту DBGridEh в Excel. Класс находится в отдельном модуле. Объявляю переменную типа этого класса, пытаюсь начать работать, но выдает сообщение об ошибке в какой то момент. Класс ошибки: EVariantBadVarType, сообщение: "Invaid variant type."

procedure TExpt.Init( aBeforeText, aAfterText : TMemo; aGrid : TDBGridEh; CreateImmediately, Colored : boolean );
  var b : boolean;
begin
    BeforeText := aBeforeText;
    AfterText := aAfterText;
    Grid := AGrid;

    Excel := CreateOLEObject( 'Excel.Application' );     <---   Здесь выдает ошибку.
    Excel.Application.EnableEvents := false;



Вызываю так:

procedure TForm1.Button1Click(Sender: TObject);
var exp : TExport;
begin
   exp.Init(bt,at, dg,false, false);
end;


Сам класс(часть):

TExport = class
            private
                FExcel : Variant;
            ...
            public
                property Excel : Variant read GetExcel
                                        Write SetExcel;
                procedure Init( aBeforeText, aAfterText : TMemo; aGrid : TDBGridEh; CreateImmediately, Colored : boolean );
            ...
end;


Подскажите, пожалуйста, в чем может быть ошибка.
Re: "Invaid variant type." при использовании класса.
От: elmal  
Дата: 05.10.08 14:51
Оценка:
Здравствуйте, Азамат, Вы писали:

А>
А>    Excel := CreateOLEObject( 'Excel.Application' );     <---   Здесь выдает ошибку.
А>

А>Подскажите, пожалуйста, в чем может быть ошибка.
Тип переменной Excel то у тебя скорее всего Variant (хоть ты и не привел объявление этой переменной), вот и ругается. Поставь нормальный тип, и все будет хорошо. Вернее не все будет хорошо, код мне что-то не нравится, но это мелочи
Re[2]: "Invaid variant type." при использовании класса.
От: Азамат Россия  
Дата: 05.10.08 15:54
Оценка:
Ну, да. Тип как раз таки вариант. И в листинге это показано.
А какой тогда тип должен быть? Всегда использую вариант при работе с экзелем. И в примерах тоже экзель, обычно.
Re[3]: "Invaid variant type." при использовании класса.
От: elmal  
Дата: 05.10.08 16:31
Оценка:
Здравствуйте, Азамат, Вы писали:

А>А какой тогда тип должен быть? Всегда использую вариант при работе с экзелем. И в примерах тоже экзель, обычно.

На самом деле я даже близко не дельфист, на дельфях писал один раз в жизни 6 лет назад, что-то подобное твоему . Я тогда контрол для работы с экселем использовал, а не Variant тип. Но вообще, по идее, CreateOLEObject( 'Excel.Application' ) должен возвращать указатель на IDispatch интерфейс. Уже вспомнить не могу, является ли это подтипом Variant, но кажись не является. Можно попробовать там в отладчике breakpoint попробовать поставить и в watch добавить CreateOLEObject('Excel.Application' ) посмотреть какой тип вернется, его и задать.
Re: "Invaid variant type." при использовании класса.
От: Max32 Украина http://www.omg.sed.lg.ua
Дата: 06.10.08 18:31
Оценка:
Здравствуйте, Азамат, Вы писали:

А>Доброе время суток, господа!

...
А>Подскажите, пожалуйста, в чем может быть ошибка.

Походу ошибка тут:
"procedure TExpt.Init"

Что ещё за класс TExpt ???
Re: "Invaid variant type." при использовании класса.
От: xShiFT Россия  
Дата: 07.10.08 01:55
Оценка:
Здравствуйте, Азамат, Вы писали:

А>Вызываю так:


А>
А>procedure TForm1.Button1Click(Sender: TObject);
А>var exp : TExport;
А>begin
A>   exp := TExport.Create;
А>   exp.Init(bt,at, dg,false, false);
А>end;
А>



хотя возможно не в этом проблема.

как-то давно делал подобное. Работало нормально. И Использовал тоже тип вариант.

uses {...} ComObj, ActiveX, Variants;

type
  TXls = class
  private
    fxls : Variant;
  public
    class function IsExcelInstalled(): boolean;
  public
    constructor Create(Visible: Boolean=False; FileName: WideString='');
    destructor Destroy(); override;
  end;

//...

class function TXls.IsExcelInstalled: Boolean;
var
  CID: TCLSID;
begin
  Result:= (CLSIDFromProgID(PWideChar(WideString('Excel.Application')), CID) = S_OK);
end;

constructor TXls.Create(Visible: Boolean=False; FileName: WideString=''; Calculation: TXlsCalculation=xlscNull);
begin
  if(not TXls.IsExcelInstalled)then
    Raise Exception.Create('Excel не установленн!');

  fxls:= CreateOleObject('Excel.Application');
  fxls.Visible := Visible;
end;

destructor TXls.Destroy;
begin
  fxls.Quit;
  fxls:= Unassigned;
  inherited Destroy;
end;
Re[2]: "Invaid variant type." при использовании класса.
От: Аноним  
Дата: 07.10.08 05:24
Оценка:
Здравствуйте, xShiFT, Вы писали:
...


Благодарю, xShiFT!
Переправил код и заработало!

Всем спасибо за соучаствие!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.