Dodawanie pliku PAS

0

Witam

POtrzebuje banalnej pomocy - chodzi mi o dołączanie dodatkowych plików pas. Sytuacja jest taka ze mam plik pas z hierarchią klas, w formatce dolaczam ten plik w sekcji uses i tworze obojętnie gdzie obiekt tego typu. i jak naraize jest wszystko OK. ale jest problem gdy chce <ort>urzyc </ort>jakiejś metody zdefiioanej w tej jakiejsc klasie wyskakuje blad typu "EAccesViolation" i nastepuje wysypanie programu. Prosze o pomoc bojuz jestem troche zirytowany.
Najlepiej jakby ktoś z forumowiczow napisal dokładny opis jak dodać plik pas do formatki bo taki pełny opis napeno sie tez przyda innym czytelnikom :) i mnie tez :D

Pozdrawiam :D</ort>

0

A próbowałeś użyć debuggera i sprawdzić, gdzie dokładnie jest błąd?

0

Gdy potrzbuję dołączyć do projektu zewnętrzny plik *.pas to w Delphi6, w menu "Project" wybieram pozycję "Add To Project..." i... wyskakuje odpowiednie okienko dialogowe. Czy o to chodziło?

0

Access Violation podczas korzystania z klas występuje często, jeśli metoda została wywołana przed utworzeniem obiektu danej klasy (czyli odnosi się do elementu nieistniejącego w pamięci). Dotyczy to również klas wchodzących w skład innej klasy, np:

TKlasaA = class
(...)
end;

TKlasaB = class
private
  FPole: TKlasaA;
(...)
end;

Klasa TKlasaA musi zostać utworzona (np. w kontruktorze klasy TKlasaB) przed jej użyciem:

constructor TKlasaB.Create;
begin
inherited Create;
FPole:= TKlasaA.Create;
end;

Jeśli klasy, które tworzyłeś były dość złożone sprawdź, czy gdzieś nie zapomniałeś przydzielić pamięci jakiemuś elementowi. Dołączanie dodatkowych unitów do formatki nie ma tu nic do rzeczy. Jeśli brakowałoby jakiejś części kodu program w ogóle by się nie skompilował.

0

OKI to jednak byl konstruktor. zle go urzywalem przy tworzeniu obiektu.
ale teraz mam inny problem wlasnie z konstruktorami
jak zrobic tablice dynamiczna obiektow innej klasy - chodiz mi czy trzeba dla nich wywolywc tez konstruktor dla wsyzstkich obiektow tej tablicy ??

type
    TDrzewo = class(TPokolenie)
      public
        constructor Create;
        
      private
        nazwa   : String;       // nazwa projectu
        projekt : String;       // sciezka do projektu
        pokolenia : array of TPokolenie;
    end;

TPokolenie jes deklarowane powyzje ale nie wazne bo jest jescze kilka clas ponad tym, wiec teraz mam problem jak np w konstruktorze zrobic tablice dynamiczna typu clasy TPokolenie. czy nalezy zrobic pętelke for ażeby uruchomić recznie wsyzstkie konstruktory - mam nadzieje ze nie ;-/

pozdrawiam i czekam na odpowiedz ;-D</email></cpp>

0

Pracuję aktualnie nad programem, który używa dynamicznych tablic obiektów. Jedyne co udało mi się wymysleć to właśnie pętelka (nie zapomnij najpierw ustawić rozmiaru tablicy ;P). Może nie jest to specjalnie elegancki i szybki sposób, ale skuteczny i pewny (o ile w ogóle jest jakikolwiek inny sposób). Jeśli do odpalenia obiektu danej tablicy potrzebujesz wielu instrukcji (np. żeby poustawiać wartości pól, itd.) napisz osobnego konstruktora dla obiektów tej klasy, później wystarczy go odpowiednio wywołać w pętelce. Dzięki temu kod powinien być bardziej czytelny.

Jeszcze jedno: Jeśli chcesz by dynamiczna tablica elementów stanowiła Właściwość klasy, to musisz zdefiniować metody dostępowe do elementów tablicy (Osobna metoda dla odczytu i osobna dla zapisu wartości), nawet jeśli elementami tablicy będą liczby, stringi, czy inne typy proste.
Mały przykładzik:

TKlasaA = class
private
  (...)
public
  constructor Create({parametry jeśli są potrzebne});
  (...)
end;

{*********************}

TKlasaB = class
private
  FPole = Array of TKlasaA;
  function GetPole(Index: Integer): TKlasaA;          //Index to numer komórki w tablicy
  procedure SetPole(Index: Integer; Value: TKlasaA);  //Value to wartość jaką chcemy ustawić w komórce
public
  constructor Create({parametry (np. rozmiar tablicy) });
  property KlasaA[Index: Integer]: TKlasaA read GetPole write SetPole;
end;

{*********************}

constructor TKlasaA.Create();
begin
inherited Create;
(...)
end;

{*********************}

constructor TKlasaB.Create();
var
 K: Integer;
begin
inherited Create;
For K:= 0 to RozmiarTablicy do FPole[K]:= TKlasaA.Create();
(...)
end;

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