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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 5 532

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

Приветствую, уважаемые эксперты!
что-то не даются мне ini-файлы((

В приведенном ниже фрагменте кода ошибка вылетает
на строке создания объекта о_О

  IniFile := TMemIniFile.Create( file_name );


причем file_name = 'E:\.proj.St\_bin\Nov\Tus\3\Description.ini'

как я понимаю сообщение говорит, что происходит ошибка чтения из памяти, которая пуста
(Кстати, стразу после этой ошибки выдается исключение ошибки записи)

Понимаю, что где-то накосячил, но Не понимаю, где рыть

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

Приложение:
  1. constructor TDataFiles.Create(file_name: string);
  2. var IniFile :TMemIniFile;
  3. begin
  4.  
  5. IniFile := TMemIniFile.Create( file_name );
  6. try
  7.  
  8. Self.FDescriptionFile := file_name;
  9. Self.FFolderPath := ExtractFilePath(Application.ExeName) + IniFile.ReadString ('Files', 'FolderPath', '');
  10. Self.FConstantsFile := FolderPath + IniFile.ReadString ('Files', 'ConstantsFile' , '');
  11.  
  12. finally
  13. IniFile.Free;
  14. IniFile := nil;
  15. end;
  16. end;
  17.  


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

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


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

Всего сообщений: 20; последнее сообщение — 8 августа 2011, 15:56; участников в обсуждении: 4.
Вадим К

Вадим К (статус: Академик), 28 июля 2011, 12:10 [#1]:

А файл доступен по чтению/записи?
Галочка "подтверждения прочтения" - вселенское зло.
Aндрей

Aндрей (статус: 1-ый класс), 28 июля 2011, 12:13 [#2]:

да, вроде бы:
во всяком случае в атрибутах файла ни "скрытый", ни "только для чтения" галками не обозначен
Aндрей

Aндрей (статус: 1-ый класс), 28 июля 2011, 12:24 [#3]:

Еще информация:
я создаю и удаляю последовательно объект, который использует этот ini-файл,
т.е. создал, модифицировал, использовал, удалил, и так раз 20

может, из-за этого создания, удаления что-то могло произойти?
min@y™

min@y™ (статус: Доктор наук), 28 июля 2011, 13:06 [#4]:

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

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

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

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

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

да не от чего, просто класс, который содержит строковые пути к файлам и все

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

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™

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

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

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

за конструктор в конструкторе простите дуру грешную!
но все равно не работает
min@y™

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

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

но все равно не работает

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

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

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

con := TDataBaseConnection.getConnect(); //статический метод
это класс-сингелтон , он безвреден, сейчас просто там стоит заглушка и он возращает nil

class function TDataBaseConnection.getConnect: TDataBaseConnection;
begin
//пока не используются базы решено выключить соединение
Result := nil; //Self.FInstance;
end;
min@y™

min@y™ (статус: Доктор наук), 28 июля 2011, 15:31 [#14]:

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

Gooddy (статус: 3-ий класс), 28 июля 2011, 15:33 [#15]:

ООП в действии!
Чисти код! Чисти код! Чисти код!
Aндрей

Aндрей (статус: 1-ый класс), 28 июля 2011, 15:37 [#16]:

вот именно, что исключение вылетает на строке
    IniFile := TMemIniFile.Create( file_name );
почему именно на ней, сам не могу понять, и внутрь метода зайти не могу
Gooddy

Gooddy (статус: 3-ий класс), 28 июля 2011, 15:42 [#17]:

А строку убрать нельзя? Ну и остальные под IniFile закомментить?
Чисти код! Чисти код! Чисти код!
min@y™

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

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

почему именно на ней, сам не могу понять

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

Gooddy (статус: 3-ий класс), 28 июля 2011, 15:49 [#19]:

Может стоит закомментить места в которых используется TMemIniFile и посмотреть где на самом деле ошибка?
Чисти код! Чисти код! Чисти код!
Aндрей

Aндрей (статус: 1-ый класс), 8 августа 2011, 15:56 [#20]:

В общем, проблема оказалась в другом:
криво написанное приведение типов для классов-потомков, которые использовали ini-файл, приводило к этой ошибке
хотя по сути ошибка возникала задолго до использования ini-файла
Сумбурно и криво объяснил, но как-то так (лучше пока не могу)
В общем, буду стараться писать чистый код)
Спасибо за потраченное на меня время

8 августа 2011, 15:56: Статус вопроса изменён на решённый (изменил автор вопроса — Aндрей)

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

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