Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.05.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.005 c
2-1296587747
Тимоха111
2011-02-01 22:15
2011.05.08
копировать массив в другой массив


2-1295941539
Godod
2011-01-25 10:45
2011.05.08
Delphi и FilterGraph


1-1253636485
alexrayne
2009-09-22 20:21
2011.05.08
как вложить компонент в ячейку DrawGrid?


15-1295518833
UserNet
2011-01-20 13:20
2011.05.08
Объеденить сети


11-1232633546
Dy1
2009-01-22 17:12
2011.05.08
проблема с ConsoleApp





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский