var
OleApplication : Variant;
begin
OleApplication := CreateOleObject('Excel.Application');
end;
kiedy probuje kompilowac wyswietla undelcared identifier ?
CO mozna poradzic ?
Oczywiście że mam zainstalowanego excela. Nie o to chodzi.
Te same procedury korzystania z pliku excela w Delphi w jednym projekcie (nowo otwarym) działają bez problemów (ten sam komputer, to samo środowisko Delphi ale nowy projekt) a w projekcie (MDI) do któego chce to dodać przestaje działać i pokazuje ten błąd:
"Variant does not reference an automation object."
I kompletnie nie wiem o co chodzi, Jeśli ktoś sie z tym już spotkał to prosze o pomoc !
MisiekD masz gg ?
MisiekD Dzięki wielkie za rozwiązanie problemu. Brakowało mi tej linii. Zaoszczedziłeś mi kupe czasu w szukaniu problemu bo kwestie excela chce dodać do dość rozbudowanego programu i czekalo mnie bardzo dużo kopania w źródłach a tak sprawa sie wyjaśniła
Dzięki wielkie :)))))))))))
MisiekD nie szukasz czasem pracy tak sobie dorobić przy programowaniu w Delphi?
Tak w ogóle wisze Ci zgrzewe :). Pozdrawiam
Misiekd napisał(a)
dodanie tej linijki powoduje wykonanie się sekcji initialization modułów dodanych do Twojego projektu, w tym winowajcy ComObj
Że jak? Coś pomyliłeś. Sekcja "initialization" każdego modułu wykonuje się niejako automatycznie (dba o to kompilator).
W Application.Initialize moż byc co najwyżej (m.in.) wywołane CoInitialize() lub OleInitialize(), które to wpływa na możność tworzenia obiektów OLE Automation.
Morris napisał(a)
Że jak? Coś pomyliłeś. Sekcja "initialization" każdego modułu wykonuje się niejako automatycznie (dba o to kompilator).
no fakt, masz rację - trochę przekolorowałem
W Application.Initialize moż byc co najwyżej (m.in.) wywołane CoInitialize() lub OleInitialize(), które to wpływa na możność tworzenia obiektów OLE Automation.
a tu nie dokońca tak jest bo Application.Initialize tak na prawdę wywołuje procedurę (bezparametrową) InitProc, która w "czystej" aplikacji wskazuje na nil i jest pomijana, czyli na dobrą sprawę nie robi nic. Pod InitProc można podstawić własną procedurę, niektóre unity (jak np. ComObj) podstawiają tam własną procedurę inicjalizującą (w tym konkretnym przypadku) obiekty COM. Ponieważ procedura InitProc może być tylko jedna stosowana jest sztuczka, która polega na zapamiętaniu "starej" procedury a następnie podstawieniu własnej. W ciele naszej procedury natomiast sprawdza się, czy InitProc <> nil i jeśli tak to wywołuje się ją. Pozwala to na podpięcie się pod InitProc większej liczby procedur.
Sama InitProc (o ile Application.Initialize jest na swoim miejscu) wywoływana jest po wykonaniu wszystkich poleceń z wszystkich modułów z sekcji initialization a przed właściwym startem aplikacji.
Bynajmniej pomogło nawet w dwóch sprawach:
Nie wiem dla czego nie było tej lini w programie. Prace nad programem przejąłem po kimś i co jakiś czas natrafiam na takie niespodzianki.
Pozdrawiam i dzieki za pomoc