Typy ciągów w Delphi

Jak w każdym języku programowania, w Delfy, zmienne są symbolami zastępczymi używanymi do przechowywania wartości; mają nazwy i typy danych. Typ danych zmiennej określa, w jaki sposób bity reprezentujące te wartości są przechowywane w pamięci komputera.

Kiedy mamy zmienną, która będzie zawierać tablicę znaków, możemy zadeklarować, że jest typuStrunowy.
Delphi zapewnia zdrowy asortyment operatorów łańcuchowych, funkcji i procedur. Przed przypisaniem typu danych String do zmiennej musimy dokładnie zrozumieć cztery typy ciągów Delphi.

Krótki sznurek

Po prostu, Krótki sznurek jest policzoną tablicą znaków (ANSII), zawierających do 255 znaków w ciągu. Pierwszy bajt tej tablicy przechowuje długość ciągu. Ponieważ był to główny typ łańcucha w Delphi 1 (16 bitów Delphi), jedynym powodem użycia krótkiego łańcucha jest kompatybilność wsteczna.
Do utworzenia zmiennej typu ShortString używamy:

var s: ShortString; s: = 'Programowanie Delphi'; // S_Length: = Ord (s [0])); // która jest taka sama jak długość (-y)
instagram viewer


The s zmienna jest zmienną o krótkim łańcuchu, która może pomieścić do 256 znaków, jej pamięć to statycznie przydzielone 256 bajtów. Ponieważ jest to zwykle marnotrawstwo - mało prawdopodobne, aby Twój krótki sznurek rozprzestrzenił się na maksymalną długość - sekundę podejście do używania krótkich ciągów polega na użyciu podtypów ShortString, których maksymalna długość wynosi od 0 do 255.

var ssmall: String [50]; ssmall: = 'Krótki ciąg znaków, do 50 znaków';

To tworzy zmienną o nazwie ssmall którego maksymalna długość wynosi 50 znaków.

Uwaga: Kiedy przypisujemy wartość do zmiennej Short String, łańcuch jest obcinany, jeśli przekracza maksymalną długość dla typu. Kiedy przekazujemy krótkie łańcuchy do procedury manipulacji ciągiem Delphi, są one konwertowane na i z długiego łańcucha.

String / Long / Ansi

Delphi 2 przeniesione do Object Pascal Długi sznurek rodzaj. Długi ciąg (w pomocy Delphi AnsiString) reprezentuje ciąg przydzielany dynamicznie, którego maksymalna długość jest ograniczona tylko dostępną pamięcią. Wszystkie 32-bitowe wersje Delphi domyślnie używają długich ciągów. Kiedy tylko możesz, zalecam używanie długich łańcuchów.

var s: String; s: = 'Ciąg s może mieć dowolny rozmiar ...';

The s zmienna może pomieścić od zera do dowolnej praktycznej liczby znaków. Ciąg rośnie lub kurczy się, gdy przypisujesz mu nowe dane.

Możemy użyć dowolnej zmiennej łańcuchowej jako tablicy znaków, drugiego znaku w s ma indeks 2. Poniższy kod

s [2]: = „T”;

przypisuje T. do drugiego znaku s zmienna. Teraz kilka pierwszych znaków s wygląda jak: TTe s str ....
Nie daj się zwieść, nie możesz użyć s [0], aby zobaczyć długość łańcucha, s nie jest ShortString.

Liczenie referencji, kopiowanie przy zapisie

Ponieważ alokacja pamięci jest wykonywana przez Delphi, nie musimy się martwić o odśmiecanie. Podczas pracy z długimi (Ansi) ciągami znaków Delphi używa zliczania referencji. W ten sposób kopiowanie ciągów jest w rzeczywistości szybsze dla długich ciągów niż dla krótkich.
Liczenie referencji, na przykład:

var s1, s2: String; s1: = „pierwszy ciąg”; s2: = s1;

Kiedy tworzymy ciąg s1 zmiennej i przypisać jej pewną wartość, Delphi przydziela wystarczającą ilość pamięci dla łańcucha. Kiedy kopiujemy s1 do s2, Delphi nie kopiuje wartości ciągu do pamięci, jedynie zwiększa liczbę referencji i zmienia wartość s2 wskazać tę samą lokalizację pamięci co s1.

Aby zminimalizować kopiowanie, gdy przekazujemy ciągi znaków do procedur, Delphi używa techniki kopiowania przy zapisie. Załóżmy, że mamy zmienić wartość s2 zmienna łańcuchowa; Delphi kopiuje pierwszy ciąg do nowej lokalizacji pamięci, ponieważ zmiana powinna dotyczyć tylko s2, a nie s1, i oba wskazują na tę samą lokalizację pamięci.

Szeroki sznurek

Szerokie ciągi są również dynamicznie przydzielane i zarządzane, ale nie używają liczenia referencji ani semantyki kopiowania przy zapisie. Szerokie ciągi znaków składają się z 16-bitowych znaków Unicode.

Informacje o zestawach znaków Unicode

Zestaw znaków ANSI używany przez system Windows to zestaw znaków jednobajtowych. Unicode przechowuje każdy znak w zestawie znaków w 2 bajtach zamiast 1. Niektóre języki narodowe używają znaków ideograficznych, które wymagają więcej niż 256 znaków obsługiwanych przez ANSI. Za pomocą 16-bitowej notacji możemy reprezentować 65 536 różnych znaków. Indeksowanie łańcuchów wielobajtowych nie jest wiarygodne, ponieważ si] reprezentuje i-ty bajt (niekoniecznie i-ty znak) w s.

Jeśli musisz użyć znaków Wide, powinieneś zadeklarować zmienną łańcuchową typu WideString i zmienną znakową typu WideChar. Jeśli chcesz badać szeroki ciąg po jednym znaku na raz, koniecznie sprawdź znaki wielobitowe. Delphi nie obsługuje automatycznej konwersji typów między typami Ansi i Wide.

var s: WideString; c: WideChar; s: = „Przewodnik Delphi”; s [8]: = „T”; //s='Delphi_TGuide';

Zero zakończone

Łańcuch zakończony znakiem zerowym lub zerowym to tablica znaków, indeksowana liczbą całkowitą rozpoczynającą się od zera. Ponieważ tablica nie ma wskaźnika długości, Delphi używa ASCII 0 (NULL; # 0) znak oznaczający granicę ciągu.
Oznacza to, że zasadniczo nie ma różnicy między zakończonym zerem łańcuchem a tablicą [0..NumberOfChars] typu Char, gdzie koniec łańcucha jest oznaczony przez 0.

Używamy łańcuchów zakończonych znakiem zerowym w Delphi podczas wywoływania funkcji Windows API. Object Pascal pozwala nam uniknąć bałaganu wokół wskaźników ze wskaźnikami do tablic zerowych podczas obsługi łańcuchów zakończonych znakiem zerowym za pomocą typu PChar. Pomyśl o PChar jako o wskaźniku do łańcucha zakończonego znakiem null lub tablicy, która go reprezentuje. Aby uzyskać więcej informacji na temat wskaźników, sprawdź:Wskaźniki w Delphi.

Na przykład GetDriveType Funkcja API określa, czy dysk jest dyskiem wymiennym, stałym, CD-ROM, RAM lub dyskiem sieciowym. Poniższa procedura zawiera listę wszystkich dysków i ich typów na komputerze użytkownika. Umieść jeden przycisk i jeden składnik Memo w formularzu i przypisz do niego funkcję obsługi przycisku OnClick:

procedura TForm1.Button1Click (Sender: TObject); var
Napęd: Char; DriveLetter: String [4]; zaczynaćdla Napęd: = „A” do „Z” robićzaczynać
DriveLetter: = Drive + ': \'; walizka GetDriveType (PChar (Dysk + „: \”)) z
DRIVE_REMOVABLE: Memo1.Lines. Dodaj (DriveLetter + „Floppy Drive”); DRIVE_FIXED: Memo1.Lines. Dodaj (DriveLetter + „Fixed Drive”); DRIVE_REMOTE: Memo1.Lines. Dodaj (DriveLetter + „Network Drive”); DRIVE_CDROM: Memo1.Lines. Dodaj (DriveLetter + „Napęd CD-ROM”); DRIVE_RAMDISK: Memo1.Lines. Dodaj (DriveLetter + „RAM Disk”); koniec; koniec; koniec;

Miksowanie strun Delphi

Możemy swobodnie mieszać wszystkie cztery rodzaje ciągów, Delphi da z siebie wszystko, aby zrozumieć, co próbujemy zrobić. Przypisanie s: = p, gdzie s jest zmienną łańcuchową, a p jest wyrażeniem PChar, kopiuje łańcuch zakończony znakiem null do długiego łańcucha.

Typy postaci

Oprócz czterech typów ciągów danych, Delphi ma trzy typy znaków: Zwęglać, AnsiChar, iWideChar. Stała ciągu o długości 1, taka jak „T”, może oznaczać wartość znaku. Ogólny typ znaków to Char, co jest równoważne AnsiChar. Wartości WideChar to 16-bitowe znaki uporządkowane zgodnie z zestawem znaków Unicode. Pierwsze 256 znaków Unicode odpowiada znakom ANSI.