Strengetyper i Delphi (Delphi for nybegynnere)
Bildekilde RF/Cadalpe/Getty Images
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 lagres i datamaskinens minne.
Når vi har en variabel som vil inneholde en rekke tegn, kan vi erklære at den er av typen String .
Delphi tilbyr 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 en opptelling av (ANSII) tegn, med opptil 255 tegn i strengen. Den første byten i denne matrisen lagrer lengden på strengen. Siden dette var hovedstrengtypen i Delphi 1 (16 bit Delphi), er den eneste grunnen til å bruke Short String for bakoverkompatibilitet.
For å lage en variabel av typen ShortString bruker vi:
De s variabel er en kort strengvariabel som kan inneholde opptil 256 tegn, dens minne er statisk tildelt 256 byte. Siden dette vanligvis er bortkastet - usannsynlig vil den korte strengen din spre seg til maksimal lengde - den andre tilnærmingen til å bruke ShortStrings er å bruke undertyper av ShortString, hvis maksimale lengde er hvor som helst fra 0 til 255.
|_+_|
Dette lager en variabel kalt liten hvis maksimale lengde er 50 tegn.
Merk: Når vi tilordner en verdi til en Short String-variabel, avkortes strengen hvis den overskrider maksimumslengden for typen. Når vi sender korte strenger til noen Delphis strengmanipulerende rutine, blir de konvertert til og fra lang streng.
String / Lang / Ansi
Delphi 2 brakt til Object Pascal Lang streng type. Lang streng (i Delphis hjelp AnsiString) representerer en dynamisk allokert streng hvis maksimale lengde kun er begrenset av tilgjengelig minne. Alle 32-bits Delphi-versjoner bruker lange strenger som standard. Jeg anbefaler å bruke lange strenger når du kan.
|_+_|De s variabel kan inneholde fra null til et hvilket som helst praktisk antall tegn. Strengen vokser eller krymper når du tilordner nye data til den.
Vi kan bruke hvilken som helst strengvariabel som en rekke tegn, det andre tegnet i s har indeksen 2. Følgende kode
|_+_|tildeler T til det andre tegnet os den s variabel. Nå er de få av de første karakterene i s ser ut som: TTe s str... .
Ikke bli villedet, 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 arbeider med lange (Ansi) strenger, bruker Delphi referansetelling. På denne måten er strengkopiering faktisk raskere for lange strenger enn for korte strenger.
Referansetelling, ved eksempel:
Når vi lager streng s1 variabel, og tilordne en verdi til den, tildeler Delphi nok minne for strengen. Når vi kopierer s1 til s2 , Delphi kopierer ikke strengverdien i minnet, den øker bare referanseantallet og endrer s2 å peke på samme minneplassering som s1 .
For å minimere kopiering når vi sender strenger til rutiner, bruker Delphi kopier-på-skriv-teknikk. Anta at vi skal endre verdien av s2 strengvariabel; Delphi kopierer den første strengen til en ny minneplassering, siden endringen bare skal påvirke s2, ikke s1, og de peker begge til samme minneplassering.
Bred streng
Brede strenger er også dynamisk allokert og administrert, men de bruker ikke referansetelling eller kopi-på-skriv-semantikk. Brede strenger består av 16-bits Unicode-tegn.
Om Unicode-tegnsett
ANSI-tegnsettet som brukes av Windows er et enkeltbyte-tegnsett. 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-bits notasjon kan vi representere 65 536 forskjellige tegn. Indeksering av multibyte-strenger er ikke pålitelig, siden s[i] representerer ith-byten (ikke nødvendigvis det i-te tegnet) i s .
Hvis du må bruke Wide-tegn, bør du erklære at en strengvariabel er av typen WideString og tegnvariabelen din av typen WideChar. Hvis du vil undersøke en bred streng ett tegn om gangen, sørg for å teste for flerbitte tegn. Delphi støtter ikke automatiske typekonverteringer mellom Ansi- og Wide-strengtyper.
|_+_|Null avsluttet
En null- eller nullterminert streng er en rekke tegn, indeksert med et heltall som starter fra null. Siden matrisen ikke har noen lengdeindikator, bruker Delphi tegnet ASCII 0 (NULL; #0) for å markere grensen til strengen.
Dette betyr at det i hovedsak ikke er noen forskjell mellom en nullterminert streng og en array[0..NumberOfChars] av typen Char, der slutten av strengen er markert med #0.
Vi bruker nullterminerte strenger i Delphi når vi kaller Windows API-funksjoner. Object Pascal lar oss unngå å rote rundt med pekere til nullbaserte matriser når vi håndterer nullterminerte strenger ved å bruke PChar-typen. Tenk på en PChar som en peker til en nullterminert streng eller til matrisen som representerer en. For mer informasjon om pekere, sjekk: Pekere i Delphi .
For eksempel, The GetDriveType API-funksjonen bestemmer om en diskstasjon er en flyttbar, fast, CD-ROM-, RAM-disk eller nettverksstasjon. Følgende prosedyre viser alle stasjonene og deres typer på en brukers datamaskin. Plasser én knapp og én memo-komponent på et skjema og tilordne en OnClick-behandler av en knapp:
|_+_|Blanding av Delphis strenger
Vi kan fritt blande alle fire forskjellige typer strenger, Delphi vil gi det best å forstå hva vi prøver å gjøre. Oppgaven s:=p, der s er en strengvariabel og p er et PChar-uttrykk, kopierer en nullterminert streng til en lang streng.
Karaktertyper
I tillegg til fire strengdatatyper, har Delphi tre tegntyper: Char , AnsiChar , og WideChar . En strengkonstant med lengde 1, for eksempel 'T', kan angi en tegnverdi. Den generiske karaktertypen er Char, som tilsvarer AnsiChar. WideChar-verdier er 16-biters tegn sortert i henhold til Unicode-tegnsettet. De første 256 Unicode-tegnene tilsvarer ANSI-tegnene.