Jak zrobić procedurę, która w dwóch instancjach ma 2 adresy?

0

Może nie do końca wyjaśniłem w temacie, o co chodzi.

Mam klasę: TNewTransForm;
Jest to po prostu forma z kilkoma dodatkowymi rzeczami(grid, metody).

Mam też prywatną procedurę: MyProc.

I teraz kwestia jest taka.
Jeśli w tym samym czasie mam stworzonych kilka instancji tej klasy(kilka otwartych form), wtedy adres procedury MyProc jest taki sam, dla wszystkich instancji. Czyli coś, jakby procedura miała jeden adres, a wszystkie instancje wskazywały na nią.

Jak zrobić, żeby dla każdej instancji był inny adres procedury MyProc?

0

chłopie a możesz wytłumaczyć po co Ci to??

BTW Z postu na post widać, że niedługo nawet assembler Ci nie będzie wystarczał i chyba będziesz musiał własny procek zaprojektować [sciana]

0

Hmmm, po kolei postaram się wszystko wyjaśnić.
Jest klasa: TCzytnik (która posługuje się ComPortem).
Klasa ta ma zdarzenie: OnCzytnikRead.

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

Przypisanie:

Czytnik.OnCzytnikRead:=MyProc;

Czytnik to zmienna globalna(w całej aplikacji) klasy TCzytnik

powoduje wykonanie procedury MyProc po odczytaniu danych przez czytnik(port). Dane nie są w trakcie czytania, tylko już wszystkie są zczytane i "przekazane" do aplikacji

Teraz mam tą klasę: TNewTransForm - jest to forma z gridem, kilkoma metodami i takie tam.

M.in. jest w tej klasie metoda prywatna

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

a także zmienna:

  FIDKlienta: integer;

Następnie w OnShow klasy TNewTransForm mam przypisanie:

Czytnik.OnCzytnikRead:=CzytnikRead;

To przypisanie mam również w OnActivate

Do rzeczy.
Podczas działania programu tworzę kilka obiektów klasy TNewTransForm(każdy z innym FIDKlienta)

Jednak, gdy do metody CzytnikRead dodam

showMessage(intToStr(FIDKlienta));

to niezależnie od tego, która forma jest aktywna, pokazywane jest ID klienta, przypisanego do pierwszego utworzonego obiektu(IDKlienta jest na pewno różne w każdym obiekcie).
Wniosek z tego taki, że wszystkie te obiekty wskazują na jedną metodę CzytnikRead. A tak być nie może.

0

musisz mieć błąd w kodzie.

  1. FIDKlienta jest w każdej klasie takie same
  2. sprawdz, czy w OnActivate żeczywiście zostaje przypisana metoda danej instancji (ew. zamiast Czytnik.OnCzytnikRead := CzytnikRead; daj Czytnik.OnCzytnikRead := Self.CzytnikRead;)
  3. gdzie dokładnie masz mzienną FIDKlienta: integer;
0
Misiekd napisał(a)

musisz mieć błąd w kodzie.

  1. FIDKlienta jest w każdej klasie takie same

W każdym obiekcie jest różne. Dzięki temu widzę np., że ta transakcja została otwarta dla Kowalskiego, a ta dla Nowaka

  1. sprawdz, czy w OnActivate żeczywiście zostaje przypisana metoda danej instancji

Zostaje. Kwestia taka, że jak sprawdzam adres tej procedury, okazuje się, że w każdym obiekcie jest TAKI SAM

(ew. zamiast Czytnik.OnCzytnikRead := CzytnikRead; daj Czytnik.OnCzytnikRead := Self.CzytnikRead;)

Próbowałem, zero efektu.

  1. gdzie dokładnie masz mzienną FIDKlienta: integer;

W sekcji private klasy TNewTransForm

PS.
Rozwiązałem połowicznie - tymczasowo. Tzn. obszedłem to tak, że podczas onShow transakcji i OnActivate robię Czytnik.Free, a następnie tworzę go na nowo. To działa, ale pojawiają się inne problemy uniemożliwiające wykonanie innych założeń. Konkretnie z jakiegoś powodu ComPort nie chce się zamknąć. Z poziomu debugowania krok po kroku wygląda to tak, jakby był jakiś wyjątek, ale żadnego wyjątku nie ma. try..except nic nie pokazuje, Notify on language exceptions też nic nie pokazuje. Program się po prostu zawiesza na dobre. I ni kuta nie wiem czemu(ten efekt jest gdzieś w środku metody ComPort.Close, bodajże przy zwalnianiu obiektu wątku).
W każdym razie, to co zrobiłem teraz tymczasowo to nie jest dobre rozwiązanie, w związku z tym, cały czas oczekuję na jakieś pomysły ;)

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