Tekenreekstypen in Delphi

Zoals bij elke programmeertaal, in Delphi, variabelen zijn tijdelijke aanduidingen die worden gebruikt om waarden op te slaan; ze hebben namen en gegevenstypen. Het gegevenstype van een variabele bepaalt hoe de bits die deze waarden vertegenwoordigen, worden opgeslagen in het computergeheugen.

Als we een variabele hebben die een array met tekens bevat, kunnen we verklaren dat deze van het type isDraad.
Delphi biedt een gezond assortiment snaaroperatoren, functies en procedures. Voordat we een gegevenstype String aan een variabele toewijzen, moeten we Delphi's vier stringtypen grondig begrijpen.

Korte snaar

Simpel gezegd, Korte snaar is een getelde array van (ANSII) karakters, met maximaal 255 karakters in de string. De eerste byte van deze array slaat de lengte van de string op. Aangezien dit het belangrijkste type string was in Delphi 1 (16 bit Delphi), is de enige reden om Short String te gebruiken voor achterwaartse compatibiliteit.
Om een ​​variabele van het type ShortString te maken, gebruiken we:

instagram viewer
var s: ShortString; s: = 'Delphi Programmeren'; // S_Length: = Ord (s [0])); // wat hetzelfde is als Lengte (s)


De s variable is een Short string variabele die tot 256 karakters kan bevatten, het geheugen is een statisch toegewezen 256 bytes. Aangezien dit meestal verkwistend is - onwaarschijnlijk zal uw korte snaar zich tot de maximale lengte verspreiden - seconde benadering voor het gebruik van korte strings is het gebruik van subtypen van shortstring, waarvan de maximale lengte ergens tussen 0 en 0 ligt 255.

var ssmall: String [50]; ssmall: = 'Korte string, tot 50 karakters';

Dit creëert een variabele genaamd klein waarvan de maximale lengte 50 tekens is.

Opmerking: wanneer we een waarde toewijzen aan een korte stringvariabele, wordt de string afgekapt als deze de maximale lengte voor het type overschrijdt. Wanneer we korte snaren doorgeven aan sommige Delphi's snaarmanipulatieroutine, worden ze geconverteerd naar en van lange snaren.

String / Long / Ansi

Delphi 2 naar Object Pascal gebracht Lange snaar type. Lange string (in de hulp van Delphi AnsiString) vertegenwoordigt een dynamisch toegewezen string waarvan de maximale lengte alleen wordt beperkt door het beschikbare geheugen. Alle 32-bits Delphi-versies gebruiken standaard lange tekenreeksen. Ik raad aan om waar mogelijk lange snaren te gebruiken.

var s: String; s: = 'De s-string kan elke grootte hebben ...';

De s variabele kan van nul tot elk praktisch aantal tekens bevatten. De string groeit of krimpt als je er nieuwe data aan toewijst.

We kunnen elke tekenreeksvariabele gebruiken als een reeks tekens, het tweede teken in s heeft de index 2. De volgende code

s [2]: = 'T';

wijst toe T naar het tweede personage os de s variabel. Nu de paar van de eerste karakters in s ziet eruit als: TTe s str ....
Laat u niet misleiden, u kunt s [0] niet gebruiken om de lengte van de string te zien, s is niet ShortString.

Referentie tellen, copy-on-write

Omdat geheugentoewijzing door Delphi wordt gedaan, hoeven we ons geen zorgen te maken over het verzamelen van afval. Bij het werken met lange (Ansi) strings gebruikt Delphi referentietelling. Op deze manier is het kopiëren van snaren eigenlijk sneller voor lange strings dan voor korte strings.
Referentie tellen, bijvoorbeeld:

var s1, s2: String; s1: = 'eerste string'; s2: = s1;

Wanneer we een string maken s1 variabele en wijs er een waarde aan toe, Delphi wijst voldoende geheugen toe voor de string. Als we kopiëren s1 naar s2, Delphi kopieert de tekenreekswaarde niet in het geheugen, het verhoogt alleen de referentietelling en verandert de s2 om naar dezelfde geheugenlocatie te wijzen als s1.

Om het kopiëren tot een minimum te beperken wanneer we strings doorgeven aan routines, gebruikt Delphi de copy-on-write-techniek. Stel dat we de waarde van de s2 string variabele; Delphi kopieert de eerste string naar een nieuwe geheugenlocatie, aangezien de wijziging alleen s2 zou moeten beïnvloeden, niet s1, en beide wijzen naar dezelfde geheugenlocatie.

Brede snaar

Brede strings worden ook dynamisch toegewezen en beheerd, maar ze gebruiken geen referentietelling of de copy-on-write semantiek. Brede tekenreeksen bestaan ​​uit 16-bits Unicode-tekens.

Over Unicode-tekensets

De ANSI-tekenset die door Windows wordt gebruikt, is een tekenset van één byte. Unicode slaat elk teken in de tekenset op in 2 bytes in plaats van 1. Sommige nationale talen gebruiken ideografische tekens, waarvoor meer nodig zijn dan de 256 tekens die door ANSI worden ondersteund. Met 16-bits notatie kunnen we 65.536 verschillende karakters vertegenwoordigen. Indexering van multibyte strings is sindsdien niet betrouwbaar si] vertegenwoordigt de ith-byte (niet noodzakelijk het i-de teken) in s.

Als u brede tekens moet gebruiken, moet u een tekenreeksvariabele declareren van het type WideString en uw tekenvariabele van het type WideChar. Als u een brede tekenreeks één teken tegelijk wilt onderzoeken, moet u testen op multibite-tekens. Delphi ondersteunt geen automatische typeconversies tussen Ansi en Wide string types.

var s: WideString; c: WideChar; s: = 'Delphi_ Guide'; s [8]: = 'T'; //s='Delphi_TGuide';

Null is beëindigd

Een tekenreeks die eindigt op nul of nul is een reeks tekens, geïndexeerd door een geheel getal vanaf nul. Aangezien de array geen lengte-indicator heeft, gebruikt Delphi de ASCII 0 (NULL; # 0) teken om de grens van de string te markeren.
Dit betekent dat er in wezen geen verschil is tussen een op null eindigende tekenreeks en een array [0..NumberOfChars] van het type Char, waarbij het einde van de tekenreeks wordt gemarkeerd met # 0.

We gebruiken null-terminated strings in Delphi wanneer we Windows API-functies aanroepen. Met Object Pascal kunnen we voorkomen dat er geknoeid wordt met verwijzingen naar op nul gebaseerde arrays bij het verwerken van op null eindigende tekenreeksen met behulp van het PChar-type. Beschouw een PChar als een aanwijzer naar een null-terminated string of naar de array die er een voorstelt. Controleer voor meer informatie over pointers:Wijzers in Delphi.

Bijvoorbeeld The GetDriveType API-functie bepaalt of een schijfstation een verwijderbare, vaste cd-rom, RAM-schijf of netwerkstation is. De volgende procedure geeft een overzicht van alle schijven en hun typen op de computer van een gebruiker. Plaats één knop en één memocomponent op een formulier en wijs een OnClick-handler van een knop toe:

procedure TForm1.Button1Click (Afzender: TObject); var
Rijden: Char; DriveLetter: String [4]; beginnenvoor Rijden: = 'A' naar 'Z' Doenbeginnen
DriveLetter: = Drive + ': \'; geval GetDriveType (PChar (Drive + ': \')) van
DRIVE_REMOVABLE: Memo1.Lines. Voeg (DriveLetter + 'Floppy Drive') toe; DRIVE_FIXED: Memo1.Lines. Voeg (DriveLetter + 'Fixed Drive') toe; DRIVE_REMOTE: Memo1.Lines. Voeg (DriveLetter + 'Network Drive') toe; DRIVE_CDROM: Memo1.Lines. Voeg (DriveLetter + 'CD-ROM Drive') toe; DRIVE_RAMDISK: Memo1.Lines. Voeg (DriveLetter + 'RAM Disk') toe; einde; einde; einde;

De snaren van Delphi mengen

We kunnen alle vier de verschillende soorten snaren vrij mengen, Delphi zal het beste doen om te begrijpen wat we proberen te doen. De toewijzing s: = p, waarbij s een stringvariabele is en p een PChar-uitdrukking is, kopieert een op null eindigende string in een lange string.

Karaktertypes

Naast vier gegevenstypen met tekenreeksen heeft Delphi drie tekensoorten: Char, AnsiChar, enWideChar. Een tekenreeksconstante met lengte 1, zoals 'T', kan een tekenwaarde aangeven. Het generieke karaktertype is Char, wat equivalent is aan AnsiChar. WideChar-waarden zijn 16-bits tekens die zijn gerangschikt volgens de Unicode-tekenset. De eerste 256 Unicode-tekens komen overeen met de ANSI-tekens.

instagram story viewer