Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Динамический массив объектов в Delphi

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

AnViSe



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Стоит задача создать массив объектов TpFIBDataSet  
В начале описываю массив:

Код:
var
aFDS: array of TpFIBDataSet;

Функция добавляет в массив новый объект с указанным SQL запросом и возвращает сам объект:

Код:
function TFrameAttr.GetFDS(sSQLAttr: string): TpFIBDataSet;
var
 iCountObj: SmallInt;
begin
 iCountObj := Length(aFDS) + 1;
 SetLength(aFDS,iCountObj);
 aFDS[iCountObj] := TpFIBDataSet.Create(nil);
 aFDS[iCountObj].Database := DMFIB.Database;
 aFDS[iCountObj].Transaction := DMFIB.TransRead;
 aFDS[iCountObj].UpdateTransaction := DMFIB.TransWrite;
 aFDS[iCountObj].SQLs.SelectSQL.Append(sSQLAttr);
 Result := aFDS[iCountObj];
end;

С созданием проблем не возникает, объект создается, а вот с уничтожением проблемы. Вот процедура занимающаяся уничтожением:

Код:
procedure TFramePOAttr.FreeFDS;
var
  I: Integer;
begin
 for I := Low(aFDS) to High(aFDS) do
  begin
   if Assigned(aFDS[I]) then //Здесь почему то объект не обнаруживается
    begin
     aFDS[I].Active := False;
     aFDS[I].Transaction := nil;
     aFDS[I].UpdateTransaction := nil;
     aFDS[I].Database := nil;
     aFDS[I].SQLs.SelectSQL.Clear;
     aFDS[I].Free;
     aFDS[I] := nil;
    end;
  end;
 SetLength(aFDS,0);
end;

 
Подскажите где я не правильно делаю...

Всего записей: 123 | Зарегистр. 10-11-2008 | Отправлено: 11:59 23-12-2013
Dmitry

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AnViSe

Цитата:
//Здесь почему то объект не обнаруживается  

А что значит не обнаруживается? aFDS[I] = nil?
Еще одно, адресация динамических массивов всегда начинается с 0. А в функции добавления объекта в массив, добавление начинается с 1. Там точно такой код работает?

Всего записей: 81 | Зарегистр. 24-09-2003 | Отправлено: 12:55 23-12-2013 | Исправлено: Dmitry, 12:58 23-12-2013
AnViSe



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dmitry
Да уж, а бревно в глазу и не заметил.
Хотя функция добавления почему то отрабатывает без ошибок.
Она будет выглядеть так:

Код:
function TFrameAttr.GetFDS(sSQLAttr: string): TpFIBDataSet;  
var  
 iCountObj: SmallInt;  
begin  
 iCountObj := Length(aFDS);  
 SetLength(aFDS,iCountObj + 1);  
 aFDS[iCountObj] := TpFIBDataSet.Create(nil);  
 aFDS[iCountObj].Database := DMFIB.Database;  
 aFDS[iCountObj].Transaction := DMFIB.TransRead;  
 aFDS[iCountObj].UpdateTransaction := DMFIB.TransWrite;  
 aFDS[iCountObj].SQLs.SelectSQL.Append(sSQLAttr);  
 Result := aFDS[iCountObj];  
end;

 
И при этом уничтожение тоже заработало как надо.
Спасибо за наводку.

Всего записей: 123 | Зарегистр. 10-11-2008 | Отправлено: 13:23 23-12-2013
MrZeRo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AnViSe
А чем не нравится TObjectList?
hччp://docwiki.embarcadero.com/Libraries/XE5/en/System.Generics.Collections.TObjectList
Там уже позаботились и о выделении памяти, и о вызовах деструкторов объектов при удалении если нужно.
Необходим ли этот код в действительности:

Цитата:
 
     aFDS[I].Active := False;  
     aFDS[I].Transaction := nil;  
     aFDS[I].UpdateTransaction := nil;  
     aFDS[I].Database := nil;  
     aFDS[I].SQLs.SelectSQL.Clear;  
     aFDS[I].Free;  
     aFDS[I] := nil;  
 

Просто MyObjectList.Delete(item_to_delete)  - и все сделано.

----------
... не это главное ...

Всего записей: 831 | Зарегистр. 30-01-2002 | Отправлено: 18:34 31-12-2013
AnViSe



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MrZeRo
TObjectList походу с XE4 появился или раньше?
Я сейчас просто пока на XE3 сижу.

Всего записей: 123 | Зарегистр. 10-11-2008 | Отправлено: 17:56 03-01-2014
Coltrain

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AnViSe

Цитата:
TObjectList походу с XE4 появился или раньше?  

Не скажу за Delphi 1, но в Delphi 3 этот класс уже был Так шо, пользуйся смело.

Всего записей: 160 | Зарегистр. 31-07-2002 | Отправлено: 18:36 03-01-2014
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AnViSe
Признаюсь честно, - массив объектов промеждуутробно воспринимается. Есть две уважаемые технологии - массивы и коллекции, делать генезис не надо, так же есть списки (наверно хаккеры придумали) - что такое список не понимает никто. Теперь главное.
 
Вам лично TpFIBDataSet  не нужно хранить. На него есть ссылка в ДатаСоурц, если не нужен фиб, то и датасурс киляйте смело.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 21:31 06-01-2014
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я использую стринглист - имя обьекта в стринг , обьект в obj
сразу и поиск доступен.

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 01:12 16-01-2014
AnViSe



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuriyRR
Небольшой примерчик можно?

Всего записей: 123 | Зарегистр. 10-11-2008 | Отправлено: 14:06 16-01-2014
OXDBA

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 aFDS[iCountObj].SQLs.SelectSQL.Append(sSQLAttr);  

А может все же использовать репозиторий запросов?
aFDS[iCountObj].DataSet_ID + запрос в FIB$DATASETS_INFO

Всего записей: 426 | Зарегистр. 19-01-2005 | Отправлено: 17:44 16-01-2014
AnViSe



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OXDBA
В принципе то можно. Но в контексте моей конкретной задачи запрос формируется на основе входных данных, и заранее не известен.

Всего записей: 123 | Зарегистр. 10-11-2008 | Отправлено: 18:16 22-01-2014 | Исправлено: AnViSe, 18:17 22-01-2014
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Динамический массив объектов в Delphi


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru