Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 105

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

3.3.6. НулСвой символ Π² сСрСдинС строки

Π₯отя символ #0 ΠΈ добавляСтся Π² ΠΊΠΎΠ½Π΅Ρ† ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки AnsiString, ΠΎΠ½ ΡƒΠΆΠ΅ Π½Π΅ являСтся ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ Π΅Π΅ ΠΊΠΎΠ½Ρ†Π°, Ρ‚.ΠΊ. Π΄Π»ΠΈΠ½Π° строки хранится ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. Π­Ρ‚ΠΎ позволяСт Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ символы #0 ΠΈ Π² сСрСдинС строки. Но Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠΉ строки Π² PChar Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ β€” это ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Zero Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС (листинг 3.32).

Листинг 3.32. ΠŸΠΎΡ‚Π΅Ρ€Ρ остатка строки послС символа #0

procedure TForm1.Button1Click(Sender: TObject);

var

 S1, S2, S3: string;

 P: PChar;

begin

 S1 := 'Test'#0'Test';

 S2 := S1;

 UniqueString(S2);

 P := PChar(S1);

 S3 := P;

 Label1.Caption := IntToStr(Length(S2));

 Label2.Caption := IntToStr(Length(S3));

end;

Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΊΡƒ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ число 9 (Π΄Π»ΠΈΠ½Π° исходной строки), Π²ΠΎ Π²Ρ‚ΠΎΡ€ΡƒΡŽ β€” 4. ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠΉ строки AnsiString Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ символ #0 Π² сСрСдинС строки β€” Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ…Π° (Π²Ρ‹Π·ΠΎΠ² UniqueString Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ строки, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ указатСля). А Π²ΠΎΡ‚ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ эту строку PChar, информация ΠΎ Π΅Π΅ истинной Π΄Π»ΠΈΠ½Π΅ тСряСтся, ΠΈ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ компилятор ориСнтируСтся Π½Π° символ #0, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ строка "обрубаСтся".

ΠŸΠΎΡ‚Π΅Ρ€Ρ куска строки послС символа #0 происходит всСгда, ΠΊΠΎΠ³Π΄Π° Π΅ΡΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ShortString ΠΈΠ»ΠΈ AnsiString Π² PChar, Π΄Π°ΠΆΠ΅ нСявноС. НапримСр, всС API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Π½ΡƒΠ»ΡŒ-Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ строками, Π° Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ β€” просто ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ Π½Π°Π΄ этими функциями, поэтому вывСсти с ΠΈΡ… ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π° экран строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ #0, Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Но Π³Π»Π°Π²Π½Ρ‹ΠΉ "ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹ΠΉ камСнь", связанный с символом #0 Π² сСрСдинС строки, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ†Π΅Π»Ρ‹ΠΉ ряд стандартных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками AnsiString Π½Π° самом Π΄Π΅Π»Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Delphi, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с PChar, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ "хвоста" послС #0. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ (листинг 3.33. ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ZeroFind Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС) ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

Листинг 3.33. НСкоррСктная Ρ€Π°Π±ΠΎΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ AnsiPos с символом #0

procedure TForm1.Button1Click(Sender: TObject);

begin

 Label1.Caption := IntToStr(AnsiPos('Z', 'A'#0'Z'));

end;

Π₯отя символ "Z" присутствуСт Π² строкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ производится поиск, Π½Π° экран Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ "0", Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ отсутствиС искомой подстроки. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ функция AnsiPos ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ StrPos ΠΈ CompareString, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками PChar, поэтому поиск Π·Π° символом #0, Π½Π΅ производится. Если Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ AnsiPos Π½Π° Pos, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ‚ΠΈΠΏΠΎΠΌ AnsiString Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π° экран Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "3".

ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΎΡ‡Π΅Π½ΡŒ остороТно ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΌΡƒ появлСнию символа #0 Π² сСрСдинС строк AnsiString β€” это ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ источником Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

3.3.7. Ѐункция, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ AnsiString

ΠžΡ‡Π΅Π½ΡŒ интСрСсный "ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹ΠΉ камСнь", связанный с Ρ‚ΠΈΠΏΠΎΠΌ AnsiString рассмотрСн Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ [4]. ΠŸΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ (листинг 3.34, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ StringResult Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС).

Листинг 3.34. НСоТиданноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°

function AddOne: string;

begin

 Result := Result + '1';

end;


procedure TForm1.Button1Click(Sender: TObject);

var

 S: string;

begin

 S := 'Test';

 S := AddOne;

 Label1.Caption := S;

end;

Если Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΠΎΠ³ΠΎ с этой ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ компилятора, ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ появится Π½Π° экранС Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния этого ΠΊΠΎΠ΄Π°, Π΅Π³ΠΎ рассуТдСния Π±ΡƒΠ΄ΡƒΡ‚ Π·Π²ΡƒΡ‡Π°Ρ‚ΡŒ, скорСС всСго, ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ: "Π’Π°ΠΊ ΠΊΠ°ΠΊ Result Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ AddOne β€” это локальная пСрСмСнная Ρ‚ΠΈΠΏΠ° string, Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΈ всС Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° пустым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ символа '1' ΠΊ пустой строкС даст Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ строку '1', которая ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½Π° Π½Π° экран. ΠšΡΡ‚Π°Ρ‚ΠΈ, Π½Π° строкС S := 'Test' компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, присвоСнноС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ S, Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ".

Однако эти рассуТдСния Π½Π΅Π²Π΅Ρ€Π½Ρ‹. На экранС появится надпись Test1, Ρ‚.Π΅. ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ S Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡ‡Ρ‚Π΅Π½ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ AddOne. Π­Ρ‚ΠΎ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° пСрСмСнная Result это Π½Π΅ локальная пСрСмСнная, Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€-пСрСмСнная, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ AddOne Π±Ρ‹Π»Π° объявлСна Ρ‚Π°ΠΊ:

procedure AddOne(var Result: string); 

ИмСнно Ρ‚Π°ΠΊ компилятор ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΈΠΏ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… AnsiString (ΠΈ ShortString, кстати, Ρ‚ΠΎΠΆΠ΅). Какая пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, β€” это зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹Π·Π²Π°Π½Π° функция, Ρ‚ΠΎΡ‡Π½Π΅Π΅, ΠΊΡƒΠ΄Π° ΠΈΠ΄Π΅Ρ‚ Π΅Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Иногда компилятору приходится нСявно ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π° ΠΈΠ½ΠΎΠ³Π΄Π° ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π’ нашСм случаС ΠΎΠ½ воспользовался ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ S, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π΅Ρ‘ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΏΠΎ понятным ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ пустой строкой, поэтому пСрСмСнная Result сохраняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ S, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ.

Из этого слСдуСт ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ: функция, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ строковоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Result, Ρ‚.ΠΊ. ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π»ΡŽΠ±Ρ‹ΠΌ.

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ компилятор обходится ΠΈ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ слоТными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ: Ссли функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ, Ρ‚ΠΎ Result становится Π½Π΅ локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π° нСявным ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠŸΡ€ΠΎΡΡ‚ΠΎ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ это Π½Π΅ Ρ‚Π°ΠΊ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΡ‚ Π½ΠΈΡ… Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ автоматичСской ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΠ»ΠΎΠ³Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Result Ρ‚Π°ΠΊ, Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½Π° содСрТит случайный мусор.

3.3.8. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π² записях

Поля Π² записях ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ любой строковый Ρ‚ΠΈΠΏ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ. Однако слСдуСт ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΠΎΠ»Π΅ΠΉ простых Ρ‚ΠΈΠΏΠΎΠ², значСния ΠΏΠΎΠ»Π΅ΠΉ Ρ‚ΠΈΠΏΠ° PChar ΠΈ AnsiString Π»Π΅ΠΆΠ°Ρ‚ Π²Π½Π΅ ΠΏΡ€Π΅Π΄Π΅Π»ΠΎΠ² структуры, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π² случаС AnsiString это Π½Π΅ Ρ‚Π°ΠΊ бросаСтся Π² Π³Π»Π°Π·Π°, Ρ‚.ΠΊ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ приходится. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ нСприятному ΡΡŽΡ€ΠΏΡ€ΠΈΠ·Ρƒ, Ссли Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со структурой ΠΊΠ°ΠΊ с Ρ†Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π±Π»ΠΎΠΊΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. Π§Π°Ρ‰Π΅ всСго ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° появляСтся ΠΏΡ€ΠΈ записи структуры Π² ΠΏΠΎΡ‚ΠΎΠΊ, Ρ„Π°ΠΉΠ» ΠΈ Ρ‚.ΠΏ. Π’ этом случаС записываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ указатСля, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ смысла для Ρ‚ΠΎΠ³ΠΎ, ΠΊΡ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΌ эти Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚, Ρ‚Π°ΠΊΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π»ΠΈΠ±ΠΎ Π² Π½ΠΈΠΊΡƒΠ΄Π°, Π»ΠΈΠ±ΠΎ Π½Π° Π΄Π°Π½Π½Ρ‹Π΅, Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ строкС Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅.

Для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π΅Ρ‘ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π°ΠΌ понадобятся Π΄Π²Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°: RecordRead ΠΈ RecordWrite (Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС ΠΎΠ½ΠΈ ΠΎΠ±Π° находятся Π² ΠΏΠ°ΠΏΠΊΠ΅ RecordReadWrite). ΠžΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ здСсь нСльзя β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, остаСтся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ, поэтому ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° маскируСтся. Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ RecordWrite Ρ‚Ρ€ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ сохранСния записи Π² ΠΏΠΎΡ‚ΠΎΠΊ TFileStream (Π² Ρ„Π°ΠΉΠ»Ρ‹ Method1.stm, Method2.stm ΠΈ Method3.stm соотвСтствСнно). Π’ Ρ‚Ρ€ΠΈ цСлочислСнных поля заносятся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ час, ΠΌΠΈΠ½ΡƒΡ‚Π°, сСкунда ΠΈ сотая доля сСкунды, строка β€” ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Π°Ρ, ввСдСнная ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π² ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π° Edit1. Π€Π°ΠΉΠ»Ρ‹ ΠΏΠΈΡˆΡƒΡ‚ΡΡ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ, ΠΈΠ·-Π·Π° этого ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ нСльзя Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ нСпосрСдствСнно с ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-диска. Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ RecordRead Ρ‚Ρ€ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Ρ€Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ чтСния (ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· своСго Ρ„Π°ΠΉΠ»Π°). Π‘Π½Π°Ρ‡Π°Π»Π° рассмотрим ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ β€” ΠΊΠ°ΠΊ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ случаС нСльзя.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ RecordWrite ΠΈΠΌΠ΅Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ (листинг 3.35).

Листинг 3.35. ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ записи структуры со строкой Π² Ρ„Π°ΠΉΠ» 

type

 TMethod1Record = packed record

  Hour: Word;

  Minute: Word;

  Second: Word;

  MSec: Word;

  Msg: string;

 end;


procedure TForm1.Button1Click(Sender: TObject);

var

 Rec: TMethod1Record;

 Stream: TFileStream;

begin

 DecodeTime(Now, Rec.Hour, Rec.Minute, Rec.Second, Rec.MSec);

 Rec.Msg := Edit1.Text;

 Stream := TFileStream.Create('Method1.stm', fmCreate);

 Stream.WriteBuffer(Rec, SizeOf(Rec));

 Stream.Free;

end;

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ RecordRead ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ (листинг 3.36).

Листинг 3.36. ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ чтСния структуры со строкой ΠΈΠ· Ρ„Π°ΠΉΠ»Π°

procedure TForm1.Button1Click(Sender: TObject);

var

 Rec: TMethod1Record;

 Stream: TFileStream;

begin

 Stream := TFileStream.Create('Method1.stm', fmOpenRead);

 Stream.ReadBuffer(Rec, SizeOf(Rec));

 Stream.Free;

 Label1.Caption :=

  TimeToStr(EncodeTime(Rec.Hour, Rec.Minute, Rec.Second, Rec.MSec));

 Label2.Caption := Rec.Msg; { * }