Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.05.08;
Скачать: CL | DM;

Вниз

непонятная ошибка   Найти похожие ветки 

 
zlodey   (2011-02-03 15:37) [0]

В ini-файл, при определенных обстоятельствах попадают строки длиной > 2048 байт. При чтении часть строки обрезается (2048 байт - ограничение TIniFile.ReadString). Написал заплатку: строки разбиваются по 65534 байта, убрал ограничение в 2048 байт. Вот код:


procedure del_keys_from_ini(AIni: TIniFile; const AScn, AIdent: string);
var
 I: Integer;
 Keys: TStrings;
 S: string;
begin
 Keys := TStringList.Create;
 try
   AIni.ReadSection(AScn, Keys);
   for I := 0 to Keys.Count - 1 do
   begin
     S := Keys[I];
     if Pos(AIdent, S) > 0 then
       AIni.DeleteKey(AScn, S);

   end;
 finally
   Keys.Free;

 end;

end;

function read_long_str_from_ini(AIni: TIniFile; const AScn, AIdent,
 ADef: string): string;

  function do_read_long_str_from_ini(const AIdent: string): string;
  var
    Buf: array[0..High(Word) - 1] of Char;
  begin
    SetString(Result, Buf, GetPrivateProfileString(PChar(AScn),
      PChar(AIdent), PChar(ADef), Buf, SizeOf(Buf), PChar(AIni.FileName)));

  end;

var
 I: Integer;
 Keys: TStrings;
 S: string;
begin
 Result := "";// <- если не установить пустую строку возникает ошибка
 Keys := TStringList.Create;
 try
   AIni.ReadSection(AScn, Keys);
   for I := 0 to Keys.Count - 1 do
   begin
     S := Keys[I];
     if Pos(AIdent, S) > 0 then
       Result := Result +
         read_long_str_from_ini(AIni, AScn, S, ADef);
         
   end;
 finally
   Keys.Free;
 end;
end;

procedure write_long_str_to_ini(AIni: TIniFile; const AScn, AIdent,
 AVal: string);
var
 L, I: Integer;
begin
 del_keys_from_ini(AIni, AScn, AIdent);
 L := Length(AVal);
 for I := 0 to L div 65534 do
   AIni.WriteString(AScn, AIdent + IntToStr(I),
     Copy(AVal, I * 65534 + 1, 65534));

end;


В большинстве случает все работает нормально, но к примеру:


procedure TLinkers.Load;
var
 I, N: Integer;
 L: TLinker_UserCustom;
 Stream: TStream;  
 S: string;  
begin
 try
   S := read_long_str_from_ini(FIniFile, const_ImportSection,
     const_ImportIdent, "");
   if S = "" then
     Exit;
   { что-то делаю }
   try
       S := read_long_str_from_ini(FIniFile, const_ImportSection,
         const_ImportCurrentIdent, "");
       if S = "" then
         Exit;
       { что-то делаю }
end;


первый раз в переменную S функция возвращает содержимое одной строки из ini-файла,
второй раз, если второй строки пусто функция должна вернуть как-бы пустую строку, но почему-то в итоге в переменной S остается значение из предыдущего вызова. Исправляется если вручную скидывать в начале функции read_long_str_from_ini Result := "";

Почему при повторном вызове не сбрасывается значение переменно S в пусто?


 
Anatoly Podgoretsky ©   (2011-02-03 15:49) [1]

> zlodey  (03.02.2011 15:37:00)  [0]

Наш русский програмист, на что только не пойдет лишь бы не работать!


 
Ega23 ©   (2011-02-03 16:02) [2]


> Почему при повторном вызове не сбрасывается значение переменно
> S в пусто?


Буратино дали 3 яблока. 2 яблока он съел. Сколько яблок осталось у Буратино?


 
Anatoly Podgoretsky ©   (2011-02-03 16:03) [3]

> Ega23  (03.02.2011 16:02:02)  [2]

0


 
Ega23 ©   (2011-02-03 16:07) [4]


> Anatoly Podgoretsky ©   (03.02.11 16:03) [3]

Тогда уж NULL :)


 
RWolf ©   (2011-02-03 16:14) [5]


> zlodey   (03.02.11 15:37) 

Синтаксис
function а(AIn:Integer): string;
в дельфи эквивалентен синтаксису
procedure а(AIn:Integer; out AOut: string);
так что в теле функции надо-таки очищать Result.


 
Ega23 ©   (2011-02-03 16:28) [6]


> так что в теле функции надо-таки очищать Result.

Result всегда надо очищать. Точнее, он должен быть строго определён. Хинты рулят.


 
Anatoly Podgoretsky ©   (2011-02-03 16:37) [7]

> Ega23  (03.02.2011 16:07:04)  [4]

Все таки нуль 3 - 2 и минут Мальвина, равно 0, да и целые не могут принимать
значение НУЛЛ


 
Ega23 ©   (2011-02-03 16:40) [8]


> да и целые не могут принимать значение НУЛЛ


Почему целые? OleVariant :)


 
han_malign   (2011-02-03 17:36) [9]


> procedure а(AIn:Integer; out AOut: string);
> так что в теле функции надо-таки очищать Result.

- var - в случае out должна магия работать(во всяком случае для интерфейсов, для строки - проверять лень)...


 
Anatoly Podgoretsky ©   (2011-02-03 19:41) [10]


> Почему целые? OleVariant :)

Мальвину на OleVariant?


 
Leonid Troyanovsky ©   (2011-02-03 21:46) [11]


> Anatoly Podgoretsky ©   (03.02.11 19:41) [10]

> Мальвину на OleVariant?

После Буратины мало кто уцелеет,
бо он тычет носом во всякие очаги.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2011-02-03 22:43) [12]

Одноглазая Мальвина :-)


 
RWolf ©   (2011-02-04 09:31) [13]


> han_malign   (03.02.11 17:36) [9]

в D7 никаких различий между var и out не заметил.
даже хинтов при компиляции не выдаётся, если в процедуре не присвоено значение out-параметру.



Страницы: 1 вся ветка

Текущий архив: 2011.05.08;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
15-1295853671
usrg
2011-01-24 10:21
2011.05.08
Вопрос о приобретении EhLib


2-1296648381
NieL
2011-02-02 15:06
2011.05.08
Сформировать список


2-1296654248
RWolf
2011-02-02 16:44
2011.05.08
transformNodeToObject и кодировка XML


15-1293694941
Kerk
2010-12-30 10:42
2011.05.08
С новым годом!


15-1295617274
Knight
2011-01-21 16:41
2011.05.08
План счетов применительно к ИТ