Rodyklių supratimas ir naudojimas Delfyje

Nors rodyklės nėra tokios svarbios Delfi kaip jie yra C arba C ++, jie yra toks „pagrindinis“ įrankis, su kuriuo beveik nieko bendra programavimas tam tikru būdu turi elgtis su rodyklėmis.

Dėl šios priežasties galite perskaityti apie tai, kaip eilutė ar objektas iš tikrųjų yra tik rodyklė, arba kad įvykių tvarkytojas, pavyzdžiui, „OnClick“, iš tikrųjų yra procedūros rodyklė.

Rodyklė į duomenų tipą

Paprasčiau tariant, rodyklė yra kintamasis, kuris saugo bet ko atmintyje adresą.

Norėdami patikslinti šį apibrėžimą, atminkite, kad viskas, ką naudoja programa, yra saugoma kažkur kompiuterio atmintyje. Kadangi rodyklė turi kito kintamojo adresą, sakoma, kad jis nurodo tą kintamąjį.

Didžiąją laiko dalį rodyklės Delfyje nurodo tam tikrą tipą:

var
„iValue“, j: sveikasis skaičius; pIntValue: ^ sveikasis skaičius;
prasideda
iValue: = 2001; pIntValue: = @iValue;... j: = pIntValue ^;
galas
;

sintaksė Norėdami nurodyti rodyklės duomenų tipą, naudokite a caret (^). Aukščiau pateiktame kode „iValue“ yra sveikojo tipo kintamasis, o „pIntValue“ yra sveikojo tipo rodyklė. Kadangi rodyklė yra ne kas kita, kaip adresas atmintyje, turime jai priskirti reikšmės, saugomos „iValue“ sveikojo skaičiaus kintamajame, vietą (adresą).

instagram viewer

@ operatorius grąžina kintamojo adresą (arba funkciją ar procedūrą, kaip bus parodyta žemiau). Lygiavertis @ operatoriui yra Addr funkcija. Atminkite, kad „pIntValue“ vertė nėra 2001 m.

Šiame pavyzdžio kode „pIntValue“ yra įvestas sveikasis rodyklė. Geras programavimo stilius yra naudoti kiek įmanoma įvestas rodykles. Rodyklės duomenų tipas yra bendras rodyklės tipas; jis žymi bet kokių duomenų rodyklę.

Atkreipkite dėmesį, kad kai po rodyklės kintamuoju pasirodo „^“, jis nukreipia nuo rodyklės; tai yra, ji grąžina reikšmę, išsaugotą žymeklio turimo atminties adresu. Šiame pavyzdyje kintamojo j vertė yra tokia pati kaip iValue. Gali atrodyti, kad tai neturi jokios prasmės, kai galime tiesiog priskirti „iValue“ j, tačiau šis kodo fragmentas slypi už daugumos skambučių į „Win API“.

NILing rodyklės

Nepaskirtos rodyklės yra pavojingos. Kadangi rodyklės leidžia mums dirbti tiesiogiai su kompiuterio atmintimi, jei bandytume (per klaidą) įrašyti į saugomą vietą atmintyje, galėtume gauti prieigos pažeidimo klaidą. Tai yra priežastis, kodėl mes visada turėtume inicijuoti žymiklį NIL.

NIL yra ypatinga konstanta, kurią galima priskirti bet kuriam žymekliui. Kai rodyklė priskiriama nuliui, rodyklė nieko nenurodo. Delphi pristato, pavyzdžiui, tuščią dinaminis masyvas arba ilgą eilutę kaip nulį.

Veikėjų rodyklės

Pagrindiniai PAnsiChar ir PWideChar tipai rodo AnsiChar ir WideChar reikšmes. Bendrasis PChar rodo žymiklį „Char“ kintamajam.

Šie simbolių rodyklės yra naudojami manipuliuoti niekiniais stygos. Pagalvokite apie „PChar“ kaip žymeklį, kuriame nurodoma niekinė eilutė arba masyvas, žymintis vieną.

Rodyklės į įrašus

Kai apibrėžiame įrašą ar kitą duomenų tipą, taip pat įprasta apibrėžti to tipo rodyklę. Tai leidžia lengvai valdyti tipo egzempliorius, nekopijuodami didelių atminties blokų.

Galimybė turėti rodykles įrašams (ir masyvams) leidžia daug lengviau nustatyti sudėtingas duomenų struktūras kaip susietus sąrašus ir medžius.

tipo
pNextItem = ^ TLinkedListItem
TLinkedListItem = įrašassName: Styga; „iValue“: sveikasis skaičius; „NextItem“: pNextItem;
galas
;

Susietų sąrašų idėja yra suteikti mums galimybę išsaugoti kito susieto elemento adresą sąraše „NextItem“ įrašo lauke.

Pvz., Rodykles į įrašus taip pat galima naudoti, kai, pvz., Saugomi tinkinti kiekvieno medžio rodinio elementai.

Procedūriniai ir metodiniai nurodymai

Kita svarbi rodyklės sąvoka „Delphi“ yra procedūrų ir metodų rodyklės.

Rodyklės, nurodančios procedūros ar funkcijos adresą, vadinamos procedūrinėmis rodyklėmis. Metodo rodyklės yra panašios į procedūros rodykles. Tačiau, užuot rėmęsi atskiromis procedūromis, jie turi nurodyti klasių metodus.

Metodo rodyklė yra rodyklė, kurioje yra informacijos ir apie pavadinimą, ir apie objektą, į kurį kreipiamasi.

Rodyklės ir „Windows“ API

Dažniausiai „Delphi“ rodyklėse naudojamas C ir C ++ kodo sąsajos, apimančios prieigą prie „Windows“ API.

„Windows“ API funkcijos naudoja daugybę duomenų tipų, kurie „Delphi“ programuotojui gali būti nepažįstami. Daugelis API funkcijų iškvietimo parametrų yra kai kurių duomenų tipų rodyklės. Kaip minėta aukščiau, skambindami „Windows API“ funkcijoms, „Delphi“ naudojame niekines galines eilutes.

Daugeliu atvejų, kai API skambutis grąžina buferio arba rodyklės vertę į duomenų struktūrą, šiuos buferius ir duomenų struktūras turi paskirstyti programa prieš skambindama API. „SHBrowseForFolder“ „Windows API“ funkcija yra vienas iš pavyzdžių.

Rodyklės ir atminties paskirstymas

Tikroji rodyklių galia kyla iš galimybės atidėti atmintį programos vykdymo metu.

Šio kodo turėtų pakakti įrodyti, kad darbas su rodyklėmis nėra toks sunkus, kaip gali pasirodyti iš pradžių. Jis naudojamas valdiklio tekstui (antraštėms) pakeisti naudojant pateiktą rankeną.

procedūra „GetTextFromHandle“ („hWND: THandle“);
var
pText: PChar; // žymeklis su char (žr. aukščiau)„TextLen“: sveikasis skaičius;
prasideda

{gaukite teksto ilgį}
„TextLen“: = „GetWindowTextLength“ (hWND);
{atidaryti atmintį}

„GetMem“ („pText“, „TextLen“); // paima rodyklę
{gauti valdiklio tekstą}
„GetWindowText“ („hWND“, „pText“, „TextLen + 1“);
{rodyti tekstą}
„ShowMessage“ (eilutė („pText“))
{atlaisvinkite atmintį}
„FreeMem“ („pText“);
galas
;
instagram story viewer