Näpunäidete mõistmine ja kasutamine Delphis

Vaatamata sellele, et osutid pole siin nii olulised Delphi nagu nad asuvad C või C ++, nad on selline "põhiline" tööriist, millega on peaaegu midagi pistmist programmeerimine peab osutiga mingil viisil tegelema.

Sel põhjusel võite lugeda, kuidas string või objekt on tegelikult lihtsalt osuti, või kui sündmuste käitleja, näiteks OnClick, on tegelikult protseduuri osutaja.

Osuti andmetüübile

Lihtsustatult öeldes on osuti muutuja, mis hoiab mällu ükskõik millise aadressi.

Selle määratluse täpsustamiseks pidage meeles, et kõik, mida rakendus kasutab, on salvestatud arvuti mällu. Kuna osuti hoiab mõne muu muutuja aadressi, osutab see sellele muutujale.

Enamasti osutavad Delphi osutid konkreetsele tüübile:

var
iValue, j: täisarv; pIntValue: ^ täisarv;
alustada
iValue: = 2001; pIntValue: = @iValue;... j: = pIntValue ^;
lõpp
;

süntaks osuti andmetüübi deklareerimiseks kasutab a caret (^). Ülaltoodud koodis on iValue täisarvutüüpi muutuja ja pIntValue on täisarvutähis. Kuna osuti pole midagi muud kui aadress mälus, peame sellele määrama iValue täisarvu muutujasse salvestatud väärtuse asukoha (aadressi).

instagram viewer

@ operaator tagastab muutuja aadressi (või funktsiooni või protseduuri, nagu allpool näha). Samaväärne operaatoriga @ on Lisafunktsioon. Pange tähele, et pIntValue väärtus ei ole 2001.

Selles näidiskoodis on pIntValue trükitud täisarvu osuti. Hea programmeerimisstiil on kasutada trükitud osutusi nii palju kui võimalik. Osuti andmetüüp on üldine osuti tüüp; see tähistab kõigi andmete viit.

Pange tähele, et kui kursori muutuja järel ilmub "^", viitab see osutile; see tähendab, et see tagastab kursori valduses oleval mäluaadressil salvestatud väärtuse. Selles näites on muutujal j sama väärtus kui iValue. Võib tunduda, et sellel pole mingit eesmärki, kui saame lihtsalt jV väärtuse omistada j-le, kuid see kooditükk asub enamiku Win API kõnede taga.

Tühjad kursorid

Määramata osutid on ohtlikud. Kuna osutid võimaldavad meil töötada otse arvuti mäluga, kui proovime (eksikombel) mällu kaitstud kohta kirjutada, võime saada juurdepääsu rikkumise tõrke. See on põhjus, miks peaksime kursori alati lähtestama väärtusele NIL.

NIL on spetsiaalne konstant, mille saab määrata igale osutile. Kui osutile on määratud null, ei viita osuti millelegi. Delphi esitleb näiteks tühja dünaamiline massiiv või pikk null ilma osutita.

Tegelaskuju

Põhitüübid PAnsiChar ja PWideChar tähistavad viiteid AnsiChari ja WideChari väärtustele. Üldine PChar tähistab osutit muutujale Char.

Neid märgi viiteid kasutatakse null-otsaga manipuleerimiseks keelpillid. Mõelge PChar-le kui null-otsaga stringi või massiivi, mis seda tähistab, osutile.

Osutused plaadile

Kui määratleme kirje või muu andmetüübi, on tavaks määratleda ka sellele tüübile osuti. See teeb tüübi eksemplaridega manipuleerimise lihtsaks ilma suuri mäluplokke kopeerimata.

Võimalus omada viiteid kirjetele (ja massiividele) muudab keerukate andmestruktuuride seadistamise lingitud loendite ja puudena palju lihtsamaks.

tüüp
pNextItem = ^ TLinkedListItem
TLinkedListItem = rekordsName: Keel; iValue: täisarv; NextItem: pNextItem;
lõpp
;

Lingitud loendite idee on anda meile võimalus salvestada aadress järgmisele lingitud üksusele loendis NextItem kirje väljal.

Kirjete viiteid saab kasutada ka näiteks iga puuvaate üksuse kohandatud andmete salvestamisel.

Menetlus- ja meetodinäpunäited

Veel üks oluline osutuskontseptsioon Delphis on protseduuride ja meetodite näpunäited.

Näpunäiteid, mis osutavad protseduuri või funktsiooni aadressile, nimetatakse protseduurideks. Meetodi näpunäited on sarnased protseduuri osutitega. Iseseisvatele protseduuridele osutamise asemel peavad nad osutama klassimeetoditele.

Metoodikakursor on osuti, mis sisaldab teavet nii nime kui ka objekti kohta, millele kutsutakse.

Kursorid ja Windows API

Delfis osutab kõige sagedamini osutitele C- ja C ++-koodiga liidestamine, mis hõlmab ka juurdepääsu Windowsi API-le.

Windows API funktsioonid kasutavad arvukalt andmetüüpe, mis võivad olla Delphi programmeerijale võõrad. Enamik API funktsioonide kutsumise parameetreid on mõnele andmetüübile viitavad. Nagu eespool öeldud, kasutame Windows API funktsioonide kutsumisel Delphis null-otsaga stringe.

Paljudel juhtudel, kui API-kõne tagastab puhvris või osutuses väärtuse andmestruktuurile, peab rakendus need puhvrid ja andmestruktuurid eraldama enne API-kõne saamist. SHBrowseForFolder Windowsi API funktsioon on üks näide.

Osuti ja mälu eraldamine

Osutite tõeline jõud tuleneb võimalusest mälu kõrvale panna programmi käivitamise ajal.

See kooditükk peaks olema piisav tõestamaks, et osutitega töötamine pole nii raske, kui alguses võib tunduda. Seda kasutatakse juhtseadise teksti (pealdise) muutmiseks kaasasoleva käepidemega.

protseduur GetTextFromHandle (hWND: THandle);
var
pTekst: PChar; // kursor char (vaata ülal)TextLen: täisarv;
alustada

{hangi teksti pikkus}
TextLen: = GetWindowTextLength (hWND);
{vali mälu}

GetMem (pText, TextLen); // võtab kursori
{hankige juhtseadise tekst}
GetWindowText (hWND, pText, TextLen + 1);
{kuva tekst}
ShowMessage (string (pText))
{vabastage mälu}
FreeMem (pText);
lõpp
;
instagram story viewer