ATNEL tech-forum
https://forum.atnel.pl/

Ręczna obsługa procedury jakiegoś zdarzenia
https://forum.atnel.pl/topic23715.html
Strona 1 z 1

Autor:  SylwekK [ 10 kwi 2021, o 19:45 ]
Tytuł:  Ręczna obsługa procedury jakiegoś zdarzenia

Ostro wziąłem się za naukę, ale co chwila jakieś kwiatki, których nie mogę przeskoczyć... a w sieci już ze 3h szukam :-/
Chciałbym z innej procedury wywołać procedurę obsługującą, np. buttona czy okienko tekstowe aby nie pisać tego samego dwa razy.
Mam np. coś takiego:

Składnia: [ Pobierz ] [ Ukryj ]
język delphi
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i chciałbym aby wykonało się to nie tylko kiedy wprowadzę zmiany w okienku tekstowym, ale też przy wywołaniu np. tego zdarzenia:

Składnia: [ Pobierz ] [ Ukryj ]
język delphi
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

...co oczywiście nie działa, ale o taką ideę mi chodzi. Jak to można zrealizować? Przecież musi być jakiś sposób, żeby nie pisać kilka razy tego samego bloku jeśli kilka zdarzeń miałoby wykonać tą jedną procedurę. To było by kompletnie nielogiczne i nieekonomiczne.

Autor:  auers [ 10 kwi 2021, o 19:56 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Autor:  Marhef [ 10 kwi 2021, o 20:09 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

Możesz też przypisać jedną procedurę do kilku obiektów. I przez identyfikację obiektu Sender rozpoznawać, co wywołało tą procedurę.
Ja tak robiłem na przykład przy pseudo kalkulatorze (przyciski z cyframi miały jedną procedurę obsługującą wciśnięcie)

Autor:  SylwekK [ 10 kwi 2021, o 20:43 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

@auers, niestety to nie działa :( Chyba nawet tak kombinowałem podczas szukania na różne sposoby.
Wyskakuje komunikat:
Cytuj:
[dcc32 Error] Unit1.pas(232): E2076 This form of method call only allowed for class methods or constructor


@Marhef, chętnie poznam sposób w jaki się to robi :)

Autor:  auers [ 10 kwi 2021, o 21:20 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

Dziwne ja zawsze tak robię i mi działa.
Na pewno dobrze przepisałeś bez litery "T" przed Form1?

Co do metody która zaproponował Marhef,
w zakładce zdarzeń różnych kontrolek wybierasz jedną i ta samą funkcję.
Dopiero w funkcjach sprawdzasz co było przyczyną jej wywołania i wykonujesz odpowiedni kod np:
Składnia: [ Pobierz ] [ Ukryj ]
język delphi
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W tym przykładzie pod zdarzenie od wciśnięcia przycisków Button2 i Button3 wybierasz funkcję obsługi zdarzenia od przycisku Button1 i dopiero w tej procedurze rozpoznajesz co wcisnąłeś.

Autor:  SylwekK [ 10 kwi 2021, o 21:38 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

Aaaaa, właśnie z literą T było :)

I teraz pięknie działa. Dzięki WIELKIE! :D

Autor:  mirekk36 [ 10 kwi 2021, o 22:17 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

Jak jesteś w ramach tej samej klasy TForm to wystarczy

Składnia: [ Pobierz ] [ Ukryj ]
język delphi
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Autor:  SylwekK [ 11 kwi 2021, o 08:03 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

No i proszę, ile to się okazało rozwiązań mojego skomplikowanego problemu :D. Dzięki.

Autor:  mirekk36 [ 11 kwi 2021, o 14:44 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

Pamiętaj jednak, że takie wywoływanie metod "luzem" może być niebezpieczne. O wiele lepiej od razu jest przyjąć zasadę, żeby w metodach ew wywoływać tylko funkcje. Zobacz ile to wtedy upraszcza ;) bo w dwóch czy iluś miejscach programu wywołujesz wtedy taką funkcję. To może szczególnie się później przydasz gdy np zmienisz w kodzie nazwę dla komponentu i nagle amba - będzie wiele miejsc do poprawki. Bo zamiast Edit7Change() będzie np edDataChange().

Tzn jak tam raz gdzieś wywołasz - to nie ma co drzeć szat, ale tak podpowiadam na przyszłość że jak już częściej niż raz się robi, niż dwa - to ZDECYDOWANIE warto iść w napisanie funkcji.

To będzie tym bardziej i to DRAMATYCZNIE potrzebne jak kiedyś sięgniesz po komponent do zarządzania listą akcji (a jak cię znam to szybko po niego sięgniesz) ;) ... wtedy żeby przerobić taki kod z ręcznym wywoływaniem metod - to będzie lepiej skoczyć z balkonu (ale nie na parterze) ;)

Autor:  SylwekK [ 11 kwi 2021, o 15:23 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

Masz rację Mirku. Już się tu zastanawiałem właśnie, że w pewnym momencie taka metoda może się zemścić, choć akurat nieco inny przypadek rozpatrywałem. Jednak w tym prostym programie, który obecnie skrobię poznaje dopiero pewne mechanizmy i będę ewentualne błędy i zgrzyty usuwał na bieżąco. Jak wiadomo człowiek uczy się nas błędach - lepiej się utrwali :)

-- dzisiaj, o 16:23 --

No dobra, a jak w takim razie obsłużyć (na tej zasadzie co powyżej) takie coś:

Cytuj:
procedure TForm1.Edit7KeyPress(Sender: TObject; var Key: Char);


kompilator drze się o parametry, a ja nie mam już pomysłów co wstawić zamiast "var Key: Char" :(

Autor:  mirekk36 [ 11 kwi 2021, o 19:19 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

no ale co? znowu chcesz taką metodę wywoływać zewnętrznie ? - to już prawie skok w przepaść. Napisz może co chcesz uzyskać generalnie w tym konkretnym zakresie związanym z tą metodą to łatwiej może będzie podpowiedzieć coś.

Autor:  SylwekK [ 11 kwi 2021, o 19:24 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

Dałem sobie spokój, choć i tak chciałbym wiedzieć jak to zrobić :P :D
Przerabiam teraz co się da na poszczególne funkcje i procedury. Po prostu gdy zaczynałem pisać program nie sądziłem, że tyle się tego nazbiera :).
A chodziło mi o wstępne odświeżenie obliczeń i okienek przy starcie programu.
Póki co dla mnie ten sposób programowania jest nowością i do pewnych rzeczy muszę się przyzwyczaić

Autor:  mirekk36 [ 11 kwi 2021, o 20:06 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

No ale wywołując taką metodę Edit7KeyPress() przy inicjalizacji programu doprowadzisz do sztucznego wciskania jakby przycisków, a jak jeszcze inne metody w tą inicjalizację wrzucisz to ci zrobi się mega cyrk na kółkach. Tak nie można. Tak jak pisałem wcześniej pisz zewnętrzne funkcje żeby je wywoływać w metodach.

a wywołanie Edit7KeyPress( self, zmienna_char );

ale jak mówię to już droga w odmęty szaleństwa ;)

Składnia: [ Pobierz ] [ Ukryj ]
język delphi
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Obrazek

Autor:  SylwekK [ 11 kwi 2021, o 20:16 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

Wszystko jasne z tym wywoływaniem. W pewnym momencie zorientowałem się że mi się program ...zapętli :)

Pojawił się natomiast inny problem. Tu nawet deklaracje procedur chyba kompletnie inaczej działają niż w C...
dopisałem na koniec programu procedurę (która wywoływana jest gdzieś wcześniej):
Składnia: [ Pobierz ] [ Ukryj ]
język delphi
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

... i oczywiście drze się błąd. Mógłbym ją przenieść gdzieś wcześniej przed fragment programu gdzie jest wywoływana, ale to obejście mi się nie podoba, bo robi mi bajzel w programie (lubię po swojemu kolejność bloków ustalać). Kiedy próbowałem przenieść nagłówek do sekcji deklaracji na początku programu to oczywiście tam mi się znowu podświetla, że coś nie tak. W C nie było z tym problemu. Przeglądam poradniki w necie i nikt się tam nawet nie zająknie na ten temat - przykłady tam podane są proste i po prostu działają uwzględniając zasadę, że procedura jest umieszczona gdzieś przed jej wywołaniem (co ją przecież z urzędu deklaruje).
Jak to można obejść. Byłoby nielogiczne gdyby się nie dało.

-- 23 minutach --

Ufff. Doszedłem jak to zrobić :) - te swoje trzeba wstawiać poza Form1 :)

Autor:  auers [ 11 kwi 2021, o 20:43 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

Ale dlaczego inaczej?
Jak w C napiszesz procedurę na końcu pliku, bez jej wcześniejszej deklaracji i spróbujesz ją wcześniej wywołać to co, kompilator Ci na to pozwoli?
Tu jest tak samo, od tego jest sekcja interface. Czyli odpowiednik pliku nagłówkowego .h, (deklaracje).
Sekcja implementation - to odpowiednik pliku .c, (definicje).

-- 2 minutach --

SylwekK napisał(a):
te swoje trzeba wstawiać poza Form1

Niekoniecznie.

Składnia: [ Pobierz ] [ Ukryj ]
język delphi
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Autor:  Marhef [ 11 kwi 2021, o 20:49 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

mirekk36 napisał(a):
Pamiętaj jednak, że takie wywoływanie metod "luzem" może być niebezpieczne. O wiele lepiej od razu jest przyjąć zasadę, żeby w metodach ew wywoływać tylko funkcje. Zobacz ile to wtedy upraszcza ;) bo w dwóch czy iluś miejscach programu wywołujesz wtedy taką funkcję. To może szczególnie się później przydasz gdy np zmienisz w kodzie nazwę dla komponentu i nagle amba - będzie wiele miejsc do poprawki. Bo zamiast Edit7Change() będzie np edDataChange().

Tzn jak tam raz gdzieś wywołasz - to nie ma co drzeć szat, ale tak podpowiadam na przyszłość że jak już częściej niż raz się robi, niż dwa - to ZDECYDOWANIE warto iść w napisanie funkcji.
Mirku, rozumiem, że wywoływanie metod z innych metod jest nielogiczne.
A co z przypisaniem jednej metody do kilku zdarzeń (jak proponuje kolega auers)? Przykładowo, mam program w którym mam klawiaturę numeryczną i po kliknięciu w przycisk jego wartość wyświetla się w jakimś okienku. Lepiej napisać 10 metod, w których każda będzie działać tak samo, czy przypisać jedną metodę do wszystkich przycisków i w niej wykrywać, który przycisk jest wciśnięty? I czy po zmianie nazwy metody w pliku programu nie zmieni się jej nazwa w zdarzeniach, do których jest przypisana?
I czy dobrym zwyczajem jest tworzenie takich konstrukcji (zakładam, że w Edit1 chcę wyświetlić tylko numer ostatnio wciśniętego przycisku, a przyciski mają nazwy "buttonx", gdzie x=0..9)
Składnia: [ Pobierz ] [ Ukryj ]
język delphi
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Pytanie głównie do Mirka, ale innych też zapraszam do wypowiedzi :)

Dodam jeszcze, że do tej pory korzystałem z programu Lazarus (bo nie miałem wyboru), ale obstawiam, że w delphi będzie to działało bardzo podobnie.

Autor:  SylwekK [ 11 kwi 2021, o 20:55 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

To zapytam jeszcze :) gdzie można skonfigurować okienko wywoływane przez ShowMessage? Jest trochę za duże i chciałbym go nieco zwęzić :)


PS. I może jeśli Mirek pozwoli i doda do tytułu tematu " i inne problemy początkującego" to bym już śmietnika nie robił z forum :)

Autor:  auers [ 11 kwi 2021, o 21:09 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

Marhef napisał(a):
I czy po zmianie nazwy metody w pliku programu nie zmieni się jej nazwa w zdarzeniach, do których jest przypisana?

Niestety sama z automatu się nie zmienia, trzeba wszystkie zdarzenia przeklikać ręcznie.

Autor:  mirekk36 [ 11 kwi 2021, o 21:33 ]
Tytuł:  Re: Ręczna obsługa procedury jakiegoś zdarzenia

Marhef napisał(a):
A co z przypisaniem jednej metody do kilku zdarzeń (jak proponuje kolega auers)? Przykładowo, mam program w którym mam klawiaturę numeryczną i po kliknięciu w przycisk jego wartość wyświetla się w jakimś okienku. Lepiej napisać 10 metod, w których każda będzie działać tak samo, czy przypisać jedną metodę do wszystkich przycisków i w niej wykrywać, który przycisk jest wciśnięty? I czy po zmianie nazwy metody w pliku programu nie zmieni się jej nazwa w zdarzeniach, do których jest przypisana?

Ale kolega auers dobrze napisał bo podmiana metod to całkiem co innego niż to co tu Sylwek jakby próbuje robić, więc to co piszesz tutaj jest ok.

Marhef napisał(a):
I czy dobrym zwyczajem jest tworzenie takich konstrukcji

Ale tu już pełna dowolność, kreatywność i własne pomysły - są jak najbardziej ;)

SylwekK napisał(a):
gdzie można skonfigurować okienko wywoływane przez ShowMessage? Jest trochę za duże i chciałbym go nieco zwęzić

To jest okienko wywoływane z API, takie najbardziej standardowe i nie ma co tam zawężać ;) ale jeśli chce ci się rzeźbić to zawsze można tworzyć swoje własne okienka informacyjne jako oddzielne formy w aplikacji. Tyle że dla standardowych i krótkich komunikatów szybko sam z tego zrezygnujesz.

Można nieco konfigurować takie okienka np w ten sposób o ile dobrze pamiętam z głowy:

Składnia: [ Pobierz ] [ Ukryj ]
język delphi
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/