Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Pascal: Delphi: Viestien käsittely TObject:lla

Janezki [06.05.2005 12:04:28]

#

Yritän tässä tehdä näppäinkäsittelijää TObjectina, mutta näyttää siltä, ettei se edes osaa ottaa viestejä vastaan, vaikka TObject -luokalla on komennot Dispatch ja defaulthandler käytössä. Delphin ohjeissa puhutaan paljon viestien käsittelystä, mutta siellä viitataan aina joko TControl:iin tai sanotaan VCL only. Onnistuuko objektina vai vaihdanko visuaaliseen komponenttiin?

Metabolix [06.05.2005 19:55:03]

#

Kyllä sen pitäisi periaatteessa kyetä hommaan. Kerro vähän enemmän toteutusideastasi, niin on helpompi auttaa. Viestinhän ei tarvitse kulkea yhdenkään objektin tai komponentin käsittelijän läpi, eli miten kummassa yrität saada (tai olet saanut) viestit kulkemaan jonkin tietyn otuksen kautta?

Janezki [07.05.2005 10:46:22]

#

Myönnetään että koko viestihomma on vielä vähän hepreaa. Katsion mallia muista komponenteista ja kirjoitin viestikäsittelijän:

Type
 TKeyStore = Class
 Private
  procedure OnKeyDown(var Message: TKeyDown); Message WM_KEYDOWN;

Suurin piirtein noin. Tällä hetkellä käsittelijä ei nappaa viestiä. Miten niin viestien kuljettaminen tietyn otuksen kautta ei onnistuisi?

Metabolix [08.05.2005 13:53:07]

#

Kannattaa tutustua Windowsin sielunelämään vähän tarkemmin, se on hyvin mielenkiintoista :)

Windows lähettää viestinsä ohjelmalle prosessina, ja liittää mukaan tiedon siitä, mitä ohjelman ikkunaa viesti koskee (jos kyseessä on esimerkiksi hiiren liikutus). Kaikkia viestejä ei tarvitse itse käsitellä. En nyt muista tarkalleen, kuinka homma Delphin TApplication-luokassa toimi (ks. TApplication.Run-proseduuri), mutta normaalisti Win32-ohjelma toimii sillä periaatteella, että odotetaan viestiä, ja kun viesti tulee, reagoidaan siihen. (Toinen vaihtoehto, peleissä käytetty, on sellainen, että pyöritetään tiettyä tapahtumasilmukkaa koko ajan ja tarkistetaan sen alussa, onko viestejä. Delphin Drag'n'drop ei kuitenkaan käytä sitä.) Viesti lähetetään vastaanottajaikkunan viestinkäsittelijälle (WndProc), ja sen jälkeen ilmoitetaan Windowsille, että viesti on käsitelty (ainakin niin minä olen Translate-Dispatch-parin ymmärtänyt). Toivottavasti tästä saa jotakin tolkkua. Ei siis ole mitään syytä, miksi viestit kulkisivat tuon objektin kautta, ja on montakin syytä, miksi ne eivät kulje. Muistaakseni tuollaiset viestinkäsittelijät kuitenkin toimivat täysin, kun viestit lähetetään kyseiselle objektille.

Janezki [08.05.2005 19:59:48]

#

Eli pitääkö viesti lähettää erikseen objektille? Onko lähettäjänä siis TApplication? Toimiiko pelkkä Dispatch tässä? Huhhuh...

Metabolix [09.05.2005 21:35:29]

#

Jaa, noilla valmisobjekteillakin on näköjään Dispatch-metodi. Tarkoitin nyt kuitenkin WinAPI:n funktioita TranslateMessage ja DispatchMessage.

Enpä tiedä, miten saisit viestit menemään tuolle objektille muuten kuin tekemällä ohjelman pääformille viestinkäsittelijän, jolla lähetät viestin edelleen tuolle objektillesi, ja silloin taas en näe järkeä siinä, että koko homma kirjoitettaisiin tuohon objektiin, kun kaiken voi yhtä hyvin kirjoittaa formin omaan viestinkäsittelijään. (Muista KeyPreview = True, jos haluat saada kaikki näppäinviestit kiinni.) Tuskin saat niitä objektillesi, jos et niitä itse sille lähetä.

En osaa tuota Windowsin viestijärjestelmää kovin hyvin selittää, helpoiten siitä saa selvää (ja on pitkällä tähtäimellä hyvinkin hyödyllistä), jos jaksaa uhrata muutaman tunnin vääntämällä oman Win32-ohjelman ilman Drag'n'dropia (siihen voi jopa tykästyä niin paljon, että luopuu koko drag'n'dropista). C-kielisistä esimerkeistä voi katsoa mallia, ei se niin erilaista ole. Luo uusi konsoliohjelma ja poista APPTYPE-rivi, lisää uses-listaan Windows ja Messages. Vaihtoehtoisesti voit ladata Dev-Pascal-IDEn, josta löytyy win32-application-pohja oletuksena. Suosittelen ensimmäistä, mutta erityisesti suosittelen, että tee edes jompikumpi.

Janezki [10.05.2005 19:57:54]

#

Ideana olikin ettei formin tarvitsisi käsitellä näppäinpainalluksia ollenkaan vaan näppäinhandleri pystyisi nappaamaan viestit automaattisesti ilman erillistä käskyä. Eipähän tuo olisikaan poistanut kuin kaksi riviä koodia, mutta tulipahan opeteltua viestisysteemiä. Taidan valmistaa koko objektista drag'n'drop -komponentin. Jälleen kerran kiitokset Metabolixille avusta.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta