Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 513

/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
Проблема такая: есть флаг, который не хочет записываться в ini-файл. Выскакивает ошибка только на этом булевом флаге, а на остальных в том же методе все отрабатывает

(Подробнее в приложении к вопросу)

Не могу понять в чем дело. Может у Вас есть какие мысли на этот счет?

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. F_DrEquCheck: Boolean;
  2. Self.F_DrEquCheck = True
  3.  
  4.  
  5. {{code}}
  6. procedure TFlags.SaveFlags(IniFile: TExtendedIniFile; SectionName: string);
  7. begin
  8. try
  9. IniFile.WriteBool(SectionName, 'F_Process', Self.F_Process);
  10.  
  11. IniFile.WriteBool(SectionName, 'F_DrEquCheck', Self.F_DrEquCheck);
  12.  
  13. IniFile.UpdateFile();
  14. except
  15.  
  16. end;
  17. end;
  18. {{/code}}
  19.  
  20.  
  21. {{code}}
  22. IniFile.WriteBool(SectionName, 'F_DrEquCheck', Self.F_DrEquCheck);
  23. {{/code}}
  24.  


Aндрей Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Aндрей (статус: 1-ый класс)
Вопрос отправлен: 20 июля 2011, 10:17
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 31; последнее сообщение — 22 июля 2011, 23:17; участников в обсуждении: 3.

Страницы: [1] [2] [Следующая »]

Aндрей

Aндрей (статус: 1-ый класс), 20 июля 2011, 10:21 [#1]:

не нашел, где можно редактировать вопрос, а там что то с тегами напутал
в общем вот отформатированный код
min@y™

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ндрей

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ндрей

Aндрей (статус: 1-ый класс), 20 июля 2011, 10:47 [#5]:

имя слешами все время проходило и строку
IniFile.WriteBool(SectionName, 'F_Process', Self.F_Process);
пишет легко
Aндрей

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™

min@y™ (статус: Доктор наук), 20 июля 2011, 10:58 [#9]:

А почему конструктор у тебя overload, а не override?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 20 июля 2011, 11:00 [#10]:

И вообще, давай показывай код класса-наследника полностью. Чой-то ты там, видать, навертел.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Aндрей

Aндрей (статус: 1-ый класс), 20 июля 2011, 11:00 [#11]:

public F_DrEquCheck: Boolean;
на момент записи в ini файле нет поля с именем F_DrEquCheck и методов с таким именем нет
Aндрей

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™

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ндрей

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™

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ндрей

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ндрей

Aндрей (статус: 1-ый класс), 20 июля 2011, 11:32 [#17]:

все равно ошибка осталась(
Ладно, может что-нибудь еще придумаю
min@y™

min@y™ (статус: Доктор наук), 20 июля 2011, 11:37 [#18]:

Цитата (Aндрей):

все равно ошибка осталась

Попробуй поиграться с оригинальным TMemIniFile. Будет ошибка или нет? О результатах доложи.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

20 июля 2011, 11:42: Вопрос перемещён из тематического раздела Delphi » Оболочка Delphi, компилятор, версии среды и т.д. в раздел Delphi » Работа с файловой системой модератором Ерёмин А.А.

min@y™

min@y™ (статус: Доктор наук), 20 июля 2011, 11:43 [#19]:

Кстати, классу, может быть, требуется валидная ссылка на объект Encoding, а не nil.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Aндрей

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] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:32
Выполнено за 0.06 сек.