Jak wywołać dynamcznie zdarzenie OnMouseMove dyn. kopmonen

0

Witam,

Mam taki problem, otóż posiadam liste Paneli utworzonych dynamicznie i ich nazwy to na przyklad kolejno: Kom1, Kom2, Kom3.... itd.
Wszystkie one mają jedno wspólne zdarzenie

KomorkaMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);

Służy ono do tego aby w miarę jak przesuwam kursor po tych panelach, w innym miejscu pojawiały się ich nazwy, i jeszcze inne właściwości.
I teraz mam inne okienko, które służy do wyszukiwania tych Paneli. Lista znalezionych paneli wrzucana jest do ListBox'a. I teraz po kliknięciu na listBoxa chcę aby na Formie z tymi komórkami w miejscu gdzie wyświetlane są właścwości Paneli pojawiły się właściwości klikniętego znalezionego panelu. Wywołuję więc KomorkaMouseMove w ten sposób:

rejestracja.KomorkaMouseMove(TPanel(rejestracja.FindComponent(znalezione_komorki[id_komorki])),[ssAlt],Mouse.CursorPos.X,Mouse.CursorPos.Y);

No i w tym miejscu mi wywala błąd.
rejestracja to nazwa Formy gdzie wyświtlane sa komorki, znalezione_komorki[id_komorki] to nazwa klikniętej komorki w ListBox.
Wydaje mi się, że coś jest nie tak z FindComponent ale nie mogę dojść do strzału.
Czy ktoś mi może pomóc?

0

Jaki błąd? Przed czy po kompilacji? I tak BTW: niepotrzebne jest rzutowanie pierwszego parametru funkcji.

0

Próbowałem na różne sposoby i ciągle ten sam błąd:

Access violation at address 0061E1F6 in module 'Project.exe'. Read of address 00000070

Błąd wywalany jest w trakcie działania programu w już skompilowanym projekcie.

0

Mi to wygląda na taki scenariusz: FindComponent nie znajduje komponentu i przekazuje do funkcji nil. Tam się odwołujesz do tego nil'a co narusza pamięć. Daj w pierwszej linijce takie coś:

if Sender=nil then Exit;

I sprawdź czy błąd dalej występuje.

0

raczej

if not (Sender is TPanel) then exit;

0
Adamo napisał(a)

if not (Sender is TPanel) then exit;

No tak, teraz nie wywala błędu. Źle jest więc podana nazwa komponentu?
Dodam, że te komórki sa mojej klasy TKomorka_nowa, która to klasa jest pochodną TPanel. Jednak nawet jeśli wpiszę: not(Sender is TKomorka_nowa) to też nie przechodzi. Hmm, cały problem polega w wyniku funkcji FindComponent, bo nawet jak chcę zrobić:

showmessage(TKomorka_nowa(rejestracja.FindComponent(znalezione_komorki[id_komorki])).ClassName); 

To też mi wywala ten błąd.
Chyba nieprawidłowo wyszukuję ten komponent na formatce rejestracja, no ale jak pokazać funkcji aby szukała tego komponentu na innej formatce?
Acha! I te dynamiczne komponenty przechowuję w tablicy array of TKomorka_nowa. Może ta informacja jest istotna?

0

a nie możesz w sekcji public okna, na którym są te panele dać tak

Type
  TForm1 = class(TForm);
    ....
  public
    Panele: array of TMojPanel;
  ...

i zamiast je szukać FindComponent to masz je przez Panele[xxx]

PS. w TAGu danego panela możesz zapisać sobie jego Index w tablicy

I jeszcze jedno - powiedz może co chcesz uzyskać, bo być może jest prostsza droga (zawsze uważałem, że tworzenie więcej niż nastu komponentów tego samego rodzaju na jednej formie to złe podejście (chodzi głównie o buttony, panele itp., bo np. jak trzeba 30 editów to się tego nie przeskoczy)

0

Faktycznie, czasem się za bardzo kombinuje. Poszukiwanie po tablicy stworzonych komponentów dało zamierdzony efekt. Dziękuję wam wszystkim za pomoc.

P.S. Dynamiczne panele służą mi jako po prostu pola na grafiku (planie zajęć). Dzięki temu możesz sobie wrzucić na tygodniowym rozkładzie tyle planów paneli ile masz ich zajęć, jednocześnie ustawiając Od razu właściwe wartości np. width w zależności od czasu jego trwania. Jest to myślę dobre rozwiązanie i nieźle mi działa. A problem z tematu tego postu miał mi pomóc w zrobieniu wyszukiwania odpowiednich terminów, według ustalanych przez użytkownika parametrów.

Pozdrawiam

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