Poslao: 12 Nov 2006 16:35
|
offline
- Pridružio: 12 Nov 2006
- Poruke: 52
|
Interesuje me kako mogu da u delphiju odradim da aplikacija koristi unite (forme, procedure, funkcije), a da one nisu definisane u uses klauzuli ?
Naime, trenutno mi je svaka forma deo aplikacije, pa aplikacija raste dodavanjem svake nove forme. I javlja se problem, da kada ispravim makar jedan red u jednoj formi, moram da izbildujem projekat i prosledim ceo .exe fajl, umesto jednog dela.
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 12 Nov 2006 17:51
|
offline
- Srki_82
- Moderator foruma
- Srđan Tot
- Am I evil? I am man, yes I am.
- Pridružio: 12 Jul 2005
- Poruke: 2483
- Gde živiš: Ljubljana
|
Da ne bi morao da svaki put saljes ceo exe fajl, forme bi mogao da drzis u dll ili bpl fajlovima. Verovatno si do sad vec upoznat bar sa dll fajlovima. Dinamicke biblioteke dozvoljavaju da kod i podatke koje sadrze koristis u svom programu. Kasnije, promenom dinamicke biblioteke, tvoj program moze dobiti nove mogucnosti ili moze drugacije izgledati.
BPL fajlovi (Borland Package Library) je specijalna vrsta dinamicke biblioteke koja dozvoljava vecu integraziju biblioteke sa programom. Jedina mana im je sto ne mogu da se koriste u drugim programskim jezicima, a i sam program i bpl moraju biti iskompajlirani istom verzijom kompajlera.
S obzirom da verovatno sam razvijas aplikacije i razvojno okruzenje ti je iskljucivo Delphi IDE, preporucio bih ti da malo bolje upoznas bpl fajlove i njihove mogucnosti.
|
|
|
|
Poslao: 25 Nov 2006 12:17
|
offline
- Pridružio: 12 Nov 2006
- Poruke: 52
|
Problem sa dinamičkim učitavanjem bpl paketa u Delphi 6.0.
Imam paket "pkgPrva.bpl" i u njemu formu "frmPrva" ( sa inicijalizacijom gde stoji sledeće
initialization
RegisterClass(TfrmPrva);
showmessage('Registracija klase "TfrmPrva" koja je u paketu');
U glavnom programu učitam paket "pkgPrva.bpl" i tu je ok, jer se učita paket i prikaže mi se poruka iz forme da je klasa forme registrovana.
Medjutim, nadalje ne uspevam da nadjem klasu forme. Šta može da bude problem.
Evo koda u glavnom programu:
procedure TForm1.btnPokreniFormuClick(Sender: TObject);
var Forma : TForm;
KlasaForme : TFormClass;
Odgovor : Hmodule;
begin
Odgovor := LoadPackage('pkgPrva.bpl');
if Odgovor > 0 then
begin
ShowMessage('Paket "pkgPrva.bpl" uèitan');
KlasaForme := TFormClass(GetClass('TfrmPrva'));
if Assigned(KlasaForme) then
begin
Forma := KlasaForme.Create(Application);
try
Forma.ShowModal;
finally
Forma.Free;
end;
end
else
ShowMessage('Klasa forme nije nadjena');
UnloadPackage(Odgovor);
end
else
ShowMessage('Paket nije pronadjen');
end;
Prilažem i celokupan kod.
mycity.rs/must-login.png
|
|
|
|
Poslao: 26 Nov 2006 15:33
|
offline
- Srki_82
- Moderator foruma
- Srđan Tot
- Am I evil? I am man, yes I am.
- Pridružio: 12 Jul 2005
- Poruke: 2483
- Gde živiš: Ljubljana
|
Koliko vidim, nisi ukljucio opciju Build with runtime packages za projekat koji treba da ucita bpl. Samo to ukljuci i radice bez problema.
BTW nemoj zaboraviti da distribuiras i standardne bpl fajlove koje tvoj program koristi (vcl, rtl, ado,...).
|
|
|
|
Poslao: 26 Nov 2006 18:46
|
offline
- Pridružio: 12 Nov 2006
- Poruke: 52
|
Hvala na informaciji. I sam sam pronašao da treba da je uključena ova opcija, ali sam mislio da ima način da prosledjujem samo svoje bpl fajlove.
U svakom slučaju hvala.
|
|
|
|
Poslao: 26 Nov 2006 19:01
|
offline
- Srki_82
- Moderator foruma
- Srđan Tot
- Am I evil? I am man, yes I am.
- Pridružio: 12 Jul 2005
- Poruke: 2483
- Gde živiš: Ljubljana
|
Ako ti se ne svidja da prosledjujes i standardne bpl fajlove, a zelis da dinamicki dodajes delove programa, moraces da koristis dll-ove, a sa njima je malo teze raditi.
Ako budes imao problema, mogu da ti napisem jedan jednostavan program koji ce kreirati formu iz dll-a.
|
|
|
|
Poslao: 27 Nov 2006 00:12
|
offline
- beli0135
- Executor
- Pridružio: 03 Jan 2005
- Poruke: 2990
- Gde živiš: Beograd
|
Ne vidim zasto je iz DLL-a teze raditi? U cemu je razlika sem sto nije preporucljivo prebacivati string i koristiti BorlandMM, vec samo PChar ali sve ostalo radi apsolutno isto.
|
|
|
|
Poslao: 27 Nov 2006 08:58
|
offline
- Srki_82
- Moderator foruma
- Srđan Tot
- Am I evil? I am man, yes I am.
- Pridružio: 12 Jul 2005
- Poruke: 2483
- Gde živiš: Ljubljana
|
Koliko znam (ispravi me ako nisam upravu) nije moguce prosledjivati instance klasa izmedju DLL i aplikacije, a izmedju BPL i aplikacije je moguce. Ako se koristi Forms unit u DLL Application objekat nije isti kao Application objekat u aplikaciji, a kod BPL je isti kao i u aplikaciji. Da li RegisterClass moze da se koristi u DLL, pa da se kreira instanca klase u aplikaciji koristeci FindClass?
|
|
|
|
Poslao: 27 Nov 2006 11:30
|
offline
- beli0135
- Executor
- Pridružio: 03 Jan 2005
- Poruke: 2990
- Gde živiš: Beograd
|
- Ne, application objekat nije isti, naravno.
- Ne nije moguce prebaciti instancu klase onako kako se to inace radi ali je moguce prebaciti pointer i to TypeCast-ovati
- RegisterClass, ne, i ne treba ti, neces komponente gurati u DLL pa da ih registrujes unutar delfija.
- Findclass radi
Inace, DLL je zamisljen da bude kao jedna celina, ne zavisna od host aplikacije pa je tako i treba koristiti. Inace, mozes celu aplikaciju da napravis u DLL-u, ne znam u cemu je problem?
|
|
|
|
Poslao: 27 Nov 2006 12:46
|
offline
- Srki_82
- Moderator foruma
- Srđan Tot
- Am I evil? I am man, yes I am.
- Pridružio: 12 Jul 2005
- Poruke: 2483
- Gde živiš: Ljubljana
|
Citat:Ne vidim zasto je iz DLL-a teze raditi? U cemu je razlika sem sto nije preporucljivo prebacivati string i koristiti BorlandMM, vec samo PChar ali sve ostalo radi apsolutno isto.
Citat:- Ne, application objekat nije isti, naravno.
- Ne nije moguce prebaciti instancu klase onako kako se to inace radi ali je moguce prebaciti pointer i to TypeCast-ovati
- RegisterClass, ne, i ne treba ti, neces komponente gurati u DLL pa da ih registrujes unutar delfija.
- Findclass radi
Toliko o apsolutnoj slicnosti
Nigde nisam rekao da sa dll ne mozes da napravis cak i celu aplikaciju, a rekao sam da je lakse raditi sa bpl jer moguce koristiti objekte kao sto je Application bez ikakvih problema, prebacivanje instanci iz bpl u aplikaciju i obrnuto se radi isto kao i kad se prebacuju izjedne u drugu funkciju u samoj aplikaciji, klasa koja se registruje u bilo kom bpl se vidi i u svim ostalim i u glavnoj aplikaciji. Niko ne kaze da uz pomoc dll to ne moze da se uradi (bpl je i sam dll), ali za to treba vise znanja. Lakse je pocetniku da u bpl samo pozove ShowMessage kao sto je oduvek i radio, nego da prosledjuje dll handle prozora koji treba da bude parent pa da poruku kreira funkcijom MessageBox da se u task baru ne bi pojavio jos jedan prozorcic.
BTW probao sam da prosledim TBitmap objekat na nacin koji si opisao (kreirao sam objekat u dll i vratio kao pointer aplikaciji koja je zatim taj pointer castovala ponovo u TBitmap), ali kad pokusam da koristim taj objekat dobijem access violation. Moze li jedan mali primer kako bi to trebalo da se uradi jer ja vec ne znam sta radim pogresno.
|
|
|
|