Здраствуйте. Весь код программы приводить не буду - только то что к проблеме относится. помогите разобраться если не затруднит. Прошу не кричите если подобное уже спрашивали, дайте хоть ссылку где. Я прежде чем создать тему, искал ответ на разных форумах но вразумительного ответа так и не нашел.
Код:
uses
Jpeg;
type
TLoadData = (ldBitmap, ldstring, ldinteger, ldextended, ldboolean, ldcolor);
TReadBuffer = record
EX: extended;
INT: integer;
BOL: boolean;
CLR: TColor;
BMP: TBitmap;
STR: string;
end;
{Types for Interface}
TBitmapCursor = record
Cursor: array [1..24] of TBitmap;
end;
TObjectView = record
Caption: string[50];
Font: TFont;
Color: TColor;
View: TBitmap;
Cursor: TBitmapCursor;
end;
TGameIntComponent = record
Rect: TRect;
Enabled,Visible: Boolean;
ObjectView: TObjectView;
end;
TIntContainer = record
Component: array [1..8] of TGameIntComponent;
end;
var
Form1: TForm1;
ScreenBuffer: TBitmap;
IntObjects: array [1..8] of TIntContainer;
TargetFile: TextFile;
Config,DebugLog: TStringList;
ReadBuffer: TReadBuffer;
function Debugger (func_name,params: string; stat: boolean): boolean;
begin // функция-отладчик. вызывается когда какая-либо функция
//запущена или завершена, делает запись об этом в текстовом файле
Debuglog.Add('function: ' + func_name);
Debuglog.Add('parameters: ' + params);
If stat then
begin
Debuglog.Add('startfunction;');
end
else begin
Debuglog.Add('function finalled;')
end;
Debuglog.SaveToFile('log.txt');
Result:= true;
end;
function LoadFromJpeg (File_Name: string): boolean;
{функция загрузки изображений из файлов с
расширением *.JPG}
var
JpegIm: TJpegImage;
BMP: TBitmap;
begin
//Debugger('loadfromJPEG',File_Name,true);
BMP:= TBitmap.Create;
JpegIm:= TJpegImage.Create;
JpegIm.LoadFromFile(File_Name);
BMP.Assign(JpegIm);
Readbuffer.BMP:= BMP;
BMP.Destroy;
JpegIm.Destroy;
Result:= true;
// Debugger('LoadfromJPEG',File_Name,false);
end;
function Loading(verify: string; LD: TLoadData;
Startload,Endload: integer): boolean;
{
функция загрузки заданного (любого) типа данных .
в случае успешной загрузки возвращает значение истина.
в случае невозможности загрузки (не найден требуемый параметр) - ложь}
var
a: integer;
begin
// Debugger('Loading',verify + ',' + inttostr(Startload) + ',' + inttostr(endload),true);
a:= FindCL(verify,Startload,endload);
If a = -1 then
begin
Result:= false;
end
else begin
If LD = ldbitmap then LoadfromJpeg(Conflabel[a].Value);
If LD = ldextended then Readbuffer.EX:= Str_to_Float(Conflabel[a].Value);
If LD = ldinteger then Readbuffer.INT:= strtoint(Conflabel[a].Value);
If LD = ldstring then Readbuffer.STR:= Conflabel[a].Value;
If LD = ldcolor then Readbuffer.CLR:= ColorFromFile(Conflabel[a].Value);
If LD = ldboolean then
begin
Readbuffer.BOL:= true;
If (Conflabel[a].Value = '') or (Conflabel[a].Value = '0') or
(Conflabel[a].Value = 'false') or (Conflabel[a].Value = 'nil') then Readbuffer.BOL:= false;
end;
Result:= true;
end;
end;
function LoadInterface (): boolean;
var
a,b,y: byte;
s: string;
L,H: integer;
begin
...
Debugger('loadinterface','No_parameters',true);
Loadconfig('resourses\interface\config.ltx');
Loading_Progress:= 0;
y:= 1;
while y < 9 do
begin
a:= 1;
while a < 9 do
begin
Loading_Progress:= round(1000 * (((y - 1)/ 8) + ((a - 1)/ 64)));
L:= FindCL('sector' + inttostr(y - 1) + '[component' + inttostr(a - 1) + ']',0,Length(Conflabel));
If (L < 0) then
begin
Showmessage('не найдено' + inttostr(y - 1) + 'component' + inttostr(a - 1));
L:= 0;
end;
H:= FindCL('sector' + inttostr(y - 1) + '[component' + inttostr(a) + ']',0,Length(Conflabel));
If H = -1 then H:= Length(Conflabel) - 1;
Loading('ObjectView.View',ldbitmap,L,H);
IntObjects[y].Component[a].ObjectView.View:= Tbitmap.Create;
IntObjects[y].Component[a].ObjectView.View:= Readbuffer.BMP;
...
a:= a + 1;
end;
y:= y + 1;
end;
Showmessage('загрузка интерфейса завершена');
{ТУТ ФУНКЦИЯ ИСПРАВНО ОТРАБАТЫВАЕТ ДО КОНЦА. ЦИКЛЫ РАБОТАЮТ, ПРОВЕРЯЛ}
Result:= true;
Debugger('load_Interface','No_parameters',false);
end;
function UserCommand_DO (IDC: Integer): boolean;
var
a,b: integer;
begin
Debugger('Do_UserCommand',inttostr(IDC),true);
If IDC = 1 then form1.Close; // 1 - закрыть программу.
If IDC = 2 then form1.Canvas.Draw(10,10,IntObjects[a].Component[b].ObjectView.View);
If IDC = 3 then form1.Color:= IntObjects[1].Component[1].ObjectView.Color;
{ КОМАНДУ 2 прописал для проверки. При попытке ее выполнения (по нажатию кнопки Shift) и выскакивает ошибка из-за которой я сюда пишу.
access violation at address 00000000. Read of address 00000000.
команды 1 и 3 нормально работают.}
// .. другие команды
Result:= true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Config:= TStringList.Create;
DebugLog:= TStringList.Create;
Readbuffer.BMP:= TBitmap.Create;
LoadInterface;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If key = 27 then UserCommand_DO(1); //esc
If key = 16 then UserCommand_DO(2); //shift
If key = 32 then UserCommand_DO(3); //space
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Config.Destroy;
DebugLog.Destroy;
Showcursor(true);
end;
Проблема такая. При запуске программа читает из текстового файла данные, записывая значения в разные переменные, (там конвертация идет, текст идет как текст, в число - перегоняется из текста, если цвет то тоже для этого я функцию-конвертор написал но суть не в этом, там все работает) - когда необходимо загрузить картинку (TBitmap) программа из текстового файла берет адрес файла картинки, затем загружает картинку. Вписывал функцию-отладчик (по окончании каждой подозрительной функции делается запись-лог в текстовый файл) - показывает что загрузка битмапа прошла нормально. Еще один момент - загрузка из .jpg идет.
Из файлов картинки сначала грузятся в глобальную переменную потом ее значение присваивается нужной переменной.
Так вот, когда я пытаюсь вывести загруженный битмап на form1.canvas.draw (см. процедуру FormKeyDown и функцию UserCommand_DO, вывод картинки должен быть по нажатию Shift) то ничего не выходит, выскакивает ошибка:
access violation at address 00000000. Read of address 00000000.
при этом программа не закрывается.
Пожалуйста помогите разобраться в чем причина ошибки. Что я делаю не так?
P.S. И не будьте строги если я чего-то элементарного не знаю. Я программист-самоучка, профессионального образования программиста не получал. Знаю и умею вроде не так уж мало (как мне кажется) но пробелы в знаниях встречаются в самых неожиданных местах.