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 !
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.
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.
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;
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 !
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 ?.
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.
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ą :)