Как извлечь многомерный элемент класса, содержащий многомерные массивы, из массива

В настоящее время я работаю с CodeGear Delphi 2007 под Vista. Моему приложению возвращается ошибка памяти во время довольно сложных вычислений. Размер.exe-файлов увеличивается с 150 Мб до 2 Гб (! LOL)

По этому вопросу:

1) Я превращаю некоторые массивы в arraylist, НО это дает мне довольно сложные проблемы для решения (см. Пример ниже)

2) Предложения, которые работают с многомерными структурами и требуют небольших изменений в коде, приветствуются!

Теперь старый способ обращения к члену был:

function TResults.GetTriangleA(ComNr, triangleA, PtNr : integer) : single;
  Begin
  try
    result := ListTriangleRes[TriangleA - 1].GetA(ComNr, PtNr);

И вот класс TriangleResult:

TTriangleRes = class(TResults)
private
IndexPoint1, IndexPoint2, Indexpoint3 : integer; 
MyA : array of array [1..3] of single;  
MyB : array of array [1..3] of single; 

Здесь я пытаюсь найти выход с новым arraylist, но пока не очень успешно

function TResults.GetTriangleVz(ComNr, triangleA, PtNr : integer) : single;
Var
  MyTriangleRes:    TTriangleRes;
  MyObj:            Tobject;
begin
  MyTriangleRes:=  TTriangleRes.Create ;
  try
    MyObj := ListTriangleRes[TriangleA - 1] ;
    result := MyObj <<<<?????? how to>>>>MyTriangleRes.GetVz(ComNr, PtNr);

Мкр

Эдвард

2 ответа

Насколько я знаю, ArrayList - это коллекция Java/C#, которая не используется в Delphi. Наш эквивалент называется TObjectList. (Или TList, но лучше использовать TObjectList, если вы работаете с объектами.) Это то, что вы используете? Я предполагаю, что вы.

Похоже, ваша проблема с типами объектов. Есть два способа вывести объект из списка с правильным типом. Вы можете использовать обычный список и типизировать его, или, если у вас D2009 или D2010, вы можете использовать общий список.

Первый способ, используя TObjectList:

MyTriangleRes := ListTriangleRes[TriangleA - 1] as TTriangleRes; //type-safe cast

Второй способ: объявить ListTriangleRes как TObjectList<TTriangleRes>и добавьте Generics.Collections к предложению использования. Это обеспечивает безопасность типов во время компиляции, а не во время выполнения, так как компилятор будет следить за тем, чтобы только объекты TTriangleRes входили и выходили из списка.

В любом случае, промежуточная переменная TObject не нужна.

Я не совсем уверен, что вы пытаетесь сделать, но не должен ли ваш последний код быть MyTriangleRes:=ListTriangleRes[TriangleA-1], а затем Result:=MyTriangleRes.GetVz(ComNr,PtNr)?

Другие вопросы по тегам