Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 10:25


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 
Autor Wiadomość
PostNapisane: 10 kwi 2021, o 19:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

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.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 kwi 2021, o 19:56 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

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


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 kwi 2021, o 20:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1146
Lokalizacja: Kraków
Pomógł: 93

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 postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 kwi 2021, o 20:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

@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 :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 kwi 2021, o 21:20 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

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 postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 kwi 2021, o 21:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

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

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

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 kwi 2021, o 22:17 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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 postu otrzymał pochwałę

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 kwi 2021, o 08:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

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

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 kwi 2021, o 14:44 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 kwi 2021, o 15:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

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" :(

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 kwi 2021, o 19:19 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 kwi 2021, o 19:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

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ć

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 kwi 2021, o 20:06 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 kwi 2021, o 20:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

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 :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 kwi 2021, o 20:43 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

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.



Ostatnio edytowano 11 kwi 2021, o 20:54 przez auers, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 kwi 2021, o 20:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1146
Lokalizacja: Kraków
Pomógł: 93

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 kwi 2021, o 20:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

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 :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 kwi 2021, o 21:09 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 kwi 2021, o 21:33 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO