|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Помогите понять причину ошибки
Здраствуйте. Весь код программы приводить не буду - только то что к проблеме относится. помогите разобраться если не затруднит. Прошу не кричите если подобное уже спрашивали, дайте хоть ссылку где. Я прежде чем создать тему, искал ответ на разных форумах но вразумительного ответа так и не нашел.
Код:
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. И не будьте строги если я чего-то элементарного не знаю. Я программист-самоучка, профессионального образования программиста не получал. Знаю и умею вроде не так уж мало (как мне кажется) но пробелы в знаниях встречаются в самых неожиданных местах. Последний раз редактировалось Zander_driver, 09.08.2008 в 17:53. |
#2
|
|||
|
|||
Кажись ты маловато модулей описал чи с командой (Result) чтото неправильно, я гдето в статье видел, что у команды Result всегда в какомто блоке должен также иметь присвоение false, иначе при скомпилировании программы будет всегда выводиться сообщение.
PS (Я и сам программист-самоучка, пишу программы по статьям и учебнику, а по теме(ты ж описываеш проверку программы с помощью оператора if-then, а попробуй еще if-then-else.) |
#3
|
||||
|
||||
Да знаю я про else, просто в данном случае его необязательно использовать. Нет это точно не из-за того что Result всегда true. Я раньше во многих программах делал так, и делал так что Result вобще нет - Делфи тихонько причитает но компилирует.
Боюсь меня неправильно поняли. В данном случае приложение компилируется нормально безо всяких ошибок, и запускается нормально. Ошибка возникает при попытке вывести загруженное изображение на канву. |