Klasa a procedury z parametrami

0

Witam,

jako że używam Delphi 7 nie mogę w rekordzie umieścić metody więc korzystam z klasy. Właściwie o klasach zacząłem uczyć się od niedawna. Już mówię w czym rzecz.

Chcę napisać własny unit z najczęściej używanymi przeze mnie procedurami, funkcjami etc. Nazwałem go "RS". W module tym stworzyłem klasę dziedziczącą po TObject:

type
  RS = class (TObject)
       procedure kom(var tekst: string; var okno: string; var flaga: byte);
  end;

Na innej formie gdy chcę skorzystać z tego modułu (oczywiście do uses dopisuję "RS") stworzyłem zmienną globalną typu tej klasy którą nazwałem "myRS". Dla tej formy w zdarzeniu OnCreate zapisałem kod:

  myRS := rs.Create;

A dla OnClose:

  myRS.Free;

I teraz do rzeczy - gdy chcę oprogramować zdarzenie powiedzmy przycisku, aby wykonywało metodę zdefiniowaną w klasie RS z modułu RS_, pojawia mi się błąd o treści "[Error] Glowna_Unit.pas(942): Constant object cannot be passed as var parameter". Oto kod przycisku:

procedure TForm1.Button1Click(Sender: TObject);
begin
  myRS.kom('Tresc', 'Okienko', 1);
end;

A oto metoda zadeklarowana i zdefiniowana w klasie RS:

procedure RS.kom(var tekst: string; var okno: string; var flaga: byte);
begin
{
1: Information
2: Confirmation
3: Warning
4: Stop
}
  case flaga of
    1: Application.MessageBox(PChar(tekst), PChar(okno), MB_OK+ MB_ICONInformation);
    2: Application.MessageBox(PChar(tekst), PChar(okno), MB_OK+ MB_ICONExclamation);
    3: Application.MessageBox(PChar(tekst), PChar(okno), MB_OK+ MB_ICONWarning);
    4: Application.MessageBox(PChar(tekst), PChar(okno), MB_OK+ MB_ICONStop);
  end;
end;

Jest to metoda publiczna. Nie wiem dlaczego błąd się pojawia, ponieważ parametry oznaczone są przez słowo var (nie są stałe) a w komunikacie chodzi o stały parametr (chyba że ja coś źle rozumiem). W czym tkwi błąd?

Pozdrawiam sredecznie!

1

OK już działa - musiałem w nagłówkach pousuwać "var". Ale właściwie dlaczego nie chciał się z tym kompilować? Pytam już czysto z ciekawości.

0

var oznacza że wewnątrz metody/procedury chcesz ten parametr zmieniać tak aby zmiany byli widoczne w miejscu wywołującym.

0

@_13th_Dragon wyjaśnił Ci już o co chodzi; Mam jednak wskazówki co do kodu;

1. Sumowanie masek

Od kiedy to maski się do siebie dodaje operatorem +..? Robi się to za pomocą operatora alternatywy Or:

MB_OK or MB_ICONINFORMATION

2. Optymalizacja

Zamiast cztery razy zapisywać funkcję Messagebox - zrób to raz, a do wybrania typu ikony do okna dialogowego zastosuj macierz statyczną:

procedure Kom(const Tekst, Okno: String; const Flaga: Byte);
const
  ID_PRZYCISKU: array [1 .. 4] of Byte = (MB_ICONINFORMATION,
                                          MB_ICONQUESTION,
                                          MB_ICONWARNING,
                                          MB_ICONSTOP);
begin
  // Application.MessageBox(PChar(Tekst), PChar(Okno), MB_OK or ID_PRZYCISKU[Flaga]);
     Application.MessageBox(PChar(Tekst), PChar(Okno), ID_PRZYCISKU[Flaga]);
end;

Flagi MB_OK nie musisz dodawać bo jest flagą domyślną; Poza tym flagi MB_ICONEXCLAMATION i MB_ICONQUESTION mają te same wartości - zamieniłem ją na flagę MB_ICONQUESTION bo pewnie o nią Ci chodziło;


Trochę dziwnie będzie to okienko wyglądać, jak dla flagi MB_ICONQUESTION czy MB_ICONWARNING będzie tylko przycisk Ok :]

0

1.Jeżeli metoda nie korzysta z pól klasy, po co utrudniać sobie życie i robić z tego klasę na siłę?
2.

jako że używam Delphi 7 nie mogę w rekordzie umieścić metody więc korzystam z klasy

Ten feature nazywa się advanced records; istnieje bodajże od Delphi 2009 oraz FPC 2.4.4 - sugerowałbym zakup (w przypadku Delphi) lub pobranie (w przypadku FPC) któregoś z nich, ponieważ Delphi 7 jest stare jak cholera i po prostu nie opłaca się w nim pisać (nawet początkującym).

0

Ja się zgadzam z przedmówcami i dodaję:

  1. Klasa powinna się nazywać na T.
  2. Nie ma sensu abyś tą metodę miał w klasie ponieważ nie jest ona z nią w żaden sposób związana. Jak robisz klasę to masz wiedzieć za co ona odpowiada... A nie ma być zbiorem 'tego co mi się podoba'.

Chcę napisać własny unit z najczęściej używanymi przeze mnie procedurami, funkcjami etc.

Najczęściej to zapewne używasz funkcji z modułu system. Ale ja jestem zwolennikiem posiadania wielu modułów które mają działanie związane z czymś. Ale jeżeli jesteś początkującym to dobre i to.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.