Vaikka osoittimet eivät ole yhtä tärkeitä Delfoi sellaisina kuin ne ovat C: ssä tai C ++, ne ovat niin "perus" työkalu, että melkein kaikilla on tekemistä ohjelmointi on käsiteltävä osoittimia jollain tavalla.
Tästä syystä saatat lukea siitä, kuinka merkkijono tai objekti on oikeastaan vain osoitin, tai että tapahtumakäsittelijä, kuten OnClick, on itse asiassa osoitin proseduurille.
Osoitin tietotyypille
Yksinkertaisesti sanottuna osoitin on muuttuja, jolla on minkä tahansa muistissa oleva osoite.
Tämän määritelmän konkretisoimiseksi muista, että kaikki sovelluksen käyttämät tiedot on tallennettu jonnekin tietokoneen muistiin. Koska osoittimella on toisen muuttujan osoite, sanotaan osoittavan kyseisen muuttujan.
Suurimman osan ajasta Delphin osoittimet osoittavat tiettyyn tyyppiin:
var
iValue, j: kokonaisluku; pIntValue: ^ kokonaisluku;
alkaaiValue: = 2001; pIntValue: = @iValue;... j: = pIntValue ^;
pää;
syntaksi osoittimen tietotyypin ilmoittamiseksi käyttää a caret (^). Yllä olevassa koodissa iValue on kokonaislukutyyppimuuttuja ja pIntValue on kokonaislukutyyppinen osoitin. Koska osoitin ei ole muuta kuin osoite muistissa, meidän on osoitettava sille iValue-kokonaisluvumuuttujaan tallennetun arvon sijainti (osoite).
@ operaattori palauttaa muuttujan osoitteen (tai funktion tai proseduurin, kuten alla esitetään). Vastaa @ -operaattoria Lisätoiminto. Huomaa, että pIntValue-arvo ei ole 2001.
Tässä näytekoodissa pIntValue on kirjoitettu kokonaislukuosoitin. Hyvä ohjelmointityyli on käyttää kirjoitettuja osoittimia niin paljon kuin pystyt. Osoittimen tietotyyppi on yleinen osoitintyyppi; se edustaa osoitinta kaikille tiedoille.
Huomaa, että kun "^" ilmestyy osoittimelle, se viittaa osoittimeen; eli se palauttaa osoittimen pitämään muistiosoitteeseen tallennetun arvon. Tässä esimerkissä muuttujalla j on sama arvo kuin iValue. Vaikuttaa siltä, että tällä ei ole tarkoitusta, kun voimme yksinkertaisesti antaa iValue-arvon j: lle, mutta tämä koodinpätkä on useimpien Win API -soittopuhelujen takana.
NILING-osoittimet
Määrittämättömät osoittimet ovat vaarallisia. Koska osoittimet antavat meille työskennellä suoraan tietokoneen muistin kanssa, jos yritämme kirjoittaa (vahingossa) muistiin suojattuun kohtaan, voimme saada käyttöoikeusrikkomusvirheen. Tästä syystä meidän tulisi aina alustaa osoitin nollaan.
NIL on erityinen vakio, joka voidaan määrittää mille tahansa osoittimelle. Kun osoittimelle on määritetty nolla, osoitin ei viittaa mihinkään. Delphi esittelee esimerkiksi tyhjän dynaaminen taulukko tai pitkä merkkijono nolla osoittimena.
Luonneosoittimet
Perustyypit PAnsiChar ja PWideChar edustavat osoittimia AnsiChar- ja WideChar-arvoille. Yleinen PChar edustaa osoitinta Char-muuttujalle.
Näitä merkkiosoittimia käytetään manipuloimaan nollapääteisiä jouset. Ajattele PChar: ta osoittimena nollasta päättyvälle merkkijonolle tai sitä kuvaavalle taulukolle.
Osoittimet levylle
Kun määrittelemme tietueen tai muun tietotyypin, on yleinen käytäntö myös määrittää osoitin kyseiselle tyypille. Tämän ansiosta tyypin esiintymien käsittely on helppoa kopioimatta suuria muistimohkoja.
Mahdollisuus osoittimilla tietueille (ja taulukkoille) helpottaa monimutkaisten tietorakenteiden asettamista linkitetyiksi luetteloiksi ja puiksi.
tyyppi
pNextItem = ^ TLinkedListItem
TLinkedListItem = ennätyssName: merkkijono; iValue: Kokonaisluku; Seuraava numero: pNextItem;
pää;
Linkitettyjen luetteloiden taustalla on antaa meille mahdollisuus tallentaa osoite seuraavaan linkitettyyn kohtaan luetteloon NextItem-tietuekentän sisällä.
Tietueiden osoittimia voidaan käyttää myös tallennettaessa mukautettuja tietoja jokaiselle puunäkymäkohteelle.
Menettely- ja menetelmäosoittimet
Toinen tärkeä osoitinkonsepti Delphissä on menettely- ja menetelmäosoittimet.
Osoittimia, jotka osoittavat proseduurin tai funktion osoitteeseen, kutsutaan proseduurin osoittimiksi. Menetelmäosoittimet ovat samanlaisia kuin menettelyosoittimet. Sen sijaan, että viitataan erillisiin toimintoihin, niiden on kuitenkin osoitettava luokkamenetelmiin.
Menetelmäosoitin on osoitin, joka sisältää tietoja sekä nimestä että objektista, jota kutsutaan.
Osoittimet ja Windows API
Yleisin Delphin osoittimien käyttö on liitäntä C- ja C ++ -koodiin, joka sisältää pääsyn Windows-sovellusliittymään.
Windows API-toiminnot käyttävät useita tietotyyppejä, jotka saattavat olla tuntemattomia Delphi-ohjelmoijalle. Suurin osa API-funktioita kutsuttavista parametreistä on osoittimet joillekin tietotyypeille. Kuten edellä todettiin, käytämme nollia päättäviä merkkijonoja Delphissä, kun soitamme Windows API -toimintoihin.
Monissa tapauksissa, kun API-puhelu palauttaa puskurissa tai osoittimessa olevan arvon tietorakenteelle, sovelluksen on allokoitava nämä puskurit ja tietorakenteet ennen API-puhelun soittamista. SHBrowseForFolder Windows API -toiminto on yksi esimerkki.
Osoittimen ja muistin allokointi
Osoittimien todellinen voima saadaan kyvystä varata muisti ohjelman suorittamisen aikana.
Tämän koodin tulee olla riittävä todistamaan, että osoittimien kanssa työskenteleminen ei ole niin kovaa kuin aluksi näyttää. Sitä käytetään muuttamaan säätimen tekstiä (kuvateksti) mukana toimitetulla kahvalla.
menettely GetTextFromHandle (hWND: THandle);
var pText: PChar; // osoitin charmiin (katso yllä)TextLen: kokonaisluku;
alkaa
{saat tekstin pituuden}TextLen: = GetWindowTextLength (hWND);
{aloittaa muisti}
GetMem (pText, TextLen); // vie osoittimen
{saat ohjaimen teksti}GetWindowText (hWND, pText, TextLen + 1);
{näytä teksti}ShowMessage (merkkijono (pText))
{vapauta muisti}FreeMem (pText);
pää;