Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта

Здраствуйте, появилась такая проблема, в данном файле BetaMarket.pas (12,2 КБ) паскаль ругается на данную строку SetWindowtitle('Магазин приложений'); номер 454. Прошу помощи в исправлении. Dll используемое кодом: readdll.dll (67 КБ)

У меня всё в порядке… У вас последняя версия установлена? Не надо ли что то нажимать после запуска чтоб получить эту ошибку?

Не понимаю я паскаль, перезапуск компьютера и код работает

Скорее всего вы что то поменяли и забыли, паскаль такое делать не может…

И вот опять эта ошибка, в этот раз она возникает при попытке скачать приложение. Но самое главное программа компилируется. Вот файлы: Market.pas (12,9 КБ) readdll.dll (66 КБ) readdll.pas (225 Байт)

У меня снова не воспроизводится (по крайней мере пока я не начинаю тыкать ничего). Кстати, что то ещё ваша программа создаёт, без моего ведома?

Странно, у меня при нажатии кнопки скачать выходит это:

На счёт папки это папка в которой хранится кэш последней запущенной страницы, так как я не придумал как получать данные прямо с сервера

Ну так я же и говорю, скажите что нажимать. В вашей программе много кнопок, как я должен знать что нажимать? И, что важнее, что нажимать чтоб ваша программа не создала ещё 10 папок в рандомных местах на компьютере :slight_smile:.

Ну допустим я скачиваю “городок” или как он там… Вот стек на момент исключения:

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
   в webmarket.webmarket.load() в C:\Users\Master in EngLiSH\Desktop\Market.pas:строка 144
   в ABCButtons_implementation______.ABCButtons_implementation______.ButtonsMouseUp(Int32 x, Int32 y, Int32 mb) в C:\Program Files (x86)\PascalABC.NET\LibSource\ABCButtons.pas:строка 81
   в GraphABC.ABCControl.OnMouseUp(Object sender, MouseEventArgs e) в C:\Program Files (x86)\PascalABC.NET\LibSource\GraphABC.pas:строка 2352
   в System.Windows.Forms.Control.OnMouseUp(MouseEventArgs e)
   в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   в System.Windows.Forms.Control.WndProc(Message& m)
   в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Что вам понятно из этого, что надо объяснять?

WebClient.DownloadData или WebClient.DownloadString в зависимости от того что вы хотите, массив байтов или текст.

Ну я вас не сильно упрекаю в самом факте что программа что то создаёт, просто говорите что потом надо подчистить, ведь программа сама не удаляет.

Вот эта ошибка и приходит

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
   в webmarket.webmarket.load() в C:\Users\Master in EngLiSH\Desktop\Market.pas:строка 144
   в ABCButtons_implementation______.ABCButtons_implementation______.ButtonsMouseUp(Int32 x, Int32 y, Int32 mb) в C:\Program Files (x86)\PascalABC.NET\LibSource\ABCButtons.pas:строка 81
   в GraphABC.ABCControl.OnMouseUp(Object sender, MouseEventArgs e) в C:\Program Files (x86)\PascalABC.NET\LibSource\GraphABC.pas:строка 2352
   в System.Windows.Forms.Control.OnMouseUp(MouseEventArgs e)
   в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   в System.Windows.Forms.Control.WndProc(Message& m)
   в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Как её исправить, не понимаю.

Только та папка

Чтоб исправить надо понять что написано в этой ошибке.

Вот смотрите первая строчка стека:

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.

Это значит что была попытка взаимодействия с пустой ссылкой (с nil). Дальше:

в webmarket.webmarket.load() в C:\Users\Master in EngLiSH\Desktop\Market.pas:строка 144

Это значит что ошибка возникла в вашей программе, в процедуре load, на строке 144. Смотрим на строчку 144:

Back.Destroy;

То есть скорее всего Back было =nil, поэтому вызвалась ошибка. Следующая строчка стека:

в ABCButtons_implementation______.ABCButtons_implementation______.ButtonsMouseUp(Int32 x, Int32 y, Int32 mb) в C:\Program Files (x86)\PascalABC.NET\LibSource\ABCButtons.pas:строка 81

То есть процедуру load (в которой находится строчка 144) вызвала процедура ButtonsMouseUp из модуля ABCButtons. Это уже внутреняя ошибка, и как видите, к вашей программе стек не возвращается, значит не важно…

Значит надо узнать как получается что Back было nil. Можно воспользоваться отладкой:

image

image

(Могу рассказать и подробнее)

Но в паскале отладка не из лучших (стоит помнить про #763, #764 и т.п.).

Можно добавить какую то процедуру/процедуры записывающую в файл какие то данные (к примеру, не равно ли Back - nil). Вот такими я обычно пользуюсь:

процедуры записи в файл
///работает как writeln, только с файлом "name". И в отличии от TextFile сохраняет файл сразу после записи
procedure WTF(name: string; params obj: array of object) := System.IO.File.AppendAllText(name, string.Join('', obj.ConvertAll(a -> _ObjectToString(a))) + char(13) + char(10));
///для сохранения исключений пойманных с try except
procedure SaveError(params obj: array of object);
begin
  (new System.Threading.Thread(()->begin
    
    (new System.Threading.Thread(()->System.Console.Beep(1000, 1000))).Start;
    if not System.IO.File.Exists('Errors.txt') then
      WTF('Errors.txt', 'Started|', StartTime);
    var b := true;
    while b do
      try
        WTF('Errors.txt', new object[2](System.DateTime.Now, '|') + obj);
        b := false;
      except
      end;
    
  end)).Start;
end;

procedure Log(params data: array of object) := WTF('Log.txt', data);

procedure Log2(params data: array of object) := WTF('Log2.txt', data);

procedure Log3(params data: array of object) := WTF('Log3.txt', data);

Они медленные, но т.к. они сохраняют файл сразу после записи - можно не бояться потери данных (почти).

Так же ещё есть вариант перед строчкой 144 поставить if Back <> nil then, не попытавшись понять почему так происходит, но это называется костылём. Если не понять что именно идёт не так - этот баг может проявится ещё в 50 местах, и в итоге, кроме зря потраченного времени на добавление всюду if Back <> nil then, вы не можете быть уверены что не упустили какое то из проявлений этого бага. В итоге он окажется и в готовом продукте.

Ну а может быть такое что после того как вы найдёте что не так - окажется что if Back <> nil then это лучшее решение, но тогда сразу поймёте куда ещё надо его поставить.

2 лайка

Решил перекопать весь код и нашёл, У меня в глобальном var описана back, но в коде где создаётся сама кнопка тоже стоит var. Данная проблема и вызвала ошибку.

Ну да, точно, просто посмотреть на свой код - это то, что надо делать раньше других способов))) Как то само собой разумеется, вот и забыл.