Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2012, 22:30   #1
Celestia
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 68
Восклицание Динамический массив обьектов

Здравствуйте уважаемые друзья! Прошу помощи в решении задачи. Задача в общем то простая, но мой уставший мозг (сутки не сплю уже, работа горит) отказывается о чём то думать Суть в том что я создаю менеджер объектов и никак не могу добиться нормальной его работы, дело в работе с массивом я полагаю


Код:
TMytestClass = class(TObject)
 a,b,c,d: integer;
 ID: string;
end;
  
TObjectList = object
 private
  Objects: array of TMytestClass;
 public
  Function AddMyTestClass: integer;
  Function GetMytestClass(Index: integer;ID: string): TMytestClass;
end;

Var
  Form1: TForm1;
  ObjectList: TObjectList;

implementation

{$R *.dfm}

{$REGION ' <-- Реализация: TObjectList -----]'}

Function TObjectList.AddMyTestClass: integer;
begin
 SetLength(Objects,Length(Objects)+1);
 Result:=Length(Objects);
end;

Function TObjectList.GetMytestClass(Index: integer;ID: string): TMytestClass;
var
 i: integer;
begin
// если поиск по ID то игнорим значение индекса и ищем по ID
if not (ID='') then
begin
 for I := 0 to length(Objects) - 1 do
  begin
   if ((not (Objects[i]=nil)) and ((Objects[i] as TMytestClass).ID=ID)) then
    begin
     Result:=Objects[i];
     exit;
    end;
  end;
end else
// иначе, возвращаем по индексу
begin
 Result:=Objects[Index];
 exit;
end;
end;

{$ENDREGION}

procedure TForm1.Button1Click(Sender: TObject);
var
 Z: integer;
begin
Z:=RotorObjectList.AddMyTestClass;
RotorObjectList.GetMytestEngineClass(Z,'').ID:='OK1';
Showmessage(Inttostr(Z));
Showmessage(RotorObjectList.GetMytestEngineClass(Z,'').ID);
end;
Заранее всем спасибо кто откликнется!
Celestia вне форума Ответить с цитированием
Старый 15.05.2012, 23:48   #2
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию

Не работает, потому, как забываем вызывать конструктор TMytestClass!

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 Z: integer;
begin
Z:=RotorObjectList.AddMyTestClass;
RotorObjectList.GetMytestEngineClass(Z,'').ID:='OK1'; // Здесь вылетает AV
Showmessage(Inttostr(Z));
Showmessage(RotorObjectList.GetMytestEngineClass(Z,'').ID);
end;
Хоть память и подвержена фрагментированию, ну да ладно...

Код:
Function TObjectList.AddMyTestClass: integer;
begin
 SetLength(Objects,Length(Objects)+1);
 // Чтоб не вылетало AV, вызываем конструктор!
 Objects[Length(Objects) - 1] := TMytestClass.Create;
 Result:=Length(Objects);
end;
Хотя, не понимаю, зачем TMytestClass = class(TObject)? Если можно

Код:
TMytestClass = record
 a,b,c,d: integer;
 ID: string;
end;
и конструктор вызывать не надо ;-)
Miha85193 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический массив gusluk Общие вопросы Delphi 9 13.10.2011 15:27
Динамический массив, массив указателей alexalisa Паскаль, Turbo Pascal, PascalABC.NET 4 22.04.2011 21:33
Динамический массив tony_vies Помощь студентам 0 20.02.2011 21:18
Динамический массив - или всё таки не динамический? vedro-compota Общие вопросы C/C++ 30 10.12.2010 23:22
Динамический массив Программер Михаил Общие вопросы C/C++ 2 09.12.2010 06:22