Dołączanie nowych plików do projektu w Lazarusie

0

Witam,

Coś ciężko mi idzie w tym Lazarusie ;) 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. 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. Jak to powinno być prawidłowo wykonane? Zakładając że jest plik główny unit.pas i plik dodatkowy add.pas, to w unit.pas w sekcji interface dodaję plik add.pas do pozostałych modułów w uses. 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.

0

Musisz zrozumieć podstawy OOP.
Formularz nie koniecznie jest jeden, może być wiele jego egzemplarzy, więc jeżeli chcesz działać na którymś z nich to zwyczajnie przekaż do funkcji lub innej klasy obiekt tego formularza.
Aczkolwiek jest to brzydkie podejście.
O tym oraz o wielu innych rzeczach znajdziesz w byle kursie z podstawami OOP.

0

Pisałem kiedyś trochę w Delphi i takich problemów nie było. Umieszczałem uses z nazwą pliku w drugim pliku i na odwrót i mogłem latać po wszystkim bez problemów. Tylko właśnie ważne było miejsce tego uses z tego co pamiętam. Ale tutaj mi się to nie udało.

0

Masz trzy możliwości:

  1. Borykaj się z tym sam
  2. Spytaj na forum wróżbitów
  3. Pokaż kod
0
_13th_Dragon napisał(a):

Masz trzy możliwości:

Borykaj się z tym sam

Ja się borykał nie będę, po prostu wrócę do Delphi jak tak dalej pójdzie. Tam się człowiek nie martwił że coś nie działa, albo czegoś brakuje. Chciałem spróbować Lazarusa bo wygląda dość porządnie.

_13th_Dragon napisał(a):

Spytaj na forum wróżbitów

Znam kilka, ale wątpię że będą znać odpowiedź ;P

_13th_Dragon napisał(a):

Pokaż kod

Tutaj nie ma co pokazywać.

3

@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.

0

Dzięki furious programming za wyjaśnienia. Tak właśnie robiłem z tymi uses. Ale zdaję się, że popełniłem przy okazji inne błędy przez co to wszystko nie działało jak powinno. Dawno nic nie programowałem to i z głowy uleciało trochę informacji. Przemyślę na spokojnie i pewnie znajdę rozwiązanie, bo jakieś być musi ;)

0

Ja tylko podpowiem, że powinieneś przede wszsytkim czytać i starać się rozumieć błędy kompilacji - w ich jest co prawda krótka informacja, ale wystarczy do namierzenia błędu; A jeśli skopiujesz sobie taki błąd i wkleisz do Google, to znajdziesz nie jeden wątek z wyjaśnieniem (najwięcej jest po angielsku, ale są liczne przykłady);

Ewentualnie jak czegoś nie będziesz umiał sam naprawić, to w poście przede wszystkim wklej treść błędu(ów), tak aby czytelnicy dokładnie wiedzieli co się dzieje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1