Klasa a procedury z parametrami

2013-06-19 18:24

Rejestracja: 14 lat temu

Ostatnio: 1 miesiąc temu

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!

edytowany 1x, ostatnio: Reiko, 2013-06-19 18:26

Pozostało 580 znaków

2013-06-19 18:40

Rejestracja: 14 lat temu

Ostatnio: 1 miesiąc temu

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.

Powinno się zamienić na const - _13th_Dragon 2013-06-19 18:44

Pozostało 580 znaków

2013-06-19 18:44

Rejestracja: 14 lat temu

Ostatnio: 1 minuta temu

0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-06-19 19:04
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 4 godziny temu

Lokalizacja: Tuchów

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 :]


MB_ICONWARNING i <Ok> jak na mój gust w porządku. "Dane zostali zapisane w schowku" - jaki jeszcze przycisk oprócz <OK> chciałbyś widzieć? - _13th_Dragon 2013-06-19 19:21
Przy MB_ICONQUESTION czy MB_ICONWARNING chciałbym móc coś wybrać skoro to pytanie, np. MB_YESNOCANCEL były fajnym wynalazkiem :] - furious programming 2013-06-19 19:28
MB_ICONQUESTION jasne, ale MB_ICONWARNING po kiego? Masz ostrzeżenie że coś się już wydarzyło, no chyba że dasz na końcu pytanie: - "Czy rozumiesz co napisano wyżej?" i to zapętlisz dopóki użyszkodnik nie naciśnie <YES> - _13th_Dragon 2013-06-19 19:33
Przy MB_ICONWARNING może być np. komunikat: Dane zostały zmodyfikowane i nie zapisane. Czy chcesz je zapisać przed zamknięciem programu? - można wybrać Cancel i anulować, można wybrać Tak i zapisać dane oraz zamknąć program lub Nie i nie zapisywać danych po czym zamknąć program; Taki komunikat pojawia się np. w MS Notepad jeśli się coś naskrobie i nie zapisze przed wyjściem z programu; Sam wykorzystuję zawsze własne okna dialogowe i zawsze przekazuję w parametrach typ ikony oraz typ przycisków; - furious programming 2013-06-19 19:35
To jest typowe MB_ICONQUESTION - _13th_Dragon 2013-06-19 19:54
Niekoniecznie - czasem trzeba się o coś zapytać użytkownika przy jakiejś groźnej operacji i wyświetlić okonkę zagrożenia; W systemie jest pełno takich komunikatów, jak we wspomnianym Notepad, Paint czy podczas formatowania partycji, w innych programach także jest takie połączenie; To nie mój wymysł - po prostu są sytuacje, w których taki zestaw jest potrzebny; - furious programming 2013-06-19 20:28

Pozostało 580 znaków

2013-06-19 19:04
Moderator

Rejestracja: 12 lat temu

Ostatnio: 5 minut temu

Lokalizacja: Wrocław

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).


Pytacz przedstawił pewnie tylko ten kawałek kodu żeby nie załadować posta zbędnym kodem ;) - furious programming 2013-06-19 19:07
@Furious Programming, próbujesz na siłę usprawiedliwiać bezsensowności. - _13th_Dragon 2013-06-19 19:23
Nie, tylko przypuszczam, że podał kawałek kodu; Jeśli faktycznie jest to "cała klasa" - nie ma sensu bytu; - furious programming 2013-06-19 19:32

Pozostało 580 znaków

hrusbegrhrh
2013-06-19 19:27
hrusbegrhrh
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.

Pozostało 580 znaków

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