-
Object reference not set anstance of an object
-
ссылка на несуществующий объект обращение к объекту, экземпляр которого либо не создан, либо уже удален
-
А как с ней бороться если я его создал
-
а код показать как минимум
-
type
TEmployeeContent = record
id : integer;
name : String;
end;
type
TEmployee = class(TObject)
id_employee : integer;
emp: array of TEmployeeContent;
function GetEmployeeIdByName(Name: String): integer;
private
procedure SetEmployeeByName(id: integer);
procedure SetEmployeeById(id: integer);
public
Name : String;
Group : String;
EmpName : TStrings;
procedure GetEmployeesNames;
end;
-
и што мы тут видим? :) только объявление класса, никаких созданий экземпляров и строки с ошибкой
-
employee := TEmployee.Create;
employee.GetEmployeesNames;-- здесь она возникает
-
попробуйте закомментировать //emp: array of TEmployeeContent; и весь код в GetEmployeesNames
-
procedure TEmployee.GetEmployeesNames;
var id:integer;
begin
with MastData.EmployeeTable do begin
first;
repeat
id := fieldbyname('id').AsInteger;
emp[id].name := fieldbyname('name').AsString;
empname.Add(emp[id].name);
until Eof;
end;
end;
-
Не понимаю, причем тут .NET, но я бы за такой код отпинал ногами на check-in review и никуда бы дальше он не пошел. Не вдаваясь в логику которая на мой взгляд тоже нуждается в улучшении, а просто за качество того, как написано.
MastData проверить на null, кинуть exception. MastData.EmployeeTable проверить на null, кинуть exception. проверить на наличие поля id, кинуть exception. emp проверить на null, создать. emp проверить на наличие emp[id], нет - добавить, есть - кинуть exception или наоборот. Тут смысл опять ускользает. проверить на наличие поля name, кинуть exception.
Опционально empname проверить на дубликать имени, кинуть exception Опционально по окончанию empname проверить на наличии хотя бы родного имени, если нет - кинуть exception
В таком варианте у вас просто не возникло бы начального вопроса.
-
во-первых, класс TStrings не следует использовать напрямую, большинство его методов абстрактные или виртуальные, используются его наследники, например TStringList, безусловно перед обращением следует его создать например в конструкторе класса TEmployee. во-вторых, нигде не видно штобы вы установили длину массива emp,и вообще нужен ли он, вместо него можно использовать списки из модуля Borland.Vcl.Contnrs (TObjectList,etc) и в-третьих, по видимому это vcl-application, тот код што вы привели я имею в виду объявление класса даже не компилируется может вы потрудитесь привести реальный код, реальные описания и какая задача ставиться перед классом TEmployee если все слишком секретно, то возможно стоит посмотреть в сторону коллекций, за сим откланиваюсь
-
спасибо. .net тут действительно не причем. Я давно не программил вот и забыл создать emp.
|