Typy łańcuchowe


Typ łańcuchowy String reprezentuje sekwencję znaków. W Object Pascalu zaimplementowano następujące typy łańcuchowe:

TypMaksymalna długośćRozmiar pamięciPrzeznaczenie
ShortString 255 characters 2B..256B wsteczna kompatybilność
AnsiString ~2^31 characters 4B..2GB znaki 8-bitowe (ANSI)
WideString ~2^30 characters 4B..2GB znaki Unicode; serwery COM i interfejsy

AnsiString, nazywany długim łańcuchem, jest preferowany do większości zastosowań.

Różne typy łańcuchowe mogą być łączone w podstawieniach i wyrażeniach. Jednak łańcuchy stanowiące odwołania w listach parametrów funkcji i procedur muszą mieć odpowiednie typy.

Słowo zarezerwowane String jest traktowane jako typ ogólny ("generic").

Deklaracja:

var S: string;

tworzy zmienną przechowującą łańcuch. W przypadku włączonej opcji kompilatora Huge strings ({$H+}), kompilator interpretuje String jako AnsiString. Jeśli opcja Huge strings jest wyłączona ({$H–}) String zostanie potraktowany jako ShortString.

Funkcja Length zwraca długość łańcucha będącego jej parametrem.

Procedura SetLength ustawi długość łańcucha.

Porównania łańcuchów wykonywane są na zasadzie porównania numerów znaków znajdujących się na odpowiadających sobie pozycjach w obu łańcuchach. W przypadku łańcuchów o różnych długościach, każdy znak w dłuższym łańcuchu przy porównaniu z brakującym znakiem z krótszego łańcucha daje relację większości. Łańcuch 'AB' jest większy niż 'A'; czyli wyrażenie 'AB' > 'A' jest prawdziwe. Łańcuchy puste mają najniższe wartości.

Dostęp do poszczególnych znaków w łańcuchu osiągalny jest poprzez indeksowanie. Zapis S[i] reprezentuje i-ty znak w łańcuchu S. Dla ShortString i AnsiString, S[i] jest typu AnsiChar; dla WideString S[i] jest typu WideChar. Instrukcja MyString[2] := 'A'; podstawia znak 'A' na drugiej pozycji w łańcuchu MyString.

Funkcja UpCase zmienia litery w łańcuchu z małych na wielkie. Przykład:

var I: Integer;
begin
  I := Length(MyString);
  while I > 0 do
  begin
    MyString[I] := UpCase(MyString[I]);
    I := I - 1;
  end;
end;

Próba zapisania znaku do łańcucha wg indeksu spoza prawdziwego zakresu, powoduje bląd access violations.

Przykłady podstawień do łańcuchów:

MyString := 'Hello world!';
MyString := 'Hello ' + 'world';
MyString := MyString + '!';
MyString := ' ';               { spacja }
MyString := '';                { pusty łańcuch }