Nauka Delphi

0

Witam, mam bardzo proste pytanie. Mam zamiar zacząć pisać programy w Delphi, ale zastanawia mnie czy pierw muszę nauczyć się zwykłego pascala a następnie object pascala, czy mogę od razu zacząć od ksiązki do nauki Delphi/Object Pascal ? Co mi polecacie ?
Dziękuję za każdą odpowiedź i radę i pozdrawiam !

0

Ja polecam kompedium z tej strony. Samego pascala nie musisz się uczyć i nawet bym odradzał. Jeśli dokładnie przerobisz całe kompedium to na pewno zbliżysz się ogromnie do TAO programowania w delphi.

0

Ok przeglądnąłem sobie ten kurs, niedługo zacznę zgłębiać go, jednak już w klasach/obiektach widzę różnicę w delphi a C/C++/C#. Mógłby ktoś miły napisać mi jakby wyglądała prosta klasa w Delphi ? Np klasa samochod. Pola - rok, numer seryjny, predkosc. Metody: uruchom - metoda wypisuje na ekranie napis "wruuuuum", zwolnij - metoda wypisuje napis "zwalniam" oraz odejmuje -5 od pola prędkość. No i utworzenie jakiegos tam samochodu na podstawie tej klasy i wywolanie tych metod.

Dziękuję ślicznie.

P.S
Wcześniej uczyłem się języków C pochodnych no i jak patrze jak w delphi piszę się metody dla klas to na pierwszy rzut oka mam mętlik.

0

Proszę bardzo, bez wszystkiego, ale nawet dorzuciłem konstruktor i destruktor!

type
  TSamochodzik=class
     public
     constructor Create;
     destructor Free;
     procedure Uruchom;
    protected{chociażby}
     rok:integer;
    [...]
     end;

[...]
constructor TSamochodzik.Create;
begin
[...]
end;
destructor TSamochodzik.Free; //AAAaaa źle, rozwiązanie tego problemu poniżej
begin
[...]
end;
procedure TSamochodzik.Uruchom;
begin
  writeln('Wruum ^.^');
end;
[...]

Wywołanie:
var
 s:TSamochodzik;
begin
  s:=TSamochodzik.Create;
  s.Uruchom;
  s.Free;
0

Dzięki, teraz już rozumiem jak to wygląda w Delphi ;). Trzeba było się trochę przestawić z C podobnych, ale jest ok :). Dzięki wielkie za udzieloną pomoc !

0

Podbijam watek, gdyz mam nowe pytanie. Daje wam tutaj kawalek kodu

program klasa;
uses Crt;

type
  Tsamochodzik = class
    public
      zaparkowany : integer;
      maxPredkosc : integer;
      predkosc : integer;
      rok : integer;
      constructor Create;
      destructor Free;
      procedure wyswietlRok;
      procedure Uruchom;
      procedure dodajGazu;
      procedure Hamuj;
      procedure wyswietlPredkosc;
      procedure Parkuj;
  end;
constructor Tsamochodzik.Create;
begin
     writeln('Tworze nowy obiekt klasy Tsamochodzik!');
end;
destructor Tsamochodzik.Free;
begin
     writeln('Niszcze obiekt klasy Tsamochodzik!');
end;
procedure Tsamochodzik.Uruchom;
begin
     zaparkowany:= 1;
     writeln('Uruchamiam silnik!');
     writeln('Wruuuuum!');
end;
procedure Tsamochodzik.wyswietlRok;
begin
     writeln('Rocznik samochodu - ',rok);
end;
procedure Tsamochodzik.Hamuj;
begin
     begin
          writeln('Hamuje!');
          predkosc -= 5;
          wyswietlPredkosc;
     end;
end;
procedure Tsamochodzik.wyswietlPredkosc;
begin
     writeln('Predkosc z ktora jade ',predkosc);
end;
procedure Tsamochodzik.dodajGazu;
begin
     writeln('Dodaje gazu!!');
     predkosc += 5;
     wyswietlPredkosc;
end;
procedure Tsamochodzik.Parkuj;
begin
     while predkosc > 0 do
     begin
          writeln('Parkuje!');
          predkosc -= 5;
          wyswietlPredkosc;
          delay(800);
          if predkosc <= 0 then
          begin
            zaparkowany:= 0;
            Free;
            break;
          end;
     end;
end;

var
  s:Tsamochodzik;
  wybor:char;

begin
   s:=Tsamochodzik.Create;
   s.zaparkowany:= 0;
   s.predkosc:= 0;
   s.maxPredkosc:= 90;
   s.rok:=1993;
   s.wyswietlRok;
   s.Uruchom;
   while s.zaparkowany = 1 do
   begin
        writeln('Co chcesz zrobic?');
        writeln('d - dodac gazu');
        writeln('h - hamowac');
        writeln('p - parkowac');
        read(wybor);
        if wybor = 'd' then s.dodajGazu;
        if wybor = 'h' then s.Hamuj;
        if wybor = 'p' then s.Parkuj;
   end;
end.

Mógłby ktoś mi powiedzieć, dlaczego gdy wybiorę którąś z opcji - d, albo h po wykonaniu metody dzieje się coś dziwnego, dam screena by nie opisywać.
http://img42.imageshack.us/img42/3036/dziwneq.jpg
Dlaczego tak mi powtarza te writeln trzykrotnie zanim można wprowadzić dane?
Za pomoc i wytłumaczenie dlaczego tak się dzieje i co źle zrobiłem serdecznie dziękuje :)

EDIT
Śmieszne, jak użyje do sprawdzania czy samochód jest zaparkowany integera (0-zaparkowany, 1-niezaparkowany) to działa cacy, pętla while s.zaparkowany = 1 do się nie wykonuje gdy s.zaparkowany = 0. Jednak gdy użyje zamiast integera booleana (true - zaparkowany, false - niezaparkowany) to ta glupia petla while s.zaparkowany = false do wykonuje sie nawet jesli s.zaparkowany:= true. O co w tym chodzi ?.

0

Ponieważ piszemy poprawnie a nie słuchamy Payla to...
Destruktor ma wyglądać tak:

type
  TCos=class
[...]
    destructor Destroy; override;
[...]

destructor TCos.Destroy;
begin
[...]
end;

I nadal wywołujemy Free (którego nie mamy, ale jest ono dziedziczone po TObject bodajże).

I BTW. Może zejdziecie już ze mnie.

EDIT:
W twoim kodzie nie wywołujesz s.Free - które jest potrzebne do zwolnienia zasobów (tak, Free, nie ważne czy użyjesz mojej bardzo źłej metody [która notabene odpowiada za wszystkie katastrofy na świecie] czy poprawnej z Destroy).
A poza tym wszystko wygląda jak dla mnie ok, program działa jak powinien >.>

EDIT #2: Już mam. NIE WOLNO dostawać się do obiektu po tym jak zostanie on zwolniony. U ciebie po zaparkowaniu wywołujesz Free czyli nie powinieneś już się w ogóle komunikować z tą klasą. A wykonujesz s.zaparkowany.
Wynik? Wywal free z parkuj i daj na koniec programu.

EDIT #3: Bardziej kosmetyczne: gdy czytasz znak, użyj ReadLn lub ReadKey, nie read.

0

Rozwiązałem, zamiast read zastosowałem readln i już wszystko działa cacy ! Dziękuję wszystkim osobom (szczególnie paylowi, który podał mi wzor jak to ma wyglądać), które się tutaj wypowiedziały za pomoc i wsparcie :). Coraz bardziej zaczyna mi się podobać ten język i środowisko, przejrzyste i proste :). I miło, że jak się ma z czymś problem można zapytać a ludzie najczęściej pomogą :)

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