На главную Наши проекты:
Журнал   ·   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_
  
> class procedure , исключение?
    Почему происходит исключение при вызове class procedure, если я вызываю её не через класс TSomeClass.ClassProc, а через объект var SomeObj: TSomeClass; ...; SomeObj.ClassProc, когда Obj = nil.
    Разве такие методы не должны работать даже без создания объекта?
      Цитата Jin X @
      Разве такие методы не должны работать даже без создания объекта?

      Классовые методы работают при любом вызове, но ес-но при условии, что в них нет явного или неявного обращения к экземпляру объекта (его полям, свойствам и неклассовым методам).
      В классовом методе Self является ссылкой на класс объекта (его VMT) , а не на сам объект. Из ссылки на объект всегда можно получить ссылку на его класс, а наоборот, разумеется, нельзя.

      PS: Если метод объекта не содержит ссылок на Self, то его можно вызвать через Obj = nil. Например, если в обработчике типа TForm1.FormKeyPress осуществляются манипуляции только с переданными параметрами Key и Sender без обращения к Self, то этот метод можно безопасно вызвать или присвоить событие другому объекту через TForm1(nil).FormKeyPress. Подобные фишки можно использовать для присвоения событий объектам без создания экземпляра объекта, которому принадлежат методы обработки событий.
        leo, так прикол в том, что исключение возникает даже тогда, когда в методе нет никакого обращения.
        Т.е.:
        ExpandedWrap disabled
          type
            TSomeClass = class
              class procedure ClassProc
            end;
           
          class procedure TSomeClass.ClassProc;
          begin
          end;
           
          var SomeObj: TSomeClass;
          begin
            SomeObj.ClassProc
          end.
          Цитата Jin X @
          так прикол в том, что исключение возникает даже тогда, когда в методе нет никакого обращения

          1.как уже сказано, self классового метода - указатель на vmt
          2.компилятор пытается его получить читая скрытое поле объекта
          3.объект не создан
          4.в SomeObj мусор, либо nil
          5. ?

          пиши так:
          ExpandedWrap disabled
            type
              TSomeClass = class
                class procedure ClassProc; static;
              end;

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


          Рейтинг@Mail.ru
          [ Script execution time: 0,0192 ]   [ 15 queries used ]   [ Generated: 18.05.24, 14:16 GMT ]