Вверх ↑
Ответов: 4630
Рейтинг: 749
#1: 2014-08-10 13:04:29 ЛС | профиль | цитата
sashaoli писал(а):
но ведь она объявлена в классе THiAsmClass
Ага, не заметил. Это объявление нужно вывести за пределы класса.
sashaoli писал(а):
то она, увидела бы
Да, увидела бы. Но внутреннее представление методов класса в Delphi отличается от обычных процедур и функций: в метод компилятором неявно передается тот самый адрес объекта, к полям которого мы в методе и обращаемся, и который доступен в переменной Self.
Например, если в классе есть метод
TMyClass.TestMethod(Arg1: Integer)
то вот этот вызов
MyObject.TestMethod(123)
компилятором фактически трансформируется примерно в это:
TMyClass.TestMethod(MyObject, 123)
Типа, TMyClass.TestMethod - это название обычной процедуры, описанной в секции implementation. А работать она должна с полями объекта, который мы ей передаём.
Эта методика применяется только в Delphi. В других языках это может быть реализовано по-другому. Поэтому в API не могут зашить работу только с Delphi, разрешив тебе указывать в качестве callback метод класса THiAsmClass.ProgressCallback. А вот глобальная функция, дополнительно подкрепленная ключевым словом stdcall, имеет вполне конкретную внутреннюю реализацию и будет работать с любым языком, который поддерживает соглашение stdcall.
карма: 26

0