Чтение онлайн

на главную - закладки

Жанры

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

 @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. Синтаксис очень похож:

Поделиться:
Популярные книги

Энфис 6

Кронос Александр
6. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 6

Сердце Дракона. Предпоследний том. Часть 1

Клеванский Кирилл Сергеевич
Сердце дракона
Фантастика:
фэнтези
5.00
рейтинг книги
Сердце Дракона. Предпоследний том. Часть 1

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Под маской, или Страшилка в академии магии

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.78
рейтинг книги
Под маской, или Страшилка в академии магии

Мой любимый (не) медведь

Юнина Наталья
Любовные романы:
современные любовные романы
7.90
рейтинг книги
Мой любимый (не) медведь

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Играть, чтобы жить. Книга 3. Долг

Рус Дмитрий
3. Играть, чтобы жить
Фантастика:
фэнтези
киберпанк
рпг
9.36
рейтинг книги
Играть, чтобы жить. Книга 3. Долг

Виконт. Книга 4. Колонист

Юллем Евгений
Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.50
рейтинг книги
Виконт. Книга 4. Колонист

Вечный Данж. Трилогия

Матисов Павел
Фантастика:
фэнтези
юмористическая фантастика
6.77
рейтинг книги
Вечный Данж. Трилогия

Мужчина не моей мечты

Ардова Алиса
1. Мужчина не моей мечты
Любовные романы:
любовно-фантастические романы
8.30
рейтинг книги
Мужчина не моей мечты

Последний Паладин. Том 7

Саваровский Роман
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 7

Истинная со скидкой для дракона

Жарова Анита
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Истинная со скидкой для дракона

Волк 7: Лихие 90-е

Киров Никита
7. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Волк 7: Лихие 90-е

Кровь Василиска

Тайниковский
1. Кровь Василиска
Фантастика:
фэнтези
попаданцы
аниме
4.25
рейтинг книги
Кровь Василиска