Event'y dla dynamicznego obiektu

Event'y dla dynamicznego obiektu
Rafał Kapłon
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:8
0

Witam,
Próbuję stworzyć metodę **OnClick **dla dynamicznego obiektu:

Kopiuj
 TTempBlok = class(TSelection)
  private
  {}
  protected
  {}
  public
    tPanel: TRectangle;
    tLabel: TText;
    tIkona: TImage;
    tNode : TSelectionPoint;
    tLinia: TLine;
    tNumer: TText;
  
  tTYPE : string;

    constructor Create(Owner: TComponent); override;
  published
   {}
  end;

Tworzę taki zgrabny czworokącik:
screenshot-20171105205644.png

W chwili obecnej ropoznaje zdarzenia dotyczące rodzica, czyli TSelection, a potrzebuję konkretnie dla elementu opartego o klasę TSelectionPoint - jasna kropka. Jakieś pomysły?

GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:33 minuty
1

utwórz jedną metodę do obsługi onClick i podepnij ją pod oba zdarzenia, TtempBook.onclick oraz tNode.onClick.
Senderem będzie obiekt wywołujący metodę więc na podstawie klasy Sendera możesz w kodzie metody zrobić dwie różne obsługi zdarzenia
BTW... nazwy pól klasy zaczynające się od litery "t" są bardzo mylące. Litera "T" na początku sugeruje definicję klasy
Samo nazewnictwo pól też jest mocno mylące np. tPanel: TRectangle; . Nazwa pola sugeruje że to obiekt klasy Tpanel ...

edytowany 4x, ostatnio: grzegorz_so
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:34 minuty
  • Lokalizacja:Tuchów
  • Postów:12171
1
Rafał Kapłon napisał(a):

Próbuję stworzyć metodę **OnClick **dla dynamicznego obiektu:

Jakoś w tym kodzie nie widzę, abyś tego próbował. ;)


Jeśli chcesz podpiąć zdarzenie pod dynamicznie tworzoną kontrolkę, to wystarczy zadeklarować metodę w klasie-rodzicu, określić parametry pasujące do zdarzenia i np. w konstruktorze klasy-rodzica przypisać zdarzenia do kontrolek.

Zdarzenie OnClick to typ TNotifyEvent, czyli metoda klasy posiadająca jeden parametr typu TObject. Tak więc należy taką metodę zadeklarować w klasie TTempBlok:

Kopiuj
type
  TTempBlok = class(TSelection)
  {..}
  private
    FNode: TSelectionPoint;
  private
    procedure SubControlClick(ASender: TObject);
  {..}
  end;

i podpiąć ją w konstruktorze klasy do wewnętrznej kontrolki, np.:

Kopiuj
constructor TTempBlok.Create(AOwner: TComponent);
begin
  {..}

  FNode := TSelectionPoint.Create({..});
  FNode.OnClick := @Self.SubControlClick;
  
  {..}
end;

Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 6x, ostatnio: flowCRANE
Rafał Kapłon
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:8
0
grzegorz_so napisał(a):

utwórz jedną metodę do obsługi onClick i podepnij ją pod oba zdarzenia, TtempBook.onclick oraz tNode.onClick.
Senderem będzie obiekt wywołujący metodę więc na podstawie klasy Sendera możesz w kodzie metody zrobić dwie różne obsługi zdarzenia ...

Próbowałem już tak, niby kompilator nie widzi błędów, lecz przy kliknięciu w tNode wsykakuje komunikat -Invalid class typecast-

GS
pokaż kod metody
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:34 minuty
  • Lokalizacja:Tuchów
  • Postów:12171
0

@Rafał Kapłon: pokaż ten kod, przecież nie będziemy wróżyć z fusów…

Jeśli zrobiłeś tak jak pokazałem w swoim poprzednim poście, to wyjątek leci z zupełnie innego powodu.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:33 minuty
0
Rafał Kapłon napisał(a):
grzegorz_so napisał(a):

utwórz jedną metodę do obsługi onClick i podepnij ją pod oba zdarzenia, TtempBook.onclick oraz tNode.onClick.
Senderem będzie obiekt wywołujący metodę więc na podstawie klasy Sendera możesz w kodzie metody zrobić dwie różne obsługi zdarzenia ...

Próbowałem już tak, niby kompilator nie widzi błędów, lecz przy kliknięciu w tNode wsykakuje komunikat -Invalid class typecast-

Kompilator może nie widzieć błędów w rzutowaniu, ale to jeszcze nie świadczy że kod jest prawidłowy, Bo kod może być kompilowalny ale niekoniecznie prawidłowy, a jego wykonanie może rzucać wyjątkami

edytowany 1x, ostatnio: grzegorz_so
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:34 minuty
  • Lokalizacja:Tuchów
  • Postów:12171
0

@Rafał Kapłon: jak już koniecznie chcesz mieć jedeną metodę podłączoną do kilku kontrolek to nie rzutuj Sender-a na siłę – użyj operatora is i najpierw sprawdź czym on jest.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
Rafał Kapłon
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:8
0

Klasa:

Kopiuj
TTempBlok = class(TSelection)
  private
  {}
  protected
  {}
  public
    tPanel: TRectangle;
    tLabel: TText;
    tIkona: TImage;
    tNode : TSelectionPoint;
    tLinia: TLine;
    tNumer: TText;
    tTYPE : string;

    procedure SubControlClick(ASender: TObject);

    constructor Create(Owner: TComponent); override;
  published
   {}
  end;

Konstruktor:

Kopiuj
constructor TTempBlok.Create(Owner: TComponent);
begin
  inherited Create(Owner); 

  Width := 155;
  Height := 50;

  tPanel := TRectangle.Create(Self);
  tPanel.Parent := Self;

  tLinia := TLine.Create(Self);
  tLinia.Parent   := Self;
  tLinia.LineType := tLinia.LineType.ltTop;

  tLabel := TText.Create(Self);
  tLabel.Parent := Self;

  tNumer := TText.Create(Self);
  tNumer.Parent := Self;

  tNode := TSelectionPoint.Create(Self);
  tNode.Parent  := Self;

  tNode.OnClick := Self.SubControlClick;

  tIkona := TImage.Create(Self);
  tIkona.Parent := Self;
end;

Procedura:

Kopiuj
procedure SubControlClick(ASender: TObject);
begin
  pPT100.tLabel.Text := 'Kliknięto mnie...';
end;
edytowany 1x, ostatnio: flowCRANE
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:34 minuty
  • Lokalizacja:Tuchów
  • Postów:12171
0

Metoda SubControlClick jest zła, bo powinna operować na parametrze ASender, uprzednio upewniając się (za pomocą operatora is), że to faktycznie obiekt klasy TText.

Kopiuj
procedure SubControlClick(ASender: TObject);
begin
  if ASender is TText then
    TText(ASender).Text := 'Kliknięto mnie...';
end;

To są podstawy programowania obiektowego – musisz o tym poczytać.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:33 minuty
0

musisz sprawdzić czy sender jest obiektem klasy Tlabel

Kopiuj
if sender is Tlabel  then 
   Tlabel(sender).text:='Kliknięto mnie...';
flowCRANE
TText, nie TLabel. Identyfikatory są bardzo mylące.
GS
właśnie zaczynałem o tym pisać, ubiegłeś mnie. Za dwa dni autor kodu sam nie będzie wiedział co ma klasie
Rafał Kapłon
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:8
0

Wybaczcie mi, zrobiłem nowy projekt, testowy.

Zrobiłem tak jak proponowaliście, ale pomimo wszelkich starań, Delphi rzuca się o deklarację tej procedury obsługi przerwania :/

Jeżeli ktoś ma jeszcze siłę :)

KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
1

W ciemno (otwarty w notatniku) to widzę że w sekcji implementation masz:

Kopiuj
procedure SubControlClick(ASender: TObject);

EDIT
powinieneś:

Kopiuj
procedure TBlok.SubControlClick(ASender: TObject);
begin
if (ASender is TText)  then
   TText(ASender).Text:='Kliknięto mnie...';
end;

Poza tym było pisać od początku że to FMX a nie VCL.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek
Rafał Kapłon
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:8
0

Dziękuje za pomoc.
Wszystko pięknie, ładnie

flowCRANE
W takim razie zakończ wątek.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.