Typy reťazcov v Delphi (Delphi pre začiatočníkov)
Zdroj obrázkov RF/Cadalpe/Getty Images
Rovnako ako v každom programovacom jazyku, v Delphi , premenné sú zástupné symboly používané na ukladanie hodnôt; majú názvy a typy údajov. Dátový typ premennej určuje, ako sú bity reprezentujúce tieto hodnoty uložené v pamäti počítača.
Keď máme premennú, ktorá bude obsahovať nejaké pole znakov, môžeme ju vyhlásiť za typ Reťazec .
Delphi poskytuje zdravý sortiment reťazcových operátorov, funkcií a procedúr. Pred priradením dátového typu String premennej musíme dôkladne pochopiť štyri typy reťazcov Delphi.
Krátka struna
Jednoducho povedané, Krátka struna je počítané pole (ANSII) znakov s až 255 znakmi v reťazci. Prvý bajt tohto poľa ukladá dĺžku reťazca. Keďže toto bol hlavný typ reťazca v Delphi 1 (16 bit Delphi), jediným dôvodom na použitie krátkych reťazcov je spätná kompatibilita.
Na vytvorenie premennej typu ShortString používame:
The s premenná je premenná s krátkym reťazcom schopná pojať až 256 znakov, jej pamäť je staticky pridelených 256 bajtov. Keďže je to zvyčajne zbytočné – je nepravdepodobné, že sa váš krátky reťazec rozšíri na maximálnu dĺžku – druhým prístupom k používaniu krátkych reťazcov je použitie podtypov krátkych reťazcov, ktorých maximálna dĺžka je od 0 do 255.
|_+_|
Vznikne tak premenná tzv malý ktorého maximálna dĺžka je 50 znakov.
Poznámka: Keď premennej Short String priradíme hodnotu, reťazec sa skráti, ak prekročí maximálnu dĺžku pre daný typ. Keď prejdeme krátke reťazce do nejakej rutiny na manipuláciu s reťazcami v Delphi, skonvertujú sa na dlhý reťazec az neho.
Struna / Dlhá / Ansi
Delphi 2 priniesol Object Pascal Dlhá struna typu. Dlhý reťazec (v nápovedi Delphi AnsiString) predstavuje dynamicky alokovaný reťazec, ktorého maximálna dĺžka je obmedzená len dostupnou pamäťou. Všetky 32-bitové verzie Delphi štandardne používajú dlhé reťazce. Odporúčam používať dlhé šnúrky vždy, keď je to možné.
|_+_|The s premenná môže obsahovať od nuly po akýkoľvek praktický počet znakov. Reťazec rastie alebo sa zmenšuje, keď k nemu priraďujete nové údaje.
Môžeme použiť ľubovoľnú reťazcovú premennú ako pole znakov, druhý znak v s má index 2. Nasledujúci kód
|_+_|priraďuje T na druhý znak os s premenlivý. Teraz niekoľko prvých postáv s vyzerať ako: TTe s str... .
Nenechajte sa zmiasť, nemôžete použiť s[0] na zobrazenie dĺžky reťazca, s nie je ShortString.
Počítanie referencií, copy-on-write
Keďže alokáciu pamäte vykonáva Delphi, nemusíme sa obávať zberu odpadu. Pri práci s dlhými (Ansi) reťazcami Delphi používa počítanie referencií. Týmto spôsobom je kopírovanie reťazcov v skutočnosti rýchlejšie pre dlhé reťazce ako pre krátke reťazce.
Referenčné počítanie, napríklad:
Keď vytvoríme reťazec s1 premennej a priradíte jej nejakú hodnotu, Delphi pridelí reťazcu dostatok pamäte. Keď kopírujeme s1 do s2 , Delphi nekopíruje hodnotu reťazca do pamäte, iba zvyšuje počet referencií a mení hodnotu s2 aby ukázal na rovnaké miesto v pamäti ako s1 .
Na minimalizáciu kopírovania pri odovzdávaní reťazcov rutinám používa Delphi techniku kopírovania pri zápise. Predpokladajme, že máme zmeniť hodnotu s2 reťazcová premenná; Delphi skopíruje prvý reťazec na nové miesto v pamäti, pretože zmena by mala ovplyvniť iba s2, nie s1, a oba smerujú na rovnaké miesto v pamäti.
Široká struna
Široké reťazce sú tiež dynamicky prideľované a spravované, ale nepoužívajú počítanie referencií ani sémantiku kopírovania pri zápise. Široké reťazce pozostávajú zo 16-bitových znakov Unicode.
O znakových sadách Unicode
Znaková sada ANSI používaná systémom Windows je jednobajtová znaková sada. Unicode ukladá každý znak v znakovej sade do 2 bajtov namiesto 1. Niektoré národné jazyky používajú ideografické znaky, ktoré vyžadujú viac ako 256 znakov podporovaných ANSI. Pomocou 16-bitového zápisu môžeme reprezentovať 65 536 rôznych znakov. Indexovanie viacbajtových reťazcov nie je spoľahlivé, pretože s[i] predstavuje i-tý bajt (nie nevyhnutne i-tý znak) v s .
Ak musíte použiť znaky Wide, mali by ste deklarovať reťazcovú premennú typu WideString a premennú znakov typu WideChar. Ak chcete preskúmať široký reťazec jeden znak po druhom, nezabudnite otestovať znaky s viacerými bitmi. Delphi nepodporuje automatickú konverziu typov medzi typmi reťazcov Ansi a Wide.
|_+_|Null ukončené
Reťazec ukončený nulou alebo nulou je pole znakov indexovaných celým číslom začínajúcim od nuly. Keďže pole nemá žiadny indikátor dĺžky, Delphi používa znak ASCII 0 (NULL; #0) na označenie hranice reťazca.
To znamená, že v podstate neexistuje žiadny rozdiel medzi reťazcom ukončeným nulou a poľom[0..NumberOfChars] typu Char, kde je koniec reťazca označený #0.
Pri volaní funkcií Windows API používame v Delphi reťazce ukončené nulou. Object Pascal nám umožňuje vyhnúť sa hádkam s ukazovateľmi na polia založené na nule pri práci s reťazcami ukončenými nulou pomocou typu PChar. Predstavte si PChar ako ukazovateľ na reťazec ukončený nulou alebo na pole, ktoré ho predstavuje. Ďalšie informácie o ukazovateľoch nájdete na: Ukazovatele v Delphi .
Napríklad The GetDriveType Funkcia API určuje, či je disková jednotka vymeniteľná, pevná, CD-ROM, RAM disk alebo sieťová jednotka. Nasledujúci postup uvádza zoznam všetkých jednotiek a ich typov v počítači používateľa. Umiestnite jeden komponent Button a jeden Memo do formulára a priraďte k tlačidlu obslužný program OnClick:
|_+_|Miešanie Delphiho strún
Môžeme ľubovoľne miešať všetky štyri rôzne druhy strún, Delphi vám dá najlepšie zmysel toho, čo sa snažíme robiť. Priradenie s:=p, kde s je reťazcová premenná a p je výraz PChar, skopíruje reťazec ukončený nulou do dlhého reťazca.
Typy postáv
Okrem štyroch typov údajov typu reťazec má Delphi tri typy znakov: Char , AnsiChar , a WideChar . Reťazcová konštanta dĺžky 1, ako napríklad 'T', môže označovať hodnotu znaku. Všeobecný typ postavy je Char, čo je ekvivalent AnsiChar. Hodnoty WideChar sú 16-bitové znaky zoradené podľa znakovej sady Unicode. Prvých 256 znakov Unicode zodpovedá znakom ANSI.