Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];

Вниз

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

 
__Алексей   (2006-12-10 18:04) [0]

Добрый вечер !
Есть структура:
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);


 
Desdechado ©   (2006-12-10 19:24) [1]

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


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

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


 
MetalFan ©   (2006-12-10 22:25) [3]

а зачем 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 23:13) [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 23:19) [5]

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


 
MetalFan ©   (2006-12-10 23:20) [6]

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


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

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.039 c
1-1163401076
DelphiLexx
2006-11-13 09:57
2006.12.31
Отключить стиль XP для контрола


15-1165488726
Логин
2006-12-07 13:52
2006.12.31
Беспрводные сети!


8-1147104191
Dstr
2006-05-08 20:03
2006.12.31
Stream и звук


15-1165511417
Карелин Артем
2006-12-07 20:10
2006.12.31
Мед осмотр или очередная галочка.


2-1166096952
goric
2006-12-14 14:49
2006.12.31
String в синтаксис языка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский