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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2011, 01:17   #11
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

да ладно, у меня просто личная неприязнь к высокоуровневым компонентам.
предпочитаю делать свои, чтобы знать как они работают, вот.

кстати по поводу уничтожения!
как уничтожить массив?
если у меня в классе объявлен array of array, он потом сам удалится
при уничтожении объекта класса, или его принудительно надо?

SetLength(array,0) - это можно считать уничтожением массива?
память так освобождает, как мы выяснили =)
-------------------

мне для хранения такой информации:
"что-то" "нечто" "ничего" "еще что-нибудь"
"что-то" "нечто" "ничего" "еще что-нибудь"

особая иерархия не нужна, но за идею спасибо! учту на будущее.
пока что схвачусь за array of array.

Последний раз редактировалось xrob; 03.09.2011 в 01:22.
xrob вне форума Ответить с цитированием
Старый 03.09.2011, 01:35   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
с массивами можно таких дел наворотить...
вы имели в виду индексируемые свойства?(индексаторы)
по крайней мере в коде они.
Цитата:
при уничтожении объекта класса, или его принудительно надо?
массив то сам, а вот если массив объектов, то объекты надо тоже удалять.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.09.2011, 01:36   #13
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Я вам предлогаю то, что уже за вас написано и продуманно. А тот факт что
Цитата:
TList stores an array of pointers.
говорит о том, что это то, что вам надо.

Ну если вам хочется "странного":
Цитата:
кстати по поводу уничтожения!
как уничтожить массив?
если у меня в классе объявлен array of array, он потом сам удалится
при уничтожении объекта класса, или его принудительно надо?
Код:
var
 i:Itnteger;
begin
For i:=Low(SomeArray) to High(SomeArray) do
begin
 if assigned(SomeArray[i]) then
 begin
 {
Проверяем не пустая ли ячейка массива(По умолчанию все ячейки равны nil).
if assisgned() = true говорит что в ячейке что-то лежит...
НАМ НЕЛЬЗЯ просто сделать 
SomeArray[i]:=nil; 
Вы то обнулите ячейку, а обьект будет висеть в памяти, и тем самым кушать ОЗУ
Нужно знать что в ячейке и в зависимости от этого делать действия.
Массивы сами себя не уничтожают... 
FreeMem просто уничтожит указатели на обьекты, а обькты остануться(Если таковые были в уничтоженном массиве).
 }
 end;
end;
end;
Код:
SetLength(array,0) - это можно считать уничтожением массива?
 память так освобождает, как мы выяснили =)
Плохой вариант!

Код:
var
  myArray:array of Integer;
begin
 @myArray:=AllocMem(//кол-во ячеек); //вернёт указатель на выделенную оЗУ из кучи

{
тибидох-тибидох
}
FreeMem(myArray); //Уничтожаем выделенную память
end;
Цитата:
мне для хранения такой информации:
"что-то" "нечто" "ничего" "еще что-нибудь"
"что-то" "нечто" "ничего" "еще что-нибудь"
Я жеке говорю, "Ему хочется странного"...
Человек_Борща вне форума Ответить с цитированием
Старый 03.09.2011, 08:49   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Цитата:
Код:
SetLength(array,0) - это можно считать уничтожением массива?
 память так освобождает, как мы выяснили =)
Плохой вариант!
Это ещё почему?!
Справка Delphi утверждает, что так и нужно поступать с динамическими массивами:
Цитата:
Dynamic-array variables are implicitly pointers and are managed by the same reference-counting technique used for long strings. To deallocate a dynamic array, assign nil to a variable that references the array or pass the variable to Finalize; either of these methods disposes of the array, provided there are no other references to it. Dynamic arrays of length 0 have the value nil. Do not apply the dereference operator (^) to a dynamic-array variable or pass it to the New or Dispose procedure.
вот, предлагаю ознакомится со следующим кодом:
Код:
var
  MyArray : array of Integer;
begin
  if MyArray = nil then ShowMessage('ДО выделения памяти под массив указатель равен NIL');
  SetLength(MyArray, 2);
  if MyArray = nil then ShowMessage('После выделения равен NIL')
    else ShowMessage('После выделения указатель массива не равен NIL');
  MyArray[1] := 100500;

  SetLength(MyArray, 0);
  if MyArray = nil then ShowMessage('После указания нулевого размера равен NIL')
    else ShowMessage('После указания нулевого размера указатель массива не равен NIL');
p.s. Только если динамический массив включает в себя указатели на объекты (например, TStringList) - то перед очисткой массива обязательно надо пройтись по массиву и для назначенных указателей выполнить очистку (вызвать деструктор) каждого объекта. Например, так:
Код:
for i:=Low(MyArray) to High(MyArray) do
  if Assigned(MyArray[i]) then MyArray[i].Free;
Цитата:
Я же говорю, "Ему хочется странного"...
полностью согласен.
Имхо, для подобных целей придумали датасеты. Они есть размещаемые в памяти (например, TJvMemoryData). и тогда можно не только хранить любые табличные данные, но и легко их добавлять, искать, сортировать, отображать в гриде и т.д. и т.п.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.09.2011, 14:14   #15
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

кстати, отображать в гриде я тоже с нуля буду )))
напишу свой компонент, который будет показывать мне таблицу,
с АДЕКВАТНОЙ прокруткой, а не как в стандартных компонентах. ы!
все это дело рисоваться будет на канвасе =)
с помощью Canvas.Draw(bitmap) и Canvas.TextOut.
для редактирования ячейки положим на нее сверху TEdit.
вот как-то так =)

для тех кто считает что это глупо - прстой вопрос, точнее 2, пока 2:
я хочу чтоб цвет сетки в StringGrid был зеленый. как?
я хочу плавную полосу прокрутки, а не по строчкам или колонкам. как?

Последний раз редактировалось xrob; 03.09.2011 в 14:17.
xrob вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Виртуальная память ordoss Общие вопросы C/C++ 1 12.01.2011 18:00
Динамическая память. spotmc13 Паскаль, Turbo Pascal, PascalABC.NET 5 20.09.2010 17:08
память процесса T_I_T_A_N Общие вопросы Delphi 7 28.06.2010 13:52
Память Ghennadiy Общие вопросы Delphi 9 25.08.2009 09:23
динамическая память aka_faith Общие вопросы C/C++ 47 12.06.2009 12:35