Форум: "Начинающим";
Текущий архив: 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.003 c