Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
FakeMan2016
0 / 0 / 0
Регистрация: 17.07.2016
Сообщений: 75
1

Объявление функции

22.04.2017, 11:25. Просмотров 881. Ответов 2
Метки нет (Все метки)

Смотрел видео урок и увидел странное для себя(!) объявление функции, оно имеет следующий вид:
functionname : function(varname: integer) : integer; stdcall = nil;

что это за объявление такое? зачем оно нужно?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2017, 11:25
Ответы с готовыми решениями:

объявление функции как массива
помогите пожалуйста разобраться, пишу прогу, в которой нужно сформировать...

Подскажите, что за объявление функции такое?
Смотрю текст чужого кода... Подскажите что за объявление функции такое? Где...

Объявление типа
Всем привет! Не могли бы указать на ошибку или предложить альтернативный...

Объявление переменной
Всем доброго времени суток. У меня такой вопрос, можно ли объявить переменную...

Объявление переменных
Здравствуйте. Я создал вторую форму, в коде которой используется переменные из...

2
D1973
Модератор
3564 / 2569 / 1254
Регистрация: 21.01.2014
Сообщений: 10,788
Записей в блоге: 3
Завершенные тесты: 1
22.04.2017, 11:34 2
Лучший ответ Сообщение было отмечено FakeMan2016 как решение

Решение

https://ru.wikipedia.org/wiki/Соглашение_о_вызове
или
https://rsdn.org/article/Delphi/Delphi_7_05.xml (пункт 5.2.3)
Такое соглашение обычно используется при вызове функций из библиотек, написанных на других языках (например, С)
1
GoodWeather
142 / 141 / 59
Регистрация: 28.02.2017
Сообщений: 858
22.04.2017, 17:49 3
хах) Сначала вообще не въехал чего это такое...

stdcall = nil ??
functionname : function ??

А потом дошло) Это не "объявление функции", это объявление переменной-указателя на функцию. Чего же вы var-то не написали?)

Delphi
1
var MyFunction: function(Value: Integer): Integer; stdcall = nil;
MyFunction - это имя переменной.
= nil - это начальная инициализация переменной, в данном случае как пустой указатель.

Добавлено через 4 минуты
Цитата Сообщение от FakeMan2016 Посмотреть сообщение
зачем оно нужно?
Для лёгкого переключения вызываемых функций на лету, рантайм.
Все события именно так сделаны. Тока там не простая функция, а метод класса.

Добавлено через 4 минуты
А вот инициализировать как nil это не особо хорошая идея, если где-то попытаются вызвать MyFunction до того как ей зададут корректное значение словишь AV.

Добавлено через 39 минут
Набросал небольшой базовый пример:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function TestA(Value: Integer): Integer; stdcall; // это наша функция №1 с фиксированным конкретным заголовком;
begin
ShowMessage('I am Test A !'#13#10'[ '+IntToStr(Value)+' ]');
end;
 
function TestB(Value: Integer): Integer; stdcall; // это наша функция №2 с таким же фиксированным конкретным заголовком;
begin
ShowMessage('I am Test B !!!'#13#10'[ '+IntToStr(Value)+' ]');
end;
 
var
    CurrentTest: function(Value: Integer): Integer; stdcall = nil; // это переменная-указатель на функцию с тем самым фиксированным конкретным заголовком; инициализирована как nil (пустой указатель);
    PointerA: function(Value: Integer): Integer; stdcall = TestA; // ещё одна такая же переменная-указатель; инициализирована как указатель на нашу функцию №1;
 
const
    PointerB: function(Value: Integer): Integer; stdcall = TestB; // ещё один такой же указатель, только как не переменная - а константа, по идее чтоб её значение никто не мог случайно испортить - правда походу с этим какой-то баг и константа чего-то не константа; инициализирована как указатель на нашу функцию №2;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage('@CurrentTest == #'+IntToHex(Integer(@CurrentTest), 8)); // покажем текущее значение указателя CurrentTest;
// CurrentTest(10); // так можно вызвать функцию по указателю, но мы же изначально инициализировали CurrentTest как nil - так что попытка вызвать её сейчас приведёт к AV;
if Assigned(CurrentTest) then CurrentTest(10); // Assigned проверит "а не равно ли оно nil", как бы безопасный способ, именно так события работают;
 
CurrentTest:=TestA; // можем присвоить указателю CurrentTest какую-то функцию; перед функцией вовсе не требуется (хотя можно) писать @, и после неё нельзя ставить скобки;
ShowMessage('@CurrentTest == #'+IntToHex(Integer(@CurrentTest), 8)); // покажем текущее значение указателя CurrentTest;
CurrentTest(330); // вызовем функцию по указателю;
 
CurrentTest:=PointerB; // можем присвоить указателю CurrentTest значение другого аналогичного по смыслу указателя; также вовсе не требуется (хотя можно) писать @, и тоже нельзя ставить скобки;
ShowMessage('@CurrentTest == #'+IntToHex(Integer(@CurrentTest), 8)); // покажем текущее значение указателя CurrentTest;
CurrentTest(666); // вызовем функцию по указателю;
end;
Добавлено через 2 минуты
Также следует заметить что можно было объявить свой тип данных:
Delphi
1
2
type
    TTestFunction = function(Value: Integer): Integer; stdcall;
и объявлять переменные/константы вот так:
Delphi
1
2
3
4
5
6
var
    CurrentTest: TTestFunction = nil;
    PointerA: TTestFunction = TestA;
 
const
    PointerB: TTestFunction = TestB;
Добавлено через 2 минуты

Не по теме:

Чего же блин константа-то словно как не константа получается... Меняй как хочешь, Делфи и не пикнет... =/

1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2017, 17:49

Объявление StringGrid
Пишу программу, но когда использую StringGrid в Delphi 7, то компилятор выводит...

Объявление нового типа
Добрый день! У меня в основном юните используется специальный тип данных:...

Классы. Объявление класса
Разработать программу в соответствии с заданием как консольное приложение в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru