GetMem, процедура

Синтаксис


procedure GetMem(var P: Pointer; Size: Longlnt);

Описание

Процедура GetMem выделяет Size байт динамической памяти и сохраняет указатель на выделенную область памяти в Р. Она не инициализирует выделенную память. GetMem не является настоящей процедурой.

Ошибки

Советы и приемы

  • Память, выделенная GetMem, не инициализируется. При создании строки, динамического массива или Variant, следует вызвать Initialize или обнулить область памяти процедурой FillChar.
  • При использовании встроенного менеджера памяти GetMern поддерживает многопоточность, т. е. может быть вызвана из нескольких потоков одновременно (только в том случае, если IsMultiThread равна True).
  • Создавать запись или массив фиксированного размера следует с помощью New, а не GetMem.
  • Процедура GetMem обычно применяется для создания массива, размер которого неизвестен на этапе компиляции. И хотя динамические массивы в значительной степени исключили необходимость в использовании этой процедуры, она все еще встречается в существующем коде Delphi.

Пример


// Создает серую палитру и возвращает дескриптор палитры. Хотя
// можно создать палитру до 255 оттенков серого, многие видеоадаптеры
// могут показывать только 15 или 16 битов на пиксел, т. е. 5 бит
// для оттенка, или 32 различных серых оттенка,
function CreateGrayScalePalette(NumShades: Byte) : HPalette;
var
LogPalette: PLogPalette;
I: Integer;
begin
// TLogPalette ухе содержит место для одного элемента палитры,
// поэтому выделяем память для NumShades-1 дополнительного
// элемента.
GetMem(LogPalette,
SizeOf(TLogPalette) + (NumShades-1)*SizeOf(TPaletteEntry));
try
LogPalette.palVersion := $300;
LogPalette.palNumEntries := NumShades;
// TLogPalette определяет массив palPalEntry с границами 0..0,
// поэтому выключаем проверку на границы диапазона для установки
// других границ массива.
{$R-}
for I := 0 to NumShades-1 do
begin
LogPalette.palPalEntry[I].peRed := I * 256 div NumShades;
LogPalette.palPalEntry[I].peGreen := I * 256 div NumShades;
LogPalette.palPaLEntry[I].peBlue := I * 256 div NumShades;
LogPalette.palPalEntry[I].peFlags := 0;
end;
{$R+}
Result := CreatePalette(LogPalette);
finally
FreeMem(LogPalette)
end;
end;

Смотрите также

Процедуры FillChar, FreeMem, Initialize, ReallocMem, функция GetMemory, SysGetMem.
    Учебник по языку Pascal          Лабораторные работы по программированию          Справочник



2022-03-30 12:17:18






Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: