Aangezien ik bij het werken met packages wat onverklaarbaar gedrag tegenkwam, heb ik een kleine testapplicatie gebouwd. Dit zijn de twee scenario's:
• Een executable wordt gebuild met runtime packages. Terwijl het programma draait wordt met LoadPackage nog een extra package geladen. Alles werkt normaal.
• Dezelfde executable wordt gebuild, maar nu zonder runtime packages. Terwijl het programma draait wordt met LoadPackage hetzelfde extra package geladen. Globale variabelen in de applicatie vertonen vreemd gedrag.
Al testende kwam ik erachter wat het verschil is. Als je runtime packages gebruikt worden units zoals Forms via packages geladen (Forms zit in VCL70.bpl). Als je later een extra package laadt, gebruikt dat package de Forms unit in het reeds eerder geladen package VCL70.bpl.
Als je daarentegen geen runtime packages gebruikt, worden units zoals Forms meegecompileerd in de executable. Als je later een extra package laadt dat Forms nodig heeft, laadt het op dat moment VCL70.bpl. Op dat moment heb je dus twee instanties van de Forms unit in de applicatie, namelijk de eerste die in de executable is meegecompileerd en de tweede die later via een package is geladen.
Natuurlijk geeft die tweede situatie problemen. Neem bijvoorbeeld de globale variabele Screen in de Forms unit. Alle units in de executable gebruiken de Screen variabele in de executable, terwijl alle units in het later geladen package de Screen variabelen in VCL70.bpl gebruiken. Je hebt dus opeens twee Screen variabelen!
Lang verhaal, korte vraag: hoe kan ik vanuit een met LoadPackage geladen package alsnog toegang krijgen tot de globale variabelen die zijn meegecompileerd in de executable?
Als het verhaal onduidelijk is wil ik de testcode er wel bijzetten, maar voorlopig lijkt me deze post wel lang genoeg
• Een executable wordt gebuild met runtime packages. Terwijl het programma draait wordt met LoadPackage nog een extra package geladen. Alles werkt normaal.
• Dezelfde executable wordt gebuild, maar nu zonder runtime packages. Terwijl het programma draait wordt met LoadPackage hetzelfde extra package geladen. Globale variabelen in de applicatie vertonen vreemd gedrag.
Al testende kwam ik erachter wat het verschil is. Als je runtime packages gebruikt worden units zoals Forms via packages geladen (Forms zit in VCL70.bpl). Als je later een extra package laadt, gebruikt dat package de Forms unit in het reeds eerder geladen package VCL70.bpl.
Als je daarentegen geen runtime packages gebruikt, worden units zoals Forms meegecompileerd in de executable. Als je later een extra package laadt dat Forms nodig heeft, laadt het op dat moment VCL70.bpl. Op dat moment heb je dus twee instanties van de Forms unit in de applicatie, namelijk de eerste die in de executable is meegecompileerd en de tweede die later via een package is geladen.
Natuurlijk geeft die tweede situatie problemen. Neem bijvoorbeeld de globale variabele Screen in de Forms unit. Alle units in de executable gebruiken de Screen variabele in de executable, terwijl alle units in het later geladen package de Screen variabelen in VCL70.bpl gebruiken. Je hebt dus opeens twee Screen variabelen!
Lang verhaal, korte vraag: hoe kan ik vanuit een met LoadPackage geladen package alsnog toegang krijgen tot de globale variabelen die zijn meegecompileerd in de executable?
Als het verhaal onduidelijk is wil ik de testcode er wel bijzetten, maar voorlopig lijkt me deze post wel lang genoeg
Een goede grap mag vrienden kosten.