Как извлечь многомерный элемент класса, содержащий многомерные массивы, из массива
В настоящее время я работаю с 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)?