В Delphi 7, почему я могу присвоить значение const?

Вам нужно объявить пространство имен в XSLT и использовать его в выражениях XPath. Например ::

<xsl:stylesheet ... xmlns:my="http://www.mysite.com">

   <xsl:template match="/my:MyRoot"> ... </xsl:template>

</xsl:stylesheet>

Обратите внимание, что вы должны предоставить некоторый префикс, если вы хотите ссылаться на элементы из этого пространства имен в XPath. Хотя вы можете просто сделать xmlns="..." без префикса, и он будет работать для литеральных элементов результата, он не будет работать для XPath - в XPath, неподписанное имя всегда считается в пространстве имен с пустым URI, независимо от xmlns="..." в области.

21
задан Blorgbeard 8 September 2008 в 04:44
поделиться

4 ответа

Необходимо включить присваиваемые типизированные константы. Проект-> Опции-> Компилятор-> Присваиваемые типизированные константы

Также можно добавить {$J+} или {$WRITEABLECONST ON} в файл первенства, который, вероятно, лучше, так как это будет работать даже при перемещении файла в другой проект.

29
ответ дан Ray 8 September 2008 в 04:44
поделиться

Как сказал Барри, люди воспользовались преимуществами; Один из способов, которым это было использовано, был для отслеживания единичных случаев. Если вы посмотрите на классическую реализацию синглтона, вы увидите это:

  // Example implementation of the Singleton pattern.
  TSingleton = class(TObject)
  protected
    constructor CreateInstance; virtual;
    class function AccessInstance(Request: Integer): TSingleton;
  public
    constructor Create; virtual;
    destructor Destroy; override;
    class function Instance: TSingleton;
    class procedure ReleaseInstance;
  end;

constructor TSingleton.Create;
begin
  inherited Create;

  raise Exception.CreateFmt('Access class %s through Instance only', [ClassName]);
end;

constructor TSingleton.CreateInstance;
begin
  inherited Create;

  // Do whatever you would normally place in Create, here.
end;

destructor TSingleton.Destroy;
begin
  // Do normal destruction here

  if AccessInstance(0) = Self then
    AccessInstance(2);

  inherited Destroy;
end;

{$WRITEABLECONST ON}
class function TSingleton.AccessInstance(Request: Integer): TSingleton;
const
  FInstance: TSingleton = nil;
begin
  case Request of
    0 : ;
    1 : if not Assigned(FInstance) then
          FInstance := CreateInstance;
    2 : FInstance := nil;
  else
    raise Exception.CreateFmt('Illegal request %d in AccessInstance', [Request]);
  end;
  Result := FInstance;
end;
{$IFNDEF WRITEABLECONST_ON}
  {$WRITEABLECONST OFF}
{$ENDIF}

class function TSingleton.Instance: TSingleton;
begin
  Result := AccessInstance(1);
end;

class procedure TSingleton.ReleaseInstance;
begin
  AccessInstance(0).Free;
end;
2
ответ дан PatrickvL 8 September 2008 в 04:44
поделиться

Выведенные по типу константы могут быть только скалярными значениями, то есть такими вещами, как целые числа, числа с двойными числами и т. Д. Для этих типов констант компилятор действительно заменяет символ константы значением константы всякий раз, когда он встречает их в выражениях.

Типизированные константы, с другой стороны, могут быть структурированными значениями - массивами и записями. Этим ребятам нужно фактическое хранилище в исполняемом файле, то есть им нужно выделить для них хранилище, чтобы при загрузке ОС ОС значение типизированной константы физически находилось в некотором месте в памяти.

Чтобы объяснить, почему, исторически, типизированные константы в раннем Delphi и его предшественнике, Turbo Pascal, доступны для записи (и, таким образом, по сути инициализировали глобальные переменные), нам нужно вернуться к временам DOS.

DOS работает в реальном режиме в терминах x86. Это означает, что программы имеют прямой доступ к физической памяти без какого-либо MMU , выполняющего виртуально-физические отображения. Когда программы имеют прямой доступ к памяти, защита памяти не действует. Другими словами, если по какому-либо адресу есть память, она доступна как для чтения, так и для записи в реальном режиме.

Таким образом, в программе Turbo Pascal для DOS с типизированной константой, значение которой распределяется по адресу в памяти во время выполнения, эта типизированная константа будет доступна для записи. Нет никакого аппаратного MMU, мешающего и мешающего программе записать в него. Точно так же, поскольку Паскаль не имеет понятия «константности», которое есть в C ++, в системе типов нет ничего, что могло бы вас остановить. Многие люди воспользовались этим, поскольку Turbo Pascal и Delphi в то время еще не инициализировали глобальные переменные как функцию.

Переходя к Windows, существует слой между адресами памяти и физическими адресами: блок управления памятью. Этот чип берет индекс страницы (сдвинутую маску) адреса памяти, к которому вы пытаетесь обратиться, и ищет атрибуты этой страницы в своей таблице страниц . Эти атрибуты включают в себя читаемые, записываемые и для современных чипов x86 неисполняемые флаги. Благодаря этой поддержке можно помечать разделы .EXE или .DLL такими атрибутами, чтобы при загрузке Windows загрузчик выполнил образ в память, он назначал соответствующие атрибуты страниц для страниц памяти, которые отображаются на страницы дисков в этих разделах.

Когда появилась 32-битная версия компилятора Delphi для Windows, имело смысл сделать const-подобные вещи действительно const, поскольку ОС также имеет эту функцию.

27
ответ дан Barry Kelly 8 September 2008 в 04:44
поделиться
  1. , Почему: Поскольку в предыдущих версиях Дельфи типизированные константы были присваиваемыми по умолчанию для сохранения совместимости с более старыми версиями, где они были всегда перезаписываемы (Дельфи 1 до раннего Паскаля).
    значение по умолчанию было теперь изменено для создания констант действительно constant†¦

  2. переключатель Компилятора: {$J +} или {$J-} {$WRITEABLECONST НА} или {$WRITEABLECONST ПРОЧЬ}
    Или в опциях проекта для компилятора: проверьте присваиваемые типизированные константы

  3. , Как это работает: Если компилятор может вычислить значение во время компиляции, это заменяет константу своим значением везде в коде, иначе это содержит указатель на область памяти, содержащую значение, которое может быть сделано writeable или нет.
  4. см. 3.
11
ответ дан Bruce McGee 8 September 2008 в 04:44
поделиться
Другие вопросы по тегам:

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