|
Вопрос # 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ндрей)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|