@szod - trochę Cię nie rozumiem... Przecież Lazarus działa praktycznie identycznie jak Delphi, więc raczej nie ma mowy o niezgodności w tak podstawowej sprawie;
Postanowiłem sobie podzielić projekt na dwa pliki *.pas. Dodałem plik do projektu i tutaj praktycznie zaczynają się schody. W tym dodatkowym pliku nie mogę za nic dostać się do właściwości czegokolwiek z projektu.
O jakich właściwościach mowa? Żeby z poziomu jednego modułu mieć dostęp do danych z drugiego modułu, dane do których potrzebujesz mieć dostęp muszą być zadeklarowane w sekcji Interface - inaczej nie będzie ich widać; W przypadku obu środowisk, nie uzyskasz dostępu bezpośrednio do danych zadeklarowanych i/lub zdefiniowanych w sekcjach Implementation, Initialization i Finalization;
Wiem że należy użyć uses, ale to nic nie daje, a kombinowałem różnie, włącznie z umieszczaniem uses w sekcji implementation.
Jeśli oba moduły muszą wskazywać na siebie nawzajem, to niestety ale w jednym z nich musisz dodać ten drugi w sekcji Implementation - inaczej dostaniesz błąd circular reference to unit XXX
; Tak jest w obu środowiskach, nie tylko w Lazarusie;
Jak to powinno być prawidłowo wykonane?
Wielu sposobów nie ma:
unit Main;
interface
uses
Add;
implementation
end.
unit Add;
interface
implementation
uses
Main;
end.
Ewentualnie na odwrót, w zależności od przypadku; Schody zaczną się, jak w obu modułach będziesz potrzebował użyć np. typu w sekcji Interface, który zadeklarowany jest także w tej samej sekcji; Czyli w obu modułach musiałbyś dodać nazwy unitów w sekcji Interface, co spowosuje błąd kompilacji o zapętleniu; W takim przypadku można np. użyć trzeciego modułu pośredniczącego lub innych trików;
No i w porządku, w unit.pas mogę używać tego co jest w add.pas. Ale jak zrobić, żeby dodatkowo w add.pas można było dostać się do właściwości np. formularza? To mi się nie udało.
Najprościej? Przekazać obiekt formularza w parametrze; Sam parametr zadeklaruj jako TObject
, a w ciele metody w której chcesz się odnieść do właściwości formularza, rzutuj parametr na właściwy typ klasy formularza za pomocą operatora As; To już będzie się odbywać w sekcji Implementation, więc jeśli w tej sekcji dodasz główny moduł do listy Uses, to będziesz mógł skorzystać z nazwy klasy formularza do rzutowania.