Type
pIntArr = ^IntArr;
IntArr = Array[1..1000] ofInteger;
Var
MyPtr : pIntArr;
Begin
GetMem(MyPtr, 10); { 10 = SizeOf(Integer) * 5 !!}
{ MyPtr[2]:=1; }
<<<< Заполняем массив >>>>
MyPtr[2]^:=1;
FreeMem(MyPtr,10);
End;
Технология похожа на ту, которуя Delphi использует при работе с pchar. Синтаксис очень похож:
typeintarray = array[0..20000] ofinteger;
procedureTForm1.Button1Click(Sender: TObject);
var
xptr: ^IntArray;
begin
GetMem(xptr, 10);
xptr^[idx] := 1; { где idx от 0 до 4, поскольку мы имеем 10 байте = 5 целых }
FreeMem(xptr, 10);
end;
Обратите внимание на то, в вам в действительности нет необходимости распределять массив для 20,000 элементов, но проверка диапазона Delphi не будет работать, если диапазон равен 20,000. (Предостережение будущим пользователям!)
Функция MemAvail для Delphi2?
В Delphi 1, для того, чтобы получить самый большой возможный участок памяти, мы могли использовать функцию MemAvail, существует ли эквивалент этой функции в Delphi 2?
Нет. Но чтобы получить аппроксимированную сумму доступной памяти, можно воспользоваться функцией API GlobalMemoryStatus (через поле dwAvailVirtual возвращаемой структуры TMemoryStatus).
Steve Schafer
Как работать с блоками памяти размером более 64K?
Nomadicсоветует:
Так можно помещать в один блок памяти записи из TList (TCollection):
imlementation
{ To use the value of AHIncr, use Ofs(AHIncr). }
procedureAHIncr; far; external'KERNEL' index114;
const
NEXT_SELECTOR: string[13] = 'NEXT_SELECTOR';
functionWriteData: THandle;
var
DataPtr: PChar;
i: Integer;
begin
Result := GlobalAlloc(GMEM_SHARE orGMEM_ZEROINIT, {pазмеp большого блока});
ifResult = 0 thenExit;
DataPtr := GlobalLock(Result);
{записываем кол-во эл-тов}
Inc(DataPtr, {pазмеp счетчика эл-тов})
fori := 0 to{некий}Count-1 do begin
ifLongInt(PtrRec(DataPtr).Ofs) + {pазмеp подблока} >l= $FFFF then begin
Move(NEXT_SELECTOR, DataPtr^, SizeOf(NEXT_SELECTOR)); {некая константа}
{ коppекция сегмента }
PtrRec(DataPtr).Seg := PtrRec(DataPtr).Seg + Ofs(AHIncr);
PtrRec(DataPtr).Ofs := $0;
end;
Inc(DataPtr, {pазмеp нового блока});
end; { for i }
GlobalUnlock(Result);
end;
procedureReadData(DataHdl: THandle);
var
DataPtr : PObjectCfgRec;
RecsCount: Integer;
i: Integer;
begin
ifDataHdl = 0 thenExit;
DataPtr := GlobalLock(DataHdl);
RecsCount := PInteger(DataPtr)^;
Inc(PInteger(DataPtr));
fori := 1 toRecsCount do begin
{ обpаботать данные }
Inc(DataPtr);
ifPString(DataPtr)^ = NEXT_SELECTOR then begin
PtrRec(DataPtr).Seg := PtrRec(DataPtr).Seg + Ofs(AHIncr);
PtrRec(DataPtr).Ofs := $0;
end;
end; { for i }
GlobalUnlock(DataHdl);
end;
Назначение обработчика события OnClick пункту меню, созданному во время выполнения программы
Поскольку метод OnClick является свойством, то при динамическом создании элемента меню вы можете назначить имя метода обработчику OnClick:
theMenuitem.OnClick := TheOnClickHandler;
Затем, в обработчике OnClick, вы приводите sender к TMenuItem и читаете имя:
proceduretheform.TheOnClickHandler(Sender: TObject);
var
fName: String;
begin
fName := TMenuItem(Sender).name;
…
end;
События для компонентов, созданных во время работы программы I
Вы должны вручную создать метод, который будет иметь тот же самый набор параметров, как и у события, которое вы хотите обработать. Затем вы должны вручную установить свойство OnXXX, чтобы она указывала на метод, который вы создали.
Пример:
TForm1 = class(TForm)
procedureFormCreate(Sender: TObject);
private
FMyButton: TButton;
protected
procedureButton1Click(Sender: TObject);
{Кодируем это вручную,для соответствия}
{структуреTNotifyEvent}
end;
procedureTForm1.FormCreate(Sender: TObject);
begin
FMyButton := TButton.Create;
{Здесь устанавливаем позицию, заголовок и все остальное}
Читать дальше