Problem z typami proceduralnymi jako parametrem procedury

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?

0

a to of object; to po co?

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'

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

0

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

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?

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.

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

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

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