Tworzenie klasy

0

Do tej pory korzystałem z klas tworząc z nich komponenty, teraz chciałbym wykorzystać je w nieco inny sposób. Mam następujący kod

unit MojaKlasa;

{$mode delphi}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs;

type
  MojaKlasaa = class
    A: Integer;
    procedure Wiadomosc;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

procedure MojaKlasaa.Wiadomosc;
begin
  //A := 1;
  ShowMessage('Dziala');
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Klasa: MojaKlasaa;
begin
  Klasa.Wiadomosc;
end;

end. 

Z tego co czytam, A jest polem, którego wartość chciałbym zmienić korzystając z metody Wiadomosc. Powoduje to błąd. Czytałem też że przed użyciem klasy trzeba wywołać jej konstruktor. Niestety dodanie Klasa.Create również wywołuje błąd.

1

Przydało by się wrócić do książek, bo masz spore braki w wiedzy, a już dłubiesz w aplikacjach okienkowych, w pełni obiektowych. Robisz sobie krzywdę – to poważny błąd.

lucasp17 napisał(a):

Z tego co czytam, A jest polem, którego wartość chciałbym zmienić korzystając z metody Wiadomosc.

A jest polem, w tym przypadku publicznym, które może być modyfikowane bezpośrednio (skoro jest publiczne).

Powoduje to błąd.

Treść błędu potrzebna.

Czytałem też że przed użyciem klasy trzeba wywołać jej konstruktor.

Tak – najpierw należy stworzyć instancję klasy (inaczej zwaną obiektem), aby móc wykorzystywać jej funkcjonalność. W przeciwnym razie dostaniesz wyjątek dotyczący odwoływania się do niezaalokowanej pamięci. Konstruktor tę pamięć alokuje, następnie używasz obiektu, a na koniec musisz ten obiekt zwolnić za pomocą Free – jeśli tego nie zrobisz to spowodujesz wyciek pamięci.

Schemat wygląda tak:

var
  MojObiekt: TMojaKlasa;
begin
  // tutaj obiekt jeszcze nie istnieje, więc nie możesz wołać metod i modyfikować pól, bo SIGSEGV

  MojObiekt := TMojaKlasa.Create(); // utworzenie instancji klasy i wrzucenie jej do zmiennej
  MojObiekt.JakasMetoda(); // wywołanie metody obiektu
  MojObiekt.Free(); // zwolnienie pamięci po obiekcie

  // tutaj obiekt już nie istnieje, więc nie możesz go używać, bo SIGSEGV

Niestety dodanie Klasa.Create również wywołuje błąd.

Treść błędu podaj, a także kod, który ten błąd wywołuje. Przecież nie będziemy się bawić w zgadywanie.

0

W przypadku próby przypisania wartości do A jest następujący błąd Project project1 raised exception class 'External: SIGSEGV'.

Co do moich braków, wiem że są, ale też wiem, że będą. Moje programowania to dla mnie czysta zabawa od kilku lat. Wielu podstawowych rzeczy na pewno nie wiem, staram się wszystko robić w jak najprostszy sposób i dla mnie najważniejsze jest by coś działo tak jak chcę, a są to proste rzeczy raczej, nie zabierałbym się za coś mega skomplikowanego. Ale sprawia mi frajdę gdy coś działa jak bym chciał, albo jak nagle wpadam na jakiś pomysł i coś z niego realizuje później.

Co do drugiego błędu, to był mój błąd.

0
lucasp17 napisał(a):

W przypadku próby przypisania wartości do A jest następujący błąd Project project1 raised exception class 'External: SIGSEGV'.

Czyli spróbowałeś zmodyfikować wartość pola obiektu, który w pamięci nie został utworzony. Przykład z poprzedniego mojego postu zawiera odpowiedź – najpierw Create, a później używanie.

Co do moich braków, wiem że są, ale też wiem, że będą. Moje programowania to dla mnie czysta zabawa od kilku lat.

Pamiętaj, że programowanie hobbystyczne nie musi oznaczać błądzenia po omacku, skoro to tylko zabawa. Musisz zacząć od nauki podstaw i powoli piąć się coraz wyżej, do coraz bardziej złożonych elementów języka. W ten sposób oszczędzisz masę czasu, a przyjemność z programowania będzie dużo większa. ;)

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