Nauka Delphi

Odpowiedz Nowy wątek
2011-08-18 16:43
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 !

edytowany 1x, ostatnio: madmike, 2011-08-18 21:12

Pozostało 580 znaków

2011-08-18 16:55
terefere
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.

Pozostało 580 znaków

2011-08-18 16:59
0

Rozdział 1


Pozostało 580 znaków

2011-08-18 17:17
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.

edytowany 1x, ostatnio: Materion, 2011-08-18 17:18

Pozostało 580 znaków

2011-08-18 21:02
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;

Nie pisz do mnie PM o czymś co nie dotyczy bezpośrednio mnie. | Nie rozmawiaj ze mną jeśli brak Ci kultury (wystarczy że mi brakuje) | Nie jestem zły, jestem po prostu zły.
edytowany 4x, ostatnio: payl, 2011-08-19 15:04
Pokaż pozostałe 3 komentarze
Tak, masz rację, ale tak mam ... :D I nawet spytałem specjalistów z #fpc na IRCu, ale według nich nie powinno to mieć znaczenia. Ja tak piszę i już. (no dobra, po zastanowieniu stwierdzili że to może być problem, będę musiał się przestawić :D ). - payl 2011-08-18 22:47
KAŻDE wydziwianie może być źródłem problemu. zasada jest prosta: przeciążamy Destroy, ale wywołujemy Free. chyba że naprawdę wiemy co robimy. - Azarien 2011-08-19 00:38
Aj tam cii, toż nie mówiłem że moje rozwiązania są dobre :D . Działa? Działa! Więc jest (prawie) dobrze. w każdym razie będę wiedzieć >.> . - payl 2011-08-19 00:47
@payl: standardowe Free obsługuje Self = nil, a Twoje Free też? - vpiotr 2011-08-19 13:43
Ile razy mam powtarzać że mój błąd i robie źle? ZEJDŹCIE ZE MNIE. Dziękuje. - payl 2011-08-19 14:40

Pozostało 580 znaków

2011-08-19 00:13
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 !

Pozostało 580 znaków

2011-08-19 12:52
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 ?.

edytowany 18x, ostatnio: Materion, 2011-08-19 14:03
Pokaż pozostałe 4 komentarze
destruktor powinien przesłaniać Destroy. Pisaliśmy o tym pare komentów wyżej. A newbie są kasowane chyba po miesiącu. - maciejmt 2011-08-19 14:03
Mógłbyś jakoś to bardziej rozwinąć z tym przesłanianiem ? Jakiś mały przykład bym zobaczył co i jak, to się szybko przestawie na poprawny wzorzec. :) - Materion 2011-08-19 14:07
Ja was nie rozumiem. To że źle zrobiłem destruktor nie znaczy że przez to kod nie działa. I zrzucanie winy na mnie jest troche lamerskie, c'nie? - payl 2011-08-19 14:48
Ja widziałem w Newbie nawet tematy z 2005 roku (zobaczcie ostatnią stronę) - Newbie ... więc nie byłbym taki pewien, że to pójdzie w piach tak szybko :D - Spine 2011-08-19 20:31
No dobra, ale post pod tym payl już pokazał jak ma to wyglądać poprawnie więc już nie ma co tego ciągnąć moim zdaniem ;). - Materion 2011-08-20 11:36

Pozostało 580 znaków

2011-08-19 14:39
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.


Nie pisz do mnie PM o czymś co nie dotyczy bezpośrednio mnie. | Nie rozmawiaj ze mną jeśli brak Ci kultury (wystarczy że mi brakuje) | Nie jestem zły, jestem po prostu zły.
edytowany 8x, ostatnio: payl, 2011-08-19 15:34
Nie bierz tego tak do siebie - ale jak widać powyżej (post Materiona) błędy lubią się powielać... - vpiotr 2011-08-19 14:48
Wiesz, troche to irytuje jak 8 osoba mówi że jest źle. Zwłaszcza, gdy ten destruktor działa. Używam go w swoich programach z powodzeniem, i nie mam problemów. Mój destruktor jest GENERALNIE poprawny, ale tak jak mówiłeś nie wspiera self=nil . Więc nie wiem co się tak do tego czepiacie? I jeszcze obwiniacie mój kod o powodowanie nie wiadomo czego. Tak, błędy trzeba tępić, nie mówię nie, ale nie musicie mi wyskakiwać 10x z tym samym genialnym komentarzem że "BŁĄD" a potem "NIE DZIAŁA PRZEZ TO" - zwłaszcza że to kłamstwo. - payl 2011-08-19 15:00

Pozostało 580 znaków

2011-08-19 18:30
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ą :)

edytowany 5x, ostatnio: Materion, 2011-08-19 18:42

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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