// ...
type
// Объявляем тип (Delphi "не любит" работать с <array of string> как параметр внутри процедуры )
TStringArray = array of AnsiString;
TOptArrayCommand = (opSaveToFile, opLoadFromFile); // Опции управления функцией
// ...
function ArrayOperation2(const FileName: AnsiString; var strArray: TStringArray;
Opt: TOptArrayCommand): Integer;
const
RES_ID: PAnsiChar = 'MYSTRARRAY';
var
ms: TMemoryStream;
i, len,n: Integer;
s: AnsiString;
begin
Result := 0;
n := StrLen(RES_ID);
case Opt of
opSaveToFile:
begin // Запись в файл
len := Length(strArray);
if (len < 1) then
Exit;
ms := TMemoryStream.Create;
ms.Seek(0, soFromBeginning);
// записали имя ресурса
// чтобы потом (при чтении) быть уверенным что это наш массив
ms.WriteBuffer(RES_ID^, n { SizeOf(RES_ID)});
// записали общую длину массива
ms.WriteBuffer(len, SizeOf(Integer));
Result := len;
for i := Low(strArray) to High(strArray) do
begin
len := Length(strArray[i]);
// записали длину i-той строчки
ms.WriteBuffer(len, SizeOf(Integer));
// записали i-тую строчку
if (len > 0) then
ms.WriteBuffer(PAnsiChar(strArray[i])^, len);
end;
ms.Seek(0, soFromBeginning);
try
ms.SaveToFile(FileName);
except
Result := 0; // а вдруг не удалось записать файл?
end;
ms.Free;
end;
opLoadFromFile:
begin // Чтение из файла
// обнулили массив
SetLength(strArray, 0);
if not FileExists(FileName) then
Exit;
ms := TMemoryStream.Create;
ms.LoadFromFile(FileName);
ms.Seek(0, soFromBeginning);
// прочитали имя ресурса
SetLength(s, n);
ms.ReadBuffer(s[1], n);
// Убедились что это именно то что мы хотим
// прочитать в массив строк
if (s <> RES_ID) then
begin
ms.Free;
Exit;
end;
// прочитали общую длину массива
ms.ReadBuffer(len, SizeOf(Integer));
// выставили длину массива
SetLength(strArray, len);
for i := Low(strArray) to High(strArray) do
begin
// прочитали длину i-той строчки
ms.ReadBuffer(len, SizeOf(Integer));
if (len > 0) then
begin
// выставили длину i-того элемента массива
SetLength(strArray[i], len);
// прочитали i-тую строчку
ms.ReadBuffer(strArray[i][1], len);
end
else
strArray[i] := '';
end;
Result := Length(strArray);
ms.Free;
end;
end;
end;