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

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

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

 Stream.Free;

 Label1.Caption :=

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

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

end;

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ RecordRead объявлСна такая ΠΆΠ΅ запись TMethod1Record, описаниС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС для краткости ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ.

Π—Π°ΠΏΠΈΡΡŒ Π² Ρ„Π°ΠΉΠ» происходит Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Π½ΠΎ ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ Π² строкС, ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠΉ Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠΎΠΉ, скорСС всСго, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Access violation (Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ, Π½ΠΎ вмСсто сообщСния Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ мусор). ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρƒ этого ΠΌΡ‹ ΡƒΠΆΠ΅ обсудили Ρ€Π°Π½Π΅Π΅ β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Msg, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π² контСкстС процСсса RecordWrite, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла Π² процСссС RecordRead, Π° сама строка ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° Π½Π΅ Π±Ρ‹Π»Π°. Π‘Π΅Π· ошибок этим ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡƒΡΡ‚ΡƒΡŽ строку, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΅ΠΉ соотвСтствуСт ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ nil, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ смысл Π²ΠΎ всСх процСссах. Однако ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ строк, ΡƒΠΌΠ΅ΡŽΡ‰ΠΈΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ пустыС строки, ΠΈΠΌΠ΅Π΅Ρ‚ вСсьма ΡΠΎΠΌΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ†Π΅Π½Π½ΠΎΡΡ‚ΡŒ с практичСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния.

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

Π‘ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· этих нСдостатков ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ: Ссли Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π² записи ShortString статичСским массивом Ρ‚ΠΈΠΏΠ° Char, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ строки большСй, Ρ‡Π΅ΠΌ 255 символов, Π΄Π»ΠΈΠ½Ρ‹. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ дСмонстрируСт этот способ.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ RecordWrite этому соотвСтствуСт ΠΊΠΎΠ΄ (листинг 3.37).

Листинг 3.37. Π—Π°ΠΏΠΈΡΡŒ Π² Ρ„Π°ΠΉΠ» структуры с массивом символов

const

 MsgLen = 15;


type

 TMethod2Record = packed record

  Hour: Word;

  Minute: Word;

  Second: Word;

  MSec: Word;

  Msg: array[0..MsgLen - 1] of Char;

 end;


procedure TForm1.Button2Click(Sender: TObject);

var

 RСс: TMethod2Record;

 Stream: TFileStream;

begin

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

 StrPLCopy(Rec.Msg, Edit1.Text, MsgLen - 1);

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

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

 Stream.Free;

end;

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

Листинг 3.38. Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° структуры с массивом символов

procedure TForm1.Button2Click(Sender: TObject);

var

 RСс: TMethod2Record;

 Stream: TFileStream;

begin

 Stream := TFileStream.Create('Method2.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;

end;

ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° MsgLen Π·Π°Π΄Π°Ρ‘Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ (вмСстС с Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΌ Π½ΡƒΠ»Ρ‘ΠΌ) Π΄Π»ΠΈΠ½Ρƒ строки. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ½Π° взята достаточно малСнькой, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наглядно ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ ограничСния Π½Π° Π΄Π»ΠΈΠ½Ρƒ строки. ΠŸΠ΅Ρ€Π΅Π΄Π΅Π»ΠΊΠΈ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΊΠΎΠ΄ΠΎΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹: ΠΏΡ€ΠΈ записи для копирования значСния Edit1.Text вмСсто присваивания Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ StrPLCopy. Π’ ΠΊΠΎΠ΄Π΅ RecordRead ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ описания самой структуры) Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅Ρ‚ β€” это достигаСтся Π·Π° счёт Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ массив Char считаСтся компилятором совмСстимым с PChar, Π° выраТСния Ρ‚ΠΈΠΏΠ° PChar ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ присвоСны ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠ° AnsiString β€” ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ выполнится автоматичСски.

Однако ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ нСэффСктивного использования Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ пространства ΠΌΡ‹ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅ Ρ€Π΅ΡˆΠΈΠ»ΠΈ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Π½Π΅ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ максимальной Π΄Π»ΠΈΠ½Ρ‹: хотя ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π»ΠΈΠ½Ρƒ строки Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ, всё Ρ€Π°Π²Π½ΠΎ ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ извСстно Π½Π° этапС компиляции. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ вынСсти строку Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ записи ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Ρ‘ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, вмСстС с Π΄Π»ΠΈΠ½ΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ сначала Ρ‡ΠΈΡ‚Π°Π»Π°ΡΡŒ Π΄Π»ΠΈΠ½Π° строки, Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π΄Π΅Π»ΡΠ»Π°ΡΡŒ для Π½Π΅Ρ‘ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈ Π² эту ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ‡ΠΈΡ‚Π°Π»Π°ΡΡŒ строка. ИмСнно Ρ‚Π°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄. Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Record Write это Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ (листинг 3.39)

Листинг 3.39. Π—Π°ΠΏΠΈΡΡŒ Π² Ρ„Π°ΠΉΠ» строки ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ структуры

type

 TMethod3Record = packed record

  Hour: Word;

  Minute: Word;

  Second: Word;

  MSec: Word;

 end;


procedure TForm1.Butrton3Click(Sender: TObject);

var

 Rec: TMethod3Record;

 Stream: TFileStream;

 Msg: string;

 MsgLen: Integer;

begin

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

 Msg := Edit1.Text;

 MsgLen := Length(Msg);

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

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

 Stream.WriteBuffer(MsgLen, SizeOf(MsgLen);

 if MsgLen > 0 then Stream.WriteBuffer(Pointer(Msg)^, MsgLen);

 Stream.Free;

end; 

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

Листинг 3.40. Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° строки ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ структуры

procedure TForm1.Button3Click(Sender: TObject);

var

 Rec: TMethod3Record;

 Stream: TFileStream;

 Msg: string; MsgLen:

 Integer;

begin

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

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

 Stream.ReadBuffer(MsgLen, SizeOf(Integer));

 SetLength(Msg, MsgLen);

 if MsgLen > 0 then Stream.ReadBuffer(Pointer(Msg)^, MsgLen);

 Stream.Free;

 Label1.Caption :=

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

 Label2.Caption := Msg;

end;

НаконСц-Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Π΅Π·ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ строку, Π½Π΅ имСя ΠΏΡ€ΠΈ этом ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π΄Π»ΠΈΠ½Ρ‹ (ΠΊΡ€ΠΎΠΌΠ΅ ограничСния Π½Π° Π΄Π»ΠΈΠ½Ρƒ AnsiString) ΠΈ Π½Π΅ расходуя понапрасну ΠΏΠ°ΠΌΡΡ‚ΡŒ. ΠŸΡ€Π°Π²Π΄Π°, сам ΠΊΠΎΠ΄ получился слоТнСС. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΈΠ· записи ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ ΠΏΠΎΠ»Π΅ Ρ‚ΠΈΠΏΠ° string, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΏΠΎΡ‚ΠΎΠΊ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π² ΠΏΠΎΡ‚ΠΎΠΊ послС Π½Π΅Π΅ записываСтся Π΄Π»ΠΈΠ½Π° строки. Π’-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, записываСтся сама строка.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ReadBuffer ΠΈ WriteBuffer для чтСния/записи строки Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ коммСнтария. ΠœΠ΅Ρ‚ΠΎΠ΄ WriteBuffer ΠΏΠΈΡˆΠ΅Ρ‚ Π² ΠΏΠΎΡ‚ΠΎΠΊ Ρ‚Ρƒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Если Π±Ρ‹ ΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ саму ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Msg, Ρ‚ΠΎ записалась Π±Ρ‹ Ρ‚Π° Ρ‡Π°ΡΡ‚ΡŒ памяти, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ эта пСрСмСнная, Ρ‚.Π΅. сам ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. А Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Ρ‚Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, поэтому ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ слСдуСт Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ^. Но просто Π²Π·ΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ этот ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Msg нСльзя β€” с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния синтаксиса ΠΎΠ½Π° Π½Π΅ являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ приходится сначала ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΅Π΅ ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ (здСсь подошСл Π±Ρ‹ любой ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ). Π’ΠΎ ΠΆΠ΅ самоС относится ΠΈ ΠΊ ReadBuffer: Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΡƒΠΊΠ»Π°Π΄Ρ‹Π²Π°Π»ΠΈΡΡŒ Π½Π΅ Ρ‚ΡƒΠ΄Π°, Π³Π΄Π΅ хранится ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° строку, Π° Ρ‚ΡƒΠ΄Π°, Π³Π΄Π΅ хранится сама строка, приходится ΠΏΡ€ΠΈΠ±Π΅Π³Π½ΡƒΡ‚ΡŒ ΠΊ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ конструкции. И ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ строку, Π½ΡƒΠΆΠ½ΠΎ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ для Π½Π΅Π΅ ΠΏΠ°ΠΌΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SetLength.

ВмСсто привСдСния строки ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π΅Π³ΠΎ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ конструкции:

Stream.ReadBuffer(Msg[1], MsgLen);

ΠΈ

Stream.WriteBuffer(Msg[1], MsgLen);

Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈ Π΄Π°ΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ наглядно: Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΈ записи ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с Ρ‚ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ памяти, которая начинаСтся с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ символа строки, Ρ‚.Π΅. с Ρ‚ΠΎΠΉ, Π³Π΄Π΅ хранится сама строка. Но Ρ‚Π°ΠΊΠΎΠΉ способ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅Π½ ΠΈΠ·-Π·Π° нСявного Π²Ρ‹Π·ΠΎΠ²Π° UniqueString. Π’ нашСм случаС ΠΌΡ‹ ΠΈ Ρ‚Π°ΠΊ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Ρ‹ ΠΎΡ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π΄Ρ€ΡƒΠ³ΠΈΡ… строк (ΠΏΡ€ΠΈ записи строка Π½Π΅ мСняСтся, ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΎΠ½Π° ΠΈ Ρ‚Π°ΠΊ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Π° β€” это обСспСчиваСт SetLength), поэтому Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· этой Π² Π΄Π°Π½Π½ΠΎΠΌ случаС излишнСй ΠΎΠΏΠ΅ΠΊΠΈ со стороны компилятора.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Если ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ MsgLen Π½Π΅ нСзависимой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π° ΠΏΠΎΠ»Π΅ΠΌ записи, ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ReadBuffer ΠΈ WriteBuffer.

НСдостатком этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ Π½Π΅Π³ΠΎ запись. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это Π½Π΅ составило ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π½ΠΎ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… запись ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния ΠΈ сохранСния Π² ΠΏΠΎΡ‚ΠΎΠΊ, ΠΈ Ссли Π²Π·ΡΡ‚ΡŒ ΠΈ Π²Ρ‹ΠΊΠΈΠ½ΡƒΡ‚ΡŒ ΠΈΠ· Π½Π΅Π΅ строки, Ρ‚ΠΎ всС ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ участки ΠΊΠΎΠ΄Π° станут Π±ΠΎΠ»Π΅Π΅ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ приходится ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ запись Π½Π΅ ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅, Π° ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ полям.