Stringtyper i Delphi

Som med alle programmeringsspråk, i Delphi, variabler er plassholdere som brukes til å lagre verdier; de har navn og datatyper. Datatypen til en variabel bestemmer hvordan bitene som representerer disse verdiene er lagret i datamaskinens minne.

Når vi har en variabel som vil inneholde et utvalg av tegn, kan vi erklære at den er av typenstring.
Delphi gir et sunt utvalg av strengoperatører, funksjoner og prosedyrer. Før vi tilordner en strengdatatype til en variabel, må vi forstå Delphis fire strengtyper grundig.

Kort streng

For å si det enkelt, Kort streng er et tellende utvalg (ANSII) tegn, med opptil 255 tegn i strengen. Den første byten i denne matrisen lagrer lengden på strengen. Siden dette var hovedstrengetypen i Delphi 1 (16 bit Delphi), er den eneste grunnen til å bruke Short String for bakoverkompatibilitet.
For å lage en variabel ShortString-type bruker vi:

Var s: ShortString; s: = 'Delphi-programmering'; // S_Length: = Ord (s [0])); // som er den samme som lengde (r)


De s variabel er en kort strengvariabel som kan inneholde opptil 256 tegn, dens minne er en statisk tilordnet 256 byte. Siden dette vanligvis er bortkastet - usannsynlig vil den korte strengen din spre seg til maksimal lengde - sekund tilnærming til å bruke korte strenger ved å bruke undertyper av ShortString, hvis maksimale lengde er hvor som helst fra 0 til 255.

instagram viewer

Var ssmall: String [50]; ssmall: = 'Kort streng, opptil 50 tegn';

Dette skaper en variabel som heter ssmall hvis maksimale lengde er 50 tegn.

Merk: Når vi tilordner en verdi til en kortstrengvariabel, blir strengene avkortet hvis den overskrider den maksimale lengden for typen. Når vi passerer korte strenger til noen Delphis streng manipulerende rutine, konverteres de til og fra lang streng.

String / Long / Ansi

Delphi 2 brakt til Object Pascal Lang streng type. Lang streng (i Delphis hjelp AnsiString) representerer en dynamisk tilordnet streng som maksimal lengde bare er begrenset av tilgjengelig minne. Alle 32-biters Delphi-versjoner bruker lange strenger som standard. Jeg anbefaler å bruke lange strenger når du kan.

Var s: Streng; s: = 'Strengen s kan være av hvilken som helst størrelse ...';

De s variabel kan inneholde fra null til et hvilket som helst praktisk antall tegn. Strengen vokser eller krymper når du tildeler nye data til den.

Vi kan bruke hvilken som helst strengvariabel som et utvalg av tegn, det andre tegnet i s har indeksen 2. Følgende kode

s [2]: = 'T';

redere T til det andre tegnet os s variabel. Nå er de få av de første tegnene i s ser ut som: De str ....
Ikke bli villedende, du kan ikke bruke s [0] for å se lengden på strengen, s er ikke ShortString.

Referansetelling, kopi-på-skriv

Siden minnetildeling gjøres av Delphi, trenger vi ikke å bekymre oss for søppelinnsamling. Når du jobber med Long (Ansi) strenger, bruker Delphi referansetelling. Slik kopieres strengstrenging faktisk raskere for lange strenger enn for korte strenger.
Referansetelling, ved eksempel:

Var s1, s2: String; s1: = 'første streng'; s2: = s1;

Når vi lager streng s1 variabel, og tildeler noe verdi til den, tildeler Delphi nok minne til strengen. Når vi kopierer s1 til s2, Delphi kopierer ikke strengverdien i minnet, den øker bare referansetallet og endrer s2 for å peke på samme minneplassering som s1.

For å minimere kopiering når vi sender strenger til rutiner, bruker Delphi copy-on-write-teknikk. Anta at vi skal endre verdien på s2 strengvariabel; Delphi kopierer den første strengen til en ny minneplassering, siden endringen bare skal påvirke s2, ikke s1, og begge peker på samme minneplassering.

Bred streng

Brede strenger er også dynamisk tildelt og administrert, men de bruker ikke referansetelling eller kopi-på-skriv-semantikk. Brede strenger består av 16-biters Unicode-tegn.

Om tegnsett fra Unicode

ANSI tegnsettet som brukes av Windows, er et tegnsett med en byte. Unicode lagrer hvert tegn i tegnsettet i 2 byte i stedet for 1. Noen nasjonale språk bruker ideografiske tegn, som krever mer enn de 256 tegnene som støttes av ANSI. Med 16-biters notasjon kan vi representere 65,536 forskjellige tegn. Indeksering av multibytestrenger er ikke pålitelig, siden s [i] representerer ith byte (ikke nødvendigvis den i-th tegnet) i s.

Hvis du må bruke Brede tegn, bør du erklære en strengvariabel til å være av WideString-typen og din karaktervariabel av WideChar-typen. Hvis du vil undersøke en bred streng ett tegn om gangen, må du huske å teste for multibitt tegn. Delphi støtter ikke automatiske konverteringer mellom Ansi og Wide strengstyper.

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

Null sagt opp

En null eller null terminert streng er en rekke tegn, indeksert av et helt tall som starter fra null. Siden matrisen ikke har noen lengdeindikator, bruker Delphi ASCII 0 (NULL; # 0) tegn for å markere strengen.
Dette betyr at det i det vesentlige ikke er noen forskjell mellom en null-avsluttet streng og en matrise [0..NummerOfChars] av typen Char, der enden av strengen er merket med # 0.

Vi bruker null-avsluttede strenger i Delphi når vi kaller Windows API-funksjoner. Objekt Pascal lar oss unngå å rote med pekere til null-baserte matriser når vi håndterer null-avsluttede strenger ved bruk av PChar-typen. Tenk på en PChar som en peker til en null-avsluttet streng eller til matrisen som representerer en. For mer info om pekere, sjekk:Pekere i Delphi.

For eksempel The GetDriveType API-funksjonen avgjør om en diskstasjon er en flyttbar, fast CD-ROM, RAM-disk eller nettverksstasjon. Følgende prosedyre viser alle stasjonene og deres typer på en datamaskine. Plasser en knapp og en memo-komponent på et skjema og tilordne en OnClick-behandler av en knapp:

fremgangsmåte TForm1.Button1Click (avsender: TObject); Var
Drive: Char; DriveLetter: String [4]; begynnetil Drive: = 'A' til 'Z' gjørebegynne
DriveLetter: = Drive + ': \'; sak GetDriveType (PChar (Drive + ': \')) av
DRIVE_REMOVABLE: Memo1.Lines. Legg til (DriveLetter + 'Floppy Drive'); DRIVE_FIXED: Memo1.Lines. Legg til (DriveLetter + 'Fixed Drive'); DRIVE_REMOTE: Memo1.Lines. Legg til (DriveLetter + 'Network Drive'); DRIVE_CDROM: Memo1.Lines. Legg til (DriveLetter + 'CD-ROM Drive'); DRIVE_RAMDISK: Memo1.Lines. Legg til (DriveLetter + 'RAM Disk'); slutt; slutt; slutt;

Blanding av Delphis strenger

Vi kan blande alle fire forskjellige strengene fritt, Delphi vil gi det beste å forstå hva vi prøver å gjøre. Oppgaven s: = p, der s er en strengvariabel og p er et PChar-uttrykk, kopierer en null-avsluttet streng til en lang streng.

Karaktertyper

I tillegg til fire strengdatatyper har Delphi tre karaktertyper: Char, AnsiChar, ogWideChar. En strengkonstant med lengde 1, for eksempel 'T', kan betegne en tegnverdi. Den generiske karaktertypen er Char, som tilsvarer AnsiChar. WideChar-verdier er 16-bits tegn som er ordnet i henhold til Unicode-tegnsettet. De første 256 Unicode-tegnene tilsvarer ANSI-tegnene.