initialization
{ инициализируем содержание массива указателей на функции }
@ProcTable[1] := @Proc1;
@ProcTable[2] := @Proc2;
@ProcTable[3] := @Proc3;
@ProcTable[4] := @Proc4;
@ProcTable[5] := @Proc5;
end.
Я думаю это можно сделать приблизительно так: объявите в каждой форме процедуры, обрабатывающие нажатие кнопки, типа процедуры CutButtonPressed(Sender:TObject) of Object; затем просто назначьте события кнопок OnClick этим процедурам при наступлении событий форм OnActivate. Этот способ соответствует концепции ОО-программирования, но если вам не нравится это, то вы все еще можете воспользоваться указателями функций, которая предоставляет Delphi.
Объявите базовый класс формы с объявлениями абстрактных функций для каждой функции, которую вы хотите вызывать из вашего toolbar. Затем наследуйте каждую вашу форму от базового класса формы и создайте определения этих функций.
Пример: (Здесь может встретиться пара синтаксических ошибок — я не компилил это)
type
TBaseForm = class(TForm)
public
procedure Method1; virtual; abstract;
end;
type
TDerivedForm1= class(TBaseForm)
public
procedure Method1; override;
end;
TDerivedForm2= class(TBaseForm)
public
procedure Method1; override;
end;
procedure TDerivedForm1.Method1;
begin
…
end;
procedure TDerivedForm2.Method1;
begin
…
end;
{Для вызова функции из вашего toolbar, получите активную в настоящий момент форму и вызовите Method1}
procedure OnButtonClick;
var
AForm: TBaseForm;
begin
AForm := ActiveForm as TBaseForm;
AForm.Method1;
end
Указатель на функцию II
Delphi 1
Что лично я использую, чтобы вызвать какую-то функцию из DLL:
1. Объявите тип:
type TYourDLLFunc = function(Parm1: TParm1; Parm2: TParm2): TParm3;
2. Объявите переменную этого типа:
var YourDllFunc: TYourDLLFunc;
3. Получаем дескриптор DLL:
DLLHandle := LoadLibrary('YourDLL.DLL');
Получаем адрес функции:
@YourDLLFunc := GetProcAddress(DLLHandle, 'YourDLLFuncName');
Для использования функции теперь используйте переменную YourDLLFunc, например:
Parm3 := YourDLLFunc(Parm1, Parm2);
Использование указателей на целое
Delphi 1
Сначала вы должны создать тип:
Type Pinteger: ^Integer;
Var MyPtr: Pinteger;
Мне кажется, что в начале вы использовали плохой пример, имеет смысл использовать 32-битный указатель для 16-битной величины или распределять 10 байт для переменной.
Pascal позволяет вам использовать методы NEW и DISPOSE, которые автоматически распределяют и освобождают правильные размеры блока.
Например,
NEW(MyPtr) = GetMem(MyPtr, Sizeof(MyPtr)).
Возможно, вы захотите подсчитать количество целочесленных переменных. В этом случае ознакомьтесь с возможностями TList. Пока лучше используйте линейный массив (или указатель на первый элемент, чтобы вычислить их количество, достаточно разделить количество занимаемой массивом памяти на количество элементов).
Для полноты, это должно быть:
NEW(MyPtr) = GetMem(MyPtr, SizeOf(MyPtr^));
SizeOf(MyPtr) всегда будет равен 4 байта, как 16-битный указатель.
Если я правильно разобрался в том, что вы хотите (динамический массив целых, количество элеметнов которого может быть известно только во время выполнения приложения), вы можете сделать так:
Type
pIntArr = ^IntArr;
IntArr = Array[1..1000] of Integer;
Var
MyPtr : pIntArr;
Begin
GetMem(MyPtr, 10); { 10 = SizeOf(Integer) * 5 !!}
{ MyPtr[2]:=1; }
<<<< Заполняем массив >>>>
MyPtr[2]^:=1;
FreeMem(MyPtr,10);
End;
Технология похожа на ту, которуя Delphi использует при работе с pchar. Синтаксис очень похож:
type intarray = array[0..20000] of integer;
procedure TForm1.Button1Click(Sender: TObject);
var
xptr: ^IntArray;
begin
GetMem(xptr, 10);