Альтернатива класса 'Типа'.NET в Delphi

Код, взятый из этой ссылки , не замораживает комп. Но это работает только на ff.

/**
 * Netscape compatible WaitForDelay function.
 * You can use it as an alternative to Thread.Sleep() in any major programming language
 * that support it while JavaScript it self doesn't have any built-in function to do such a thing.
 * parameters:
 * (Number) delay in millisecond
 */
function nsWaitForDelay(delay) {
    /**
     * Just uncomment this code if you're building an extention for Firefox.
     * Since FF3, we'll have to ask for user permission to execute XPCOM objects.
     */
    netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");

    // Get the current thread.
    var thread = Components.classes["@mozilla.org/thread-manager;1"].getService(Components.interfaces.nsIThreadManager).currentThread;

    // Create an inner property to be used later as a notifier.
    this.delayed = true;

    /* Call JavaScript setTimeout function
      * to execute this.delayed = false
      * after it finish.
      */
    setTimeout("this.delayed = false;", delay);

    /**
     * Keep looping until this.delayed = false
     */
    while (this.delayed) {
        /**
         * This code will not freeze your browser as it's documented in here:
         * https://developer.mozilla.org/en/Code_snippets/Threads#Waiting_for_a_background_task_to_complete
         */
        thread.processNextEvent(true);
    }
}

5
задан gabr 23 June 2009 в 12:13
поделиться

2 ответа

Для интерфейсов вы захотите использовать указатель PTypeInfo, который возвращается волшебной функцией компилятора TypeInfo. PTypeInfo объявляется в модуле TypInfo.

type
  TInterfaceDictionary = TObjectDictionary<PTypeInfo, TObject>;
var
  d: TInterfaceDictionary;
  myObject: TSomeImplementation;
begin
  d := TInterfaceDictionary.Create([doOwnsValues]);
  d.Add(TypeInfo(ISomeInterface), TSomeImplementation.Create());
  myObject = d[TypeInfo(ISomeInterface)];
end;

Конечно, если бы это были классы, а не интерфейсы, вы могли бы просто использовать ссылку TClass.

9
ответ дан 18 December 2019 в 12:01
поделиться

Если это на самом деле TInterfaceDictionary, вы можете написать его так:

type
  TInterfaceDictionary = TObjectDictionary<TGUID, TObject>;

Очевидно, это требует GUID для каждого используемого интерфейса.

Из-за некоторой магии компилятора вы можете использовать его довольно просто:

  d.Add(ISomeInterface, TSomeImplementation.Create());

(Мейсон: извините за взлом примера кода)

6
ответ дан 18 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: