|
Вопрос # 5 513/ вопрос решён / |
|
Доброго времени суток, уважаемые эксперты!
Проблема такая: есть флаг, который не хочет записываться в ini-файл. Выскакивает ошибка только на этом булевом флаге, а на остальных в том же методе все отрабатывает
(Подробнее в приложении к вопросу)
Не могу понять в чем дело. Может у Вас есть какие мысли на этот счет?
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- F_DrEquCheck: Boolean;
- Self.F_DrEquCheck = True
-
-
- {{code}}
- procedure TFlags.SaveFlags(IniFile: TExtendedIniFile; SectionName: string);
- begin
- try
- IniFile.WriteBool(SectionName, 'F_Process', Self.F_Process);
-
- IniFile.WriteBool(SectionName, 'F_DrEquCheck', Self.F_DrEquCheck);
-
- IniFile.UpdateFile();
- except
-
- end;
- end;
- {{/code}}
-
-
- {{code}}
- IniFile.WriteBool(SectionName, 'F_DrEquCheck', Self.F_DrEquCheck);
- {{/code}}
-
 |
Вопрос задал: Aндрей (статус: 1-ый класс)
Вопрос отправлен: 20 июля 2011, 10:17
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 31; последнее сообщение — 22 июля 2011, 23:17; участников в обсуждении: 3.
Страницы: [1] [2] [Следующая »]
|
Aндрей (статус: 1-ый класс), 20 июля 2011, 10:21 [#1]:
не нашел, где можно редактировать вопрос, а там что то с тегами напутал
в общем вот отформатированный код
|
|
min@y™ (статус: Доктор наук), 20 июля 2011, 10:27 [#2]:
Исключение EAccessViolation возникает при неверном обращении к памяти. Пройдись дебаггером внутрь метода WriteBool(), посмотри значения переменных.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 20 июля 2011, 10:39 [#3]:
Вопрос 1)
а если строки для записи поменять местами, ошибка будет в той же стороке?
procedure TFlags.SaveFlags(IniFile: TExtendedIniFile; SectionName: string);
begin
try
IniFile.WriteBool(SectionName, 'F_DrEquCheck', Self.F_DrEquCheck);
IniFile.WriteBool(SectionName, 'F_Process', Self.F_Process);
IniFile.UpdateFile();
except
ShowMessage('Ошибка сохранения результатов ');
end;
end;
Вопрос 2)
а что переопределено в классе TExtendedIniFile ? класс ведь может вызывать свои методы.
Вопрос 3)
а имя секции с слешами - это точно нормально? Если сделать отдельное тестовое приложение и перенести туда только класс TExtendedIniFile и попробовать воспроизвести запись, ошибка повторяется?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Aндрей (статус: 1-ый класс), 20 июля 2011, 10:46 [#4]:
по F7 не заходит, сразу кидает ошибку
1) если строки поменять местами вылетает на той же строке
2)
type TExtendedIniFile = class(TMemIniFile)
public
constructor Create(const FileName: string); overload;
function ReadFloat(const Section, Name: string; Default: Double): Double; override;
private
FDecimalSeparator: Char; //разделитель текущей операционной системы
FAnotherDecimalSeparator: Char; //разделитель другой операционной системы
end;
3)пробую...
|
|
Aндрей (статус: 1-ый класс), 20 июля 2011, 10:47 [#5]:
имя слешами все время проходило и строку
IniFile.WriteBool(SectionName, 'F_Process', Self.F_Process);
пишет легко
|
|
Aндрей (статус: 1-ый класс), 20 июля 2011, 10:51 [#6]:
Пробовал такие варианты
IniFile.WriteBool(SectionName, 'F_DrEquCheck', True); //без ошибок
и
procedure TFlags.SaveFlags(IniFile: TExtendedIniFile; SectionName: string);
var temp: Boolean;
begin
try
temp := Self.F_DrEquCheck; //без ошибок
IniFile.WriteBool(SectionName, 'F_DrEquCheck', temp); //с ошибкой
IniFile.WriteBool(SectionName, 'F_Process', Self.F_Process);
IniFile.UpdateFile();
except
ShowMessage('Ошибка сохранения результатов ');
end;
end;
и
procedure TFlags.SaveFlags(IniFile: TExtendedIniFile; SectionName: string);
begin
try
IniFile.WriteBool(SectionName, 'F_DrEquCheck', Self.F_Process); // без ошибок
IniFile.WriteBool(SectionName, 'F_Process', Self.F_Process);
IniFile.UpdateFile();
except
ShowMessage('Ошибка сохранения результатов ');
end;
end;
Чудеса какие-то!))
|
|
Вадим К (статус: Академик), 20 июля 2011, 10:52 [#7]:
и Self.F_Process - это обычное поле, булевское, без указателей и вызовов методов?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Вадим К (статус: Академик), 20 июля 2011, 10:54 [#8]:
а на момент записи в ini файле случайно нет уже поля с именем F_DrEquCheck ? но к примеру записанное другим регистром...
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 20 июля 2011, 10:58 [#9]:
А почему конструктор у тебя overload, а не override?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 20 июля 2011, 11:00 [#10]:
И вообще, давай показывай код класса-наследника полностью. Чой-то ты там, видать, навертел.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Aндрей (статус: 1-ый класс), 20 июля 2011, 11:00 [#11]:
public F_DrEquCheck: Boolean;
на момент записи в ini файле нет поля с именем F_DrEquCheck и методов с таким именем нет
|
|
Aндрей (статус: 1-ый класс), 20 июля 2011, 11:02 [#12]:
код класса наследника. Может чего и навертел.
unit Core.ExtendedIniFile;
/////////////////////////////////////
interface /// INTERFACE ///
///////////////////////////////////
uses
IniFiles;
type TExtendedIniFile = class(TMemIniFile)
public
constructor Create(const FileName: string); overload;
function ReadFloat(const Section, Name: string; Default: Double): Double; override;
private
FDecimalSeparator: Char; //разделитель текущей операционной системы
FAnotherDecimalSeparator: Char; //разделитель другой операционной системы
end;
///////////////////////////////////////////////
implementation /// IMPLEMENTATION ///
/////////////////////////////////////////////
uses
SysUtils,
Core.DataFormat,
StrUtils;
constructor TExtendedIniFile.Create(const FileName: string);
begin
Create(Filename, nil);
FDecimalSeparator := TDataFormat.getDecimalSeparator();
if ( FDecimalSeparator = '.' )
then FAnotherDecimalSeparator := ','
else FAnotherDecimalSeparator := '.';
end;
function TExtendedIniFile.ReadFloat(const Section, Name: string; Default: Double): Double;
var
FloatStr: string;
begin
FloatStr := ReadString(Section, Name, '');
Result := Default;
if FloatStr <> '' then
try
if ( Pos(FDecimalSeparator, FloatStr) = 0 )
then begin
FloatStr := AnsiReplaceText(FloatStr, FAnotherDecimalSeparator, FDecimalSeparator);
end;
Result := StrToFloat(FloatStr);
except
on EConvertError do
// Ignore EConvertError exceptions
else
raise;
end;
end;
///////////////////////////
end. /// END. ///
/////////////////////////
|
|
min@y™ (статус: Доктор наук), 20 июля 2011, 11:11 [#13]:
А какая версия delphi?
constructor TExtendedIniFile.Create(const FileName: string);
begin
Create(Filename, nil); // <--- что за 2-й параметр?
//В delphi 7, например, его нету.
FDecimalSeparator := TDataFormat.getDecimalSeparator();
// TDataFormat - что за класс такой?
if ( FDecimalSeparator = '.' )
then FAnotherDecimalSeparator := ','
else FAnotherDecimalSeparator := '.';
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Aндрей (статус: 1-ый класс), 20 июля 2011, 11:15 [#14]:
Delphi XE
Create(Filename, nil); //списано с
constructor TMemIniFile.Create(const FileName: string);
begin
Create(Filename, nil);
end;
TDataFormat.getDecimalSeparator(); мой класс
class function TDataFormat.getDecimalSeparator: Char;
var FormatSettings : TFormatSettings;
begin
// Обеспечение региональной записи настройки параметров формата
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, formatSettings);
Result := formatSettings.DecimalSeparator; //'.' или ','
end;
|
|
min@y™ (статус: Доктор наук), 20 июля 2011, 11:20 [#15]:
Цитата (Aндрей):
Delphi XE Create(Filename, nil); //списано с
У меня нету XE, но всё же попробуй как-то так:
type TExtendedIniFile = class(TMemIniFile)
public
constructor Create(const FileName: string); reintroduce; // <--- !
function ReadFloat(const Section, Name: string; Default: Double): Double; override;
private
FDecimalSeparator: Char; //разделитель текущей операционной системы
FAnotherDecimalSeparator: Char; //разделитель другой операционной системы
end;
//..........
constructor TExtendedIniFile.Create(const FileName: string);
begin
inherited Create(Filename, nil); // <---
FDecimalSeparator := TDataFormat.getDecimalSeparator();
if ( FDecimalSeparator = '.' )
then FAnotherDecimalSeparator := ','
else FAnotherDecimalSeparator := '.';
end;
И всё-таки, что за 2-й параметр в конструкторе? Ответь, мне интересно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Aндрей (статус: 1-ый класс), 20 июля 2011, 11:28 [#16]:
второй параметр Encoding: TEncoding
constructor TMemIniFile.Create(const FileName: string; Encoding: TEncoding);
begin
inherited Create(FileName);
FEncoding := Encoding;
FSections := THashedStringList.Create;
{$IFDEF LINUX}
FSections.CaseSensitive := True;
{$ENDIF}
LoadValues;
end;
|
|
Aндрей (статус: 1-ый класс), 20 июля 2011, 11:32 [#17]:
все равно ошибка осталась(
Ладно, может что-нибудь еще придумаю
|
|
min@y™ (статус: Доктор наук), 20 июля 2011, 11:37 [#18]:
Цитата (Aндрей):
все равно ошибка осталась
Попробуй поиграться с оригинальным TMemIniFile. Будет ошибка или нет? О результатах доложи.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
20 июля 2011, 11:42: Вопрос перемещён из тематического раздела Delphi » Оболочка Delphi, компилятор, версии среды и т.д. в раздел Delphi » Работа с файловой системой модератором Ерёмин А.А.
|
min@y™ (статус: Доктор наук), 20 июля 2011, 11:43 [#19]:
Кстати, классу, может быть, требуется валидная ссылка на объект Encoding, а не nil.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Aндрей (статус: 1-ый класс), 20 июля 2011, 11:48 [#20]:
результат c TMemIniFile отрицательный
IniFile := TMemIniFile.Create(FileName);
try
Self.FFlags.SaveTurbineFlags(IniFile, SectionName);
finally
FreeAndNil(IniFile);
end;
та же ошибка
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|