Здравствуйте. Возникла проблема доступа.
Вот суть проблемы:
Есть 2 формы: обычная - frm (модуль Main) и модальная - frm_fp (модуль FlightPoints).
В форме
frm_fp можно редактировать текстовый файл. Ее основная задача - пропарсить тектовый файл, в котором есть двумерный массив. Пример:
Цитата:
line1_field1|line1_field2|line1_field3
line2_field1|line2_field2|line2_field3
...
lineN_field1|lineN_field2|lineN_field3
|
Далее, эти значения присваются в массив FLIGHTS типа TFlights
Код:
type TFlights = record
index: Integer;
title, distance, code: String;
end;
Массив объявлен в
var глобально, до
implementation
Когда я в модальной форме заканчиваю редактировать, переменная
FLIGHTS полностью корректна, содержит нужные значения. Процедура
ParseFlightsFile, которая отвечает за заполнение
FLIGHTS находится в форме frm_fp (модуль FlightPoints):
Код:
for I := 0 to Length(Main.FLIGHTS)-1 do
begin
stl_FlightData := TStringList.Create;
stl_FlightData.Text := StringReplace(stl_FlightsFile[i], '|', #13#10, [rfReplaceAll]);
if stl_FlightData.Count = 4 then
begin
Main.FLIGHTS[i].index := StrToInt(stl_FlightData[0]);
Main.FLIGHTS[i].title := stl_FlightData[1];
Main.FLIGHTS[i].distance := stl_FlightData[2];
Main.FLIGHTS[i].code := stl_FlightData[3];
imDone := true;
end else
begin
ShowMessage('Неверные данные файла. Действие прервано');
end;
stl_FlightData.Free;
if imDone then
begin
imDone := false;
continue;
end else Application.Terminate;
end;
Код
Код:
memo_flightsLog.Lines.Add( 'FLIGHTS[3]: ' + Main.FLIGHTS[3].title );
даёт лог
Данные о парсируемом файле сохранены в ini-файле и я их получаю при загрузке программы. Поэтому, заполнить массив FLIGHTS мне необходимо во время запуска программы. Поэтому в frm.onCreate я прописываю строку:
Но при запуске программы, получаю ошибку Access Violation:
Где я ошибся? В какую сторону рыть?
Привожу код ParseFlightsFile:
Код:
procedure Tfrm_flightPoints.ParseFlightsFile;
var
stl_FlightsFile, stl_FlightData: Tstringlist;
I: Integer;
imDone: Boolean;
begin
if FileExists(Main.FLIGHTS_FILE) then
begin
Main.PARSE_FLIGHTS := '';
SetLength(Main.FLIGHTS, 0);
imDone := false;
stl_FlightsFile := TStringList.Create;
stl_FlightsFile.LoadFromFile(Main.FLIGHTS_FILE, TEncoding.UTF8);
memo_flightsLog.Text := stl_FlightsFile.Text;
// memo_flightsLog.Lines.Add( 'memo_flightsLog.Lines.Count: ' + IntToStr(memo_flightsLog.Lines.Count) );
SetLength(Main.FLIGHTS, stl_FlightsFile.Count);
// memo_flightsLog.Lines.Add( 'Length(FLIGHTS): ' + IntToStr(Length(FLIGHTS)) );
for I := 0 to Length(Main.FLIGHTS)-1 do
begin
stl_FlightData := TStringList.Create;
stl_FlightData.Text := StringReplace(stl_FlightsFile[i], '|', #13#10, [rfReplaceAll]);
if stl_FlightData.Count = 4 then
begin
Main.FLIGHTS[i].index := StrToInt(stl_FlightData[0]);
Main.FLIGHTS[i].title := stl_FlightData[1];
Main.FLIGHTS[i].distance := stl_FlightData[2];
Main.FLIGHTS[i].code := stl_FlightData[3];
imDone := true;
end else
begin
ShowMessage('Неверные данные файла. Действие прервано');
end;
stl_FlightData.Free;
if imDone then
begin
imDone := false;
continue;
end else Application.Terminate;
end;
memo_flightsLog.Lines.Add( 'FLIGHTS[1]: ' + Main.FLIGHTS[1].title );
end;
end;