| 
| 
 | Вопрос # 5 532/ вопрос решён / | 
 |  Приветствую, уважаемые эксперты!что-то не даются мне ini-файлы((
 
 В приведенном ниже фрагменте кода ошибка вылетает
 на строке создания объекта о_О
 
   IniFile := TMemIniFile.Create( file_name ); 
 причем file_name = 'E:\.proj.St\_bin\Nov\Tus\3\Description.ini'
 
 как я понимаю сообщение говорит, что происходит ошибка чтения из памяти, которая пуста
 (Кстати, стразу после этой ошибки выдается исключение ошибки записи)
 
 Понимаю, что где-то накосячил, но Не понимаю, где рыть
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) Приложение:Переключить в обычный режим constructor TDataFiles.Create(file_name: string);var IniFile :TMemIniFile;begin     IniFile := TMemIniFile.Create( file_name );    try         Self.FDescriptionFile     := file_name;        Self.FFolderPath    := ExtractFilePath(Application.ExeName) + IniFile.ReadString ('Files',
'FolderPath', '');        Self.FConstantsFile := FolderPath + IniFile.ReadString ('Files', 'ConstantsFile'     , '');     finally        IniFile.Free;        IniFile := nil;    end;end; 
|  |   Вопрос задал: Aндрей (статус: 1-ый класс)Вопрос отправлен: 28 июля 2011, 12:06
 Состояние вопроса: решён, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 20; последнее сообщение — 8 августа 2011, 15:56; участников в обсуждении: 4. 
|   | Вадим К (статус: Академик), 28 июля 2011, 12:10 [#1]:А файл доступен по чтению/записи? Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Aндрей (статус: 1-ый класс), 28 июля 2011, 12:13 [#2]:да, вроде бы: во всяком случае в атрибутах файла ни "скрытый", ни "только для чтения" галками не обозначен
 |  
|   | Aндрей (статус: 1-ый класс), 28 июля 2011, 12:24 [#3]:Еще информация: я создаю и удаляю последовательно объект, который использует этот ini-файл,
 т.е. создал, модифицировал, использовал, удалил, и так раз 20
 
 может, из-за этого создания, удаления что-то могло произойти?
 |  
|   | min@y™ (статус: Доктор наук), 28 июля 2011, 13:06 [#4]:А от чего пронаследован TDataFiles? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Aндрей (статус: 1-ый класс), 28 июля 2011, 13:09 [#5]:да не от чего, просто класс, который содержит строковые пути к файлам и все |  
|   | min@y™ (статус: Доктор наук), 28 июля 2011, 13:20 [#6]: Цитата (Aндрей): да не от чего, просто класс, который содержит строковые пути к файлам и все  Ну, раз не от чего, значит, я так понимаю, от TObject.
 Показывай, как и где ты вызываешь конструктор. И на какой строке вылетает access violation.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Aндрей (статус: 1-ый класс), 28 июля 2011, 13:32 [#7]:тут вызываю 
     DataFiles := TDataFiles.Create(Self.FDataFile.DescriptionFile, tbl_equipment_turbine);потом он идет сюда 
 constructor TDataFiles.Create(file_name : string; table_name : string);
begin
    Self.FReportCollection := table_name;
    Self.Create( file_name );
end;а потом сюда
 constructor TDataFiles.Create(file_name: string);
var IniFile :TMemIniFile;
var con : TDataBaseConnection;
begin
    con := TDataBaseConnection.getConnect();
    Assert( FileExists(file_name), 'Ошибка! Файла не существует!' );
    IniFile := TMemIniFile.Create( file_name );
    try
        /// загружаем данные ///
        Self.FDescriptionFile     := file_name;
        Self.FFolderPath    := ExtractFilePath(Application.ExeName) + IniFile.ReadString ('Files', 'FolderPath', '');
        Self.FConstantsFile := FolderPath + IniFile.ReadString ('Files', 'ConstantsFile'     , '');
        if ( con = nil )
        then  Self.FReportCollection := FolderPath + IniFile.ReadString ('Files', 'ReportCollection'  , '');
        Self.FGeneralFolderPath := ExtractFilePath(Application.ExeName) + IniFile.ReadString ('GeneralFiles',
'FolderPath', '');
    finally
        IniFile.Free;
        IniFile := nil;
    end;
end;а вот весь код класса (на всякий случай)
 unit Core.Data.Files;
/////////////////////////////////////
   interface   ///   INTERFACE   ///
///////////////////////////////////
uses
    Core.Files;
type
    TDataFiles = class //(TFiles)
        public constructor Create();                    overload; virtual;
        public constructor Create(file_name : string);  overload; virtual; //override;
        public constructor Create(file_name : string; table_name : string);  overload; virtual; //override;
 
        protected FDescriptionFile : string;
        published property DescriptionFile  : string read FDescriptionFile;
 
        protected FFolderPath : string;
        published property FolderPath  : string read FFolderPath;
 
        protected          FReportCollection: string;
        published property  ReportCollection: string read FReportCollection write FReportCollection;
 
        protected          FConstantsFile: string;
        published property  ConstantsFile: string read FConstantsFile write FConstantsFile;
 
        protected FGeneralFolderPath: string;
 
    end;
///////////////////////////////////////////////
   implementation   ///   IMPLEMENTATION   ///
/////////////////////////////////////////////
uses
    DataBase.Connection,
    IniFiles,
    SysUtils,
    Forms;
 
constructor TDataFiles.Create();
begin
    Self.FDescriptionFile := '';
    Self.FFolderPath      := '';
    Self.FReportCollection:= '';
    Self.FConstantsFile   := '';
end;
 
constructor TDataFiles.Create(file_name: string);
var IniFile :TMemIniFile;
var con : TDataBaseConnection;
begin
    con := TDataBaseConnection.getConnect();
    Assert( FileExists(file_name), 'Ошибка! Файла не существует!' );
    IniFile := TMemIniFile.Create( file_name );
    try
        /// загружаем данные ///
        Self.FDescriptionFile     := file_name;
        Self.FFolderPath    := ExtractFilePath(Application.ExeName) + IniFile.ReadString ('Files', 'FolderPath', '');
        Self.FConstantsFile := FolderPath + IniFile.ReadString ('Files', 'ConstantsFile'     , '');
        if ( con = nil )
        then  Self.FReportCollection := FolderPath + IniFile.ReadString ('Files', 'ReportCollection'  , '');
        Self.FGeneralFolderPath := ExtractFilePath(Application.ExeName) + IniFile.ReadString ('GeneralFiles',
'FolderPath', '');
    finally
        IniFile.Free;
        IniFile := nil;
    end;
end;
 
constructor TDataFiles.Create(file_name : string; table_name : string);
begin
    Self.FReportCollection := table_name;
    Self.Create( file_name );
end;
 
end.   ///   END.      ///
///////////////////////// |  
|   | Вадим К (статус: Академик), 28 июля 2011, 13:51 [#8]:  Self.Create( file_name );ох, не нравится мне вызов конструктора из конструктора. конструктор - это не совсем обычная процедура и последствия такого вызова могут быть не очень хорошими. Лучше создать отдельную процедуру инициализации и вызывать ее с обеих конструкторов, что бы не дублировать код.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 28 июля 2011, 13:53 [#9]:Два раза вызывать конструктор - это нечто. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Aндрей (статус: 1-ый класс), 28 июля 2011, 14:08 [#10]:за конструктор в конструкторе простите дуру грешную! но все равно не работает
 |  
|   | min@y™ (статус: Доктор наук), 28 июля 2011, 14:20 [#11]: Цитата (Aндрей): но все равно не работает  А какие были произведены изменения?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 28 июля 2011, 14:33 [#12]:Подравнял я код немного и появился один вопросик: 
 unit Core.Data.Files;
 
interface
 
uses
  Core.Files, DataBase.Connection, IniFiles, SysUtils, Forms;
 
type
  TDataFiles = class //(TFiles)
    private
      FDescriptionFile : string;
      FFolderPath : string;
      FReportCollection: string;
      FConstantsFile: string;
      FGeneralFolderPath: string;
    public
      constructor Create(file_name: string; table_name: string);
      property DescriptionFile: string read FDescriptionFile;
      property FolderPath: string read FFolderPath;
      property ReportCollection: string read FReportCollection write FReportCollection;
      property ConstantsFile: string read FConstantsFile write FConstantsFile;
  end;
 
implementation
 
uses
 
constructor TDataFiles.Create(file_name: string; table_name: string);
var
  IniFile: TMemIniFile;
  con: TDataBaseConnection;
begin
  FReportCollection := table_name;
  con := TDataBaseConnection.getConnect(); // <---- getConnect() - это классовый метод или конструктор?
                                           // думаю, что ошибка вываливается именно здесь.
  Assert(FileExists(file_name), 'Ошибка! Файла не существует!');
  IniFile := TMemIniFile.Create(file_name);
  try
    Self.FDescriptionFile:= file_name;
    Self.FFolderPath     := ExtractFilePath(Application.ExeName) +
                            IniFile.ReadString('Files', 'FolderPath', '');
    Self.FConstantsFile  := FolderPath +
                            IniFile.ReadString ('Files', 'ConstantsFile', '');
    if Assigned(con)
      then Self.FReportCollection := FolderPath +
                                     IniFile.ReadString ('Files', 'ReportCollection'  , '');
 
    Self.FGeneralFolderPath := ExtractFilePath(Application.ExeName) +
                               IniFile.ReadString ('GeneralFiles', 'FolderPath', '');
  finally
    IniFile.Free();
  end;
end;
 
end.Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Aндрей (статус: 1-ый класс), 28 июля 2011, 15:21 [#13]:con := TDataBaseConnection.getConnect(); //статический метод это класс-сингелтон , он безвреден, сейчас просто там стоит заглушка и он возращает nil
 
 class function TDataBaseConnection.getConnect: TDataBaseConnection;
 begin
 //пока не используются базы решено выключить соединение
 Result := nil;   //Self.FInstance;
 end;
 |  
|   | min@y™ (статус: Доктор наук), 28 июля 2011, 15:31 [#14]:Ну а где тогда вылетает исключение-то? На какой строке? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Gooddy (статус: 3-ий класс), 28 июля 2011, 15:33 [#15]:ООП в действии! Чисти код! Чисти код! Чисти код! |  
|   | Aндрей (статус: 1-ый класс), 28 июля 2011, 15:37 [#16]:вот именно, что исключение вылетает на строке 
     IniFile := TMemIniFile.Create( file_name );почему именно на ней, сам не могу понять, и внутрь метода зайти не могу |  
|   | Gooddy (статус: 3-ий класс), 28 июля 2011, 15:42 [#17]:А строку убрать нельзя? Ну и остальные под IniFile закомментить? Чисти код! Чисти код! Чисти код! |  
|   | min@y™ (статус: Доктор наук), 28 июля 2011, 15:45 [#18]: Цитата (Aндрей): почему именно на ней, сам не могу понять Я чо-то тоже не пойму. Много раз юзал TMemIniFile и никогда такой ботвы не было. Может, стоит от него отказаться и использовать что-то другое?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Gooddy (статус: 3-ий класс), 28 июля 2011, 15:49 [#19]:Может стоит закомментить места в которых используется TMemIniFile и посмотреть где на самом деле ошибка? Чисти код! Чисти код! Чисти код! |  
|   | Aндрей (статус: 1-ый класс), 8 августа 2011, 15:56 [#20]:В общем, проблема оказалась в другом: криво написанное приведение типов для классов-потомков, которые использовали ini-файл, приводило к этой ошибке
 хотя по сути ошибка возникала задолго до использования ini-файла
 Сумбурно и криво объяснил, но как-то так (лучше пока не могу)
 В общем, буду стараться писать чистый код)
 Спасибо за потраченное на меня время
 |  8 августа 2011, 15:56: Статус вопроса изменён на решённый (изменил автор вопроса — Aндрей) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |