Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.08.2008, 17:40
Аватар для Zander_driver
Zander_driver Zander_driver вне форума
Прохожий
 
Регистрация: 07.03.2008
Сообщения: 29
Репутация: 10
По умолчанию Помогите понять причину ошибки

Здраствуйте. Весь код программы приводить не буду - только то что к проблеме относится. помогите разобраться если не затруднит. Прошу не кричите если подобное уже спрашивали, дайте хоть ссылку где. Я прежде чем создать тему, искал ответ на разных форумах но вразумительного ответа так и не нашел.
Код:
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  
Старый 09.08.2008, 20:19
Delphimen Delphimen вне форума
Прохожий
 
Регистрация: 01.07.2008
Сообщения: 3
Репутация: 10
По умолчанию

Кажись ты маловато модулей описал чи с командой (Result) чтото неправильно, я гдето в статье видел, что у команды Result всегда в какомто блоке должен также иметь присвоение false, иначе при скомпилировании программы будет всегда выводиться сообщение.

PS (Я и сам программист-самоучка, пишу программы по статьям и учебнику, а по теме(ты ж описываеш проверку программы с помощью оператора if-then, а попробуй еще if-then-else.)
Ответить с цитированием
  #3  
Старый 10.08.2008, 01:56
Аватар для Zander_driver
Zander_driver Zander_driver вне форума
Прохожий
 
Регистрация: 07.03.2008
Сообщения: 29
Репутация: 10
По умолчанию

Да знаю я про else, просто в данном случае его необязательно использовать. Нет это точно не из-за того что Result всегда true. Я раньше во многих программах делал так, и делал так что Result вобще нет - Делфи тихонько причитает но компилирует.

Боюсь меня неправильно поняли.
В данном случае приложение компилируется нормально безо всяких ошибок, и запускается нормально. Ошибка возникает при попытке вывести загруженное изображение на канву.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:23.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter