Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Корректная работа с записями, содержащими string.


__Алексей ©   (2006-12-10 18:04:00) 

Добрый вечер !
Есть структура:
type
TMyRecord = packed record
 Param1: string;
 Param2: string;
 Param3: DWord;
end;
TMyRecArray = array of TMyRecord;


var
MyRecArr: TMyRecArray;

Объясните, пожалуйста, как корректно выполнять следующие операции:
SetLength(MyRecArr, 1024);
// Заполняем  MyRecArr
SetLength(MyRecArr, 512); // Можно, в этом месте, не думать о "сокращенных" элементах ?
FillChar(MyRecArr[0], Length(MyRecArr) * SizeOf(TMyRecord), 0); // А как поступать здесь ?
         // ведь Length(MyRecArr) * SizeOf(TMyRecord) - не отражает реальный размер занимаемой памяти
SetLength(MyRecArr, 0);


__Алексей   (2006-12-10 23:43:00) [1]

>MetalFan © (10.12.06 23:19) [5]
>тада Finalize
Спасибо.
А как быть если:
SetLength(MyRecArr, 10);
MyRecArr[2].Param1:='bla-bla';
MyRecArr[8].Param1:='bla-bla';
SetLength(MyRecArr, 4);// Четыре элемента нам еще нужны
А память от удаленных шести корректно очищается ?


MetalFan   (2006-12-10 23:20:00) [2]

SetLength(MyRecArr, 10);
MyRecArr[2].Param1:='bla-bla';
Finalize( MyRecArr );
SetLength(MyRecArr, 4);
ShowMessage(MyRecArr[2].Param1);


MetalFan   (2006-12-10 23:19:00) [3]

и что? значение сохранилось, что не так то? очистить надо?
тада Finalize


__Алексей   (2006-12-10 23:13:00) [4]

>MetalFan ©   (10.12.06 22:25) [3]
>а зачем FillChar после SetLength?
SetLength(MyRecArr, 1024);
MyRecArr[57].Param1:='bla-bla';
SetLength(MyRecArr, 512);
ShowMessage(MyRecArr[57].Param1);


MetalFan   (2006-12-10 22:25:00) [5]

а зачем FillChar после SetLength?
в хелпе же сказано:
For a long-string or dynamic-array variable, SetLength reallocates the string or array referenced by S to the given length. Existing characters in the string or elements in the array are preserved, but the content of newly allocated space is undefined. The one exception is when increasing the length of a dynamic array in which the elements are types that must be initialized (strings, Variants, Variant arrays, or records that contain such types). When S is a dynamic array of types that must be initialized, newly allocated space is set to 0 or nil.
и зачем здесь packed record?


__Алексей   (2006-12-10 22:01:00) [6]

>Desdechado ©   (10.12.06 19:24) [1]
Спасибо. Но мне надо работать именно со структурой, описанной выше.
Да и понять, как надо делать, хочеться :)


Desdechado   (2006-12-10 19:24:00) [7]

String - строка динамической длины, до 2 Гб
для твоего метода только ShortString фиксированной длины.


Наверх

Титульная страница Поиск, карта сайта Написать письмо