На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Как отличить метод от метода класса?
    Всех приветствую!

    ExpandedWrap disabled
      type
        TObjectProc = procedure of object;
       
        TMyObject = class
          procedure SimpleMethod;
          class procedure ClassMethod;
        end;
       
      procedure Test(Proc: TObjectProc);
      var Obj: TObject;
      begin
        if Proc is ОбычныйМетод then  // как это сделать?!
        begin
          Obj := TObject(TMethod(Proc).Data);
          // ...
        end;
        else //...
      end;
       
      procedure TMyObject.SimpleMethod;
      begin
        // ...
      end;
       
      class procedure TMyObject.ClassMethod;
      begin
        // ...
      end;
       
      begin
        with TMyObject.Create do
        begin
          Test(SimpleMethod);  // и так можно
          Free;
        end;
        Test(TMyObject.ClassMethod);  // и так тоже
      end.

    Процедуре Test можно передать как обычный метод (procedure TMyClass.SimpleMethod), так и метод класса (class procedure TMyClass.ClassMethod). В первом случае в качестве доп. параметра передаётся указатель на объект (условно, PObject), а во втором – указатель на класс (условно, PClass).

    Для обычного метода TMethod(Proc).Data будет указывать на указатель на класс (т.е. по нулевому смещению будет адрес класса), а для метода класса TMethod(Proc).Data – это и есть указатель на класс, который содержит по нулевому смещению адрес таблицы виртуальных методов.

    Таким образом, непонятно, как определить – обычный метод переда функции Test в параметр Proc или метод класса.
    Может, кто-нибудь знает, как это сделать?

    Хорошо бы ещё найти инфу о внутренней структуре объекта и класса.
    Но если я не ошибаюсь, объект содержит лишь указатель на класс и поля (и больше никакой инфы).
      Нужно проверить, что TMethod(Proc).Data ссылается на образ exe. Если это так, значит Data - это TClass, в противном случае - это TObject
        Цитата jack128 @
        Нужно проверить, что TMethod(Proc).Data ссылается на образ exe. Если это так, значит Data - это TClass, в противном случае - это TObject

        Хитро :))))
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0189 ]   [ 16 queries used ]   [ Generated: 27.04.24, 10:26 GMT ]