Здраствуйте, появилась такая проблема, в данном файле BetaMarket.pas (12,2 КБ) паскаль ругается на данную строку
SetWindowtitle('Магазин приложений');
номер 454. Прошу помощи в исправлении. Dll используемое кодом:
readdll.dll (67 КБ)
У меня всё в порядке… У вас последняя версия установлена? Не надо ли что то нажимать после запуска чтоб получить эту ошибку?
Не понимаю я паскаль, перезапуск компьютера и код работает
Скорее всего вы что то поменяли и забыли, паскаль такое делать не может…
И вот опять эта ошибка, в этот раз она возникает при попытке скачать приложение. Но самое главное программа компилируется. Вот файлы: Market.pas (12,9 КБ) readdll.dll (66 КБ) readdll.pas (225 Байт)
У меня снова не воспроизводится (по крайней мере пока я не начинаю тыкать ничего). Кстати, что то ещё ваша программа создаёт, без моего ведома?
На счёт папки это папка в которой хранится кэш последней запущенной страницы, так как я не придумал как получать данные прямо с сервера
Ну так я же и говорю, скажите что нажимать. В вашей программе много кнопок, как я должен знать что нажимать? И, что важнее, что нажимать чтоб ваша программа не создала ещё 10 папок в рандомных местах на компьютере .
Ну допустим я скачиваю “городок” или как он там… Вот стек на момент исключения:
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
. Можно воспользоваться отладкой:
(Могу рассказать и подробнее)
Но в паскале отладка не из лучших (стоит помнить про #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
это лучшее решение, но тогда сразу поймёте куда ещё надо его поставить.
Решил перекопать весь код и нашёл, У меня в глобальном var описана back, но в коде где создаётся сама кнопка тоже стоит var. Данная проблема и вызвала ошибку.
Ну да, точно, просто посмотреть на свой код - это то, что надо делать раньше других способов))) Как то само собой разумеется, вот и забыл.