Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Lazarus - DBAccess.Create sa nevykoná

Chcel by som radu, lebo už som zúfalý. Čo robím zle? V projekte sa má vo formulári v OnCreate zavolať DBAccess.Create, ale program síce do konštruktora vojde, ale z beginu hneď vyskočí. Netuším prečo. Vedel by mi niekto vysvetliť, prečo sa tak deje? Súvislosť s chýbajúcim DLL pre SQLite to nemá, pretože neexistuje objekt DBAccess a teda sa nemôže zavolať metóda Open.

Předmět Autor Datum
Co se stane, kdyz das pryc to prirazeni handleru chyby na zacatku OnCreate?
Jan Fiala 03.10.2013 21:23
Jan Fiala
Ďakujem za pomoc. V tom chyba nebola. Práve mi odpísali aj na Lazarus fóre. Problém bol v tom, že so…
msx. 03.10.2013 21:37
msx.
Ta první syntax nemůže fungovat, protože odkazuješ na objekt (DBAccess), který ještě neexistuje. V J…
Rce. 04.10.2013 02:12
Rce.
Fungovat by to mohlo, pokud by to prekladac zastresil tou druhou konstrukci. Ale to uz se dostavame…
Jan Fiala 04.10.2013 06:53
Jan Fiala
To neviem. Viem len toľko, že niekde vo wiki som našiel, že ten zápis je ekvivalentný. Predpokladám,… poslední
msx. 04.10.2013 10:57
msx.

Ďakujem za pomoc. V tom chyba nebola. Práve mi odpísali aj na Lazarus fóre. Problém bol v tom, že som použil novú Lazarusovu syntax, ktorá zrejme nefunguje správne:

DBAccess.Create(Self);

Funguje len:

DBAccess:=TDBAccess.Create(Self);

Toto bolo treba pomeniť pre všetky objekty a už to funguje. Nechápem, ale prečo teda píšu, že funguje aj táto syntax. Žiaľ neviem to teraz na wiki Lazara nájsť.

Ta první syntax nemůže fungovat, protože odkazuješ na objekt (DBAccess), který ještě neexistuje. V Javě by to tak fungovat možná mohlo, ale Pascal si důsledně hraje na typovou čistotu a správnost a objektovou existenci. Jestli nějaký horlivec to tak v Lazarusu povolil zapisovat taky, tak bych ten zápis stejně nepoužil - je matoucí a držel se pascalsky správného druhého způsobu přiřazení vytvořeného objektu do proměnné.

Fungovat by to mohlo, pokud by to prekladac zastresil tou druhou konstrukci.
Ale to uz se dostavame do stavu, kdy uz skoro nerozhodujes o vytvareni a ruseni objektu.
Co by se stalo, pokud by promenna DBAccess uz obsahovala odkaz na objekt? Zrusit jej? nebo nechat, ale pak ztratis ukazatel?

To neviem. Viem len toľko, že niekde vo wiki som našiel, že ten zápis je ekvivalentný. Predpokladám, že by sa to tvárilo, ako keby to bolo napísané tým správnym spôsobom, čiže by sa alokovaná pamäť stratila. Na druhej strane, myslím, že Delphi toto zakazuje ešte počas kompilácie a vyhodí chybu. Lazarus nie a preto som myslel, že je to v poriadku. Tuším sa tam písalo, že je to zavedené kvôli skráteniu zápisu. Ono v podstate taký zápis má logiku, pretože je vlastne jasné, že by to malo objekt vytvoriť, hoci podľa najprísnejšej logiky je to trochu zvláštny zápis. V každom prípade, vidím, že najlepšie je držať sa starých osvedčených zápisov. Niekde vo wiki som ešte čítal, že volanie metód takto "Metoda();" a takto "Metoda;" v Lazarovi nie je to isté a treba používať prvý zápis, ale už aj to začínam brať s rezervou, pretože doplňovač kódu dáva väčšinou ten druhý zápis.

Zpět do poradny Odpovědět na původní otázku Nahoru