Problem z typami proceduralnymi jako parametrem procedury

Odpowiedz Nowy wątek
2006-09-13 14:11
0

Cześć. Kwestia jest taka. Mam 3 unity: fMain, uDevices i uClasses

w uClasses mam zdefiniowany typ:

TCzytnikRead = procedure(Sender: TObject; Str: string) of object;

w uDevices mam procedurę:

function SetCzytnikKart(AOwner: TComponent; var Proc: TCzytnikRead): boolean;
begin
  //jakiś inny kod
  CzytnikKart.OnCzytnikRead:=Proc;
  //więcej innego kodu
end;

Natomiast w fMain chcę tą procedurę wywołać:

SetCzytnikKart(Self, CzytnikRead);

Deklaracja CzytnikRead:

procedure CzytnikRead(Sender: TObject; Str: string);

Wyskakuje mi błąd: Types of actual and formal var parameters must be identical

Co tu jest nie tak?

Pozostało 580 znaków

2006-09-13 14:18
0

a to of object; to po co?


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2006-09-13 14:37
0
Misiekd napisał(a)

a to of object; to po co?

No w helpie tak było ;)

Poza tym, jak tego nie ma, to podczas przyrównania procedury do zdarzenia OnCzytnikRead dostaję błąd: Incompatible types: 'regular procedure and method pointer'

Pozostało 580 znaków

2006-09-13 14:59
0

ale zapewne była to część helpa odnosząca się do dodawania eventów do komponentu lub opisu eventów
jak chesz podstawić jakąś procedurę pod zdarzenie to są dwie zasady

  1. lista parametrów musi się zgadzać
  2. procedura MUSI być metodą dowolnej klasy

- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2006-09-13 15:04
0
Misiekd napisał(a)

ale zapewne była to część helpa odnosząca się do dodawania eventów do komponentu lub opisu eventów

Zgadza się. TCzytnikRead to jest coś w rodzaju TNotifyEvent.

jak chesz podstawić jakąś procedurę pod zdarzenie to są dwie zasady

  1. lista parametrów musi się zgadzać

Się zgadza

  1. procedura MUSI być metodą dowolnej klasy

Jest.

Pozostało 580 znaków

2006-09-13 15:07
0

daj może większy kod (np unit bez środków procedur) bo się zgubiłem :/


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2006-09-13 15:07
0

Przy takiej deklaracji typu TCzytnikRead, ten argument musi być metodą.
Czyli deklaracja CzytnikRead powinna wyglądać np.

  TJakaśKlasa = class //...
    procedure CzytnikRead(Sender: TObject; Str: string);
  //...
  end;

A definicja:

procedure TJakaśKlasa.CzytnikRead(Sender: TObject; Str: string);
//...

Jeśli to aplikacja okienkowa, to wygodnie za tą klasę wziąć po prostu klasę formularza.

Ale problem wynika przed wszystkim z tego, że chcesz przekazywać tą metodę przez referencję (var Proc:...). Po co?

Pozostało 580 znaków

2006-09-13 15:15
0

w fMain procedura CzytnikRead jest składnikiem klasy formy głównej.

Ale problem wynika przed wszystkim z tego, że chcesz przekazywać tą metodę przez referencję (var Proc:...). Po co?

No bo chcę przekazać przez referencję. Chcę, żeby w momencie OnCzytnikRead wykonała się odpowiednia procedura.

MisiekD: Podałem cały kod, który ma z tym coś wspólnego.

Pozostało 580 znaków

2006-09-13 15:26
0
Juhas napisał(a)

w fMain procedura CzytnikRead jest składnikiem klasy formy głównej.

Ale problem wynika przed wszystkim z tego, że chcesz przekazywać tą metodę przez referencję (var Proc:...). Po co?

No bo chcę przekazać przez referencję. Chcę, żeby w momencie OnCzytnikRead wykonała się odpowiednia procedura.

ale tak naprawdę to co masz w zmiennej CzytnikRead to wskaźnik i czy dasz var czy nie to nic nie zmieni

MisiekD: Podałem cały kod, który ma z tym coś wspólnego.

jeśli tak to procedura ta nie jest metodą klasy (co zresztą sygnalizuje kompilator)

procedure CzytnikRead(Sender: TObject; Str: string);
gdyby to było metodą jakiejś klasy to by jeszcze występowała przed nazwą procedury nazwa tej lasy a tu nie ma dlatego prosiłem o cały kod bez środków procedur


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2006-09-13 15:45
0

Mówisz, że nie chcesz przekazywać przez referencje, a przekazujesz...

function SetCzytnikKart(AOwner: TComponent; var Proc: TCzytnikRead): boolean;

Zmień to na:

function SetCzytnikKart(AOwner: TComponent; Proc: TCzytnikRead): boolean;

Pozostało 580 znaków

2006-09-13 16:08
0
Pawel200x.5 napisał(a)

Mówisz, że nie chcesz przekazywać przez referencje, a przekazujesz...

function SetCzytnikKart(AOwner: TComponent; var Proc: TCzytnikRead): boolean;

Zmień to na:

function SetCzytnikKart(AOwner: TComponent; Proc: TCzytnikRead): boolean;

Faktycznie, usunięcie var pomogło.

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