Strings i Delphi

Tags:    delphi
Skrevet af Bruger #58 @ 16.06.2001
Strings i Delphi

I denne artikel vil jeg fortælle noget om strings i Delphi, de forskellige typer, hvordan man kan manipulere med dem og konvertere mellem typerne.

Forskellige typer af strings

Grundlæggende er der to typer af strings i Delphi: Pascal type og PChar type. Under dem er der igen nogen undergrupper:
Pascal type:
  • ShortString
  • AnsiString
  • WideString
PChar type:
  • PChar (PAnsiChar)
  • PWideChar

ShortString

Hvis du har Delphi 1 eller 2, så er standard string typen (den du får, hvis du bare skriver string) ShortString. Det specielle ved ShortString er at den kun kan indeholde op til 255 tegn. ShortString er repræsenteret i hukommelsen som:
Byte  Indhold
 1    1 byte længde indikator
 2+   op til 255 byte string-data
Du kan deklarere en ShortString på 3 måder:
var
  ss1: string; // kun ved Delphi 1 og 2
  (* Hvis du har Delphi 3 og op kan du skrive:
  {$H-}
  ss1: string;
  {$H-}
   Så vil du altid få en ShortString når du skriver string alene *)
  ss2: ShortString; // Allokerer 255 byte til string-data
  ss3: string[32]; // Allokerer 32 byte til string-data
Med mindre du har Delphi 1 eller 2 skal du ikke bruge ShortStrings. I Delphi 3 og op har de kun eet brugbart formål: Hvis du vil lave dit eget datafil format og bruge packed records, så skal du bruge ShortStrings.

AnsiString

I Delphi 3 og op er AnsiString standard string typen. AnsiString kaldes også for LongString. En AnsiString kan være op til 2 GB lang, eller rettere: op til al fri hukommelse kan bruges. (Hvor mange har over 2 GB RAM?) AnsiString bliver gemt som en 4 byte pointer til dynamisk allokeret hukommelse. Den bliver (tror jeg) repræsenteret i hukommelsen som:
Byte  Indhold
 -8   32 bit reference count
 -4   32 bit længde indikator
  0   String data, afsluttes altid med med byteværdien #0
Hvis du ikke ved hvad reference count er for noget, så kan du enten slå op i hjælpen eller bare nøjes med at vide at "det får det hele til at køre hurtigere". Kort og godt så er AnsiString den string type der er hurtigst og nemmest at arbejde med. Brug den når du kan.

WideString

Så vidt jeg ved er WideString det samme som PWideChar: en pointer til en Unicode string. Så vil jeg lige forklare hvad Unicode er for noget: 2 byte per tegn. Der er rigtig brugbart når du har med asiatiske sprog (som kinesisk) at gøre, fordi der er så mange forskellige bogstaver. Du skal kun bruge WideString når det er nødvendigt. Den er langsommere og fylder mere end AnsiString. Steder hvor du SKAL bruge WideString (PWideChar) er når du har med programmer der skal oversættes/bruges i lande med avancerede alfabeter (i asien normalt) og når du bruger COM objekter.

PChar

En PChar er en pointer til en Char, eller rettere sagt, en pointer til en række af Char, afsluttet med et binært nul (#0). Du bruger normalt PChar når du har med API kald at gøre. Et klassisk eksempel på brug af PChar er:
ShellExecute(Handle, 'open', PChar(Edit1.Text), '', '', SW_SHOW);
Faktisk er PChar præcis det samme som char *en_variabel typen i C. Normalt behøver du kun bruge PChar i et typecast af en AnsiString.

PWideChar

PWideChar en pointer til et Unicode tegn. Den et for WideString hvad PChar er for AnsiString.

Manipulation af strings

Da der er stor forskel på hvordan du manipulerer med Pascal type string og PChar type strings, vil jeg i alle eksemplerne på første linie skrive koden der skal til hvis du bruger en Pascal type string, og på anden linie skrive koden der skal bruges hvis der er tale om PChar typer.
Hvis du har to strings og vil lægge dem sammen til en, skal du gøre sådan her:
// Læg string1 og string 2 sammen. Put resultatet i string3.
string3 := string1 + string2; // med AnsiString
string3 := StrCat(string1, string2); // med PChar
Hvis du vil udtrække en del af en string og lægge den i en anden string skal du gøre sådan:
// Kopier tegn 2 til 7 fra string1 til string3. 
string3 := Copy(string1, 2, 5);
string3 := PChar(Copy(string(string1), 2, 5));
Bare de her to eksempler viser, hvorfor det en nemmere at arbejde mad Pascal type strings. Men hvis du nu kun vil have et enkelt tegn fra en string, så er det spild af tid at bruge Copy funktionen. Så gør du sådan her:
// Put tredje tegn i string1 i string3.
string3 := string1[3];
string3 := PChar(string(string1)[3]);
Hvis du vil slette nogen tegn inde midt i en string gør du sådan her:
// Slet tegn 2, 3 og 4 fra string 1
Delete(string1, 2, 3);
Delete(string(string1), 2, 3);
Nu vil jeg lige sige at det meste af det jeg gør ved PChar muligvis kan gøres nemmere. Jeg har bare ikke kunne finde funktioner der gør det.

Konvertering

At konvertere mellem AnsiString og PChar kan ikke være nemmere: Bare typecast til dan anden type. F.eks.:
// string til PChar
pchar1 := PChar(string1);
// PChar til string
string1 := pchar1;
Faktisk behøver du ikke typecaste en PChar hvis du bare vil tildele den til en AnsiString type string. Faktisk er det det samme der gælder for alle string typerne. Hvis der er mere du vil vide, så se i hjælpen (eller spørg i forummet). Du skal nok finde et svar.


Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (0)

Du skal være logget ind for at skrive en kommentar.
t