Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Зачем нужен конструстор Exception.CreateRes() ?  [new]
guest-user
Guest
Есть ключевое слово resourcestring.

...эти строковые константы размещаются не в сегменте данных программы, а в ресурсах, и подгружаются оттуда по мере необходимости. Каждая такая константа воспринимается и обрабатывается как обычная строка. Но за каждой из них на самом деле стоит структура PResStringRec... (с)


...компилятор заменяет строковую константу на вызов LoadResSring для загрузки ресурса во время выполнения программы... (с)


Вот в связи с этим и собственно вопрос темы:

resourcestring
  SMyMessage = 'My message';


Зачем делать так:

raise Exception.CreateRes(@SMyMessage);


Если можно делать так:

raise Exception.Create(SMyMessage);


Поясните, пожалуйста, разницу.
9 июл 18, 11:45    [21555528]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен конструстор Exception.CreateRes() ?  [new]
schi
Member

Откуда: Москва
Сообщений: 2601
RTFM STRINGTABLE resources
9 июл 18, 11:53    [21555567]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен конструстор Exception.CreateRes() ?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3065
guest-user,

При использовании второго варианта компилятор создаёт неявную строковую переменную. Строки являются типами с управляемым временем жизни, поэтому в пролог функции/процедуры будет добавлен код для очистки этой переменной, который будет отрабатывать вне зависимости от того использовалась переменная или нет. При использовании первого варианта в метод передаётся только указатель на структуру описывающую ресурсную строку и пролог вызывающей функции остаётся чистым.
9 июл 18, 12:25    [21555706]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен конструстор Exception.CreateRes() ?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3065
Kazantsev Alexey
пролог

Эпилог, разумеется.
9 июл 18, 12:30    [21555736]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен конструстор Exception.CreateRes() ?  [new]
guest-user
Guest
schi
RTFM STRINGTABLE resources


Читал, конечно и MSDN, и community.embarcadero, и еще вот такой материал.
Ну если использовать эту самую STRINGTABLE "ручками", то может этот конструктор CreateRes и будет полезен, но если используешь resourcestring, то тогда-то зачем?

Kazantsev Alexey
При использовании второго варианта компилятор создаёт неявную строковую переменную...

Спасибо, это уже что-то... То есть дело в оптимизаци?

Но вот какое дело, если посмотреть, например, код класса TStream (модуль Classes.pas) в Delphi и в Lazarus, то:

в Delphi встречаются оба варианта:

procedure TStream.ReadBuffer(var Buffer; Count: Longint);
var
  LTotalCount,
  LReadCount: Longint;
begin
   ...
    { Check if we read something and decrease the number of bytes left to read }
    if LReadCount <= 0 then
      raise EReadError.CreateRes(@SReadError)
    ...
end;

procedure TStream.ReadBufferData(var Buffer: Boolean);
begin
  if ReadData(Buffer) <> SizeOf(Boolean) then
    raise EReadError.Create(SReadError);
end;


а в Lazarus, CreateRes я вообще не нашел только CreateFmt:

procedure TStream.ReadNotImplemented;
begin
  raise EStreamError.CreateFmt(SStreamNoReading, [ClassName]) at get_caller_addr(get_frame), get_caller_frame(get_frame);
end;



Так как лучше?
Нужно просто иметь возможность локализовать сообщения ИС моего модуля.
Если дело только в оптимизации - то наверное лучше - Create, а не CreateRes?
9 июл 18, 13:03    [21555898]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен конструстор Exception.CreateRes() ?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46085

guest-user
Поясните, пожалуйста, разницу.

Ты не поверишь, но DLL с ресурсами не обязаны быть собраны дельфями и генерироваться из
resourcestring.

Posted via ActualForum NNTP Server 1.5

9 июл 18, 13:06    [21555916]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен конструстор Exception.CreateRes() ?  [new]
guest-user
Guest
guest-user
...Нужно просто иметь возможность локализовать сообщения ИС моего модуля.


Именно штатными(стандартными) средствами инструмента разработки.
9 июл 18, 13:08    [21555922]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен конструстор Exception.CreateRes() ?  [new]
guest-user
Guest
Dimitry Sibiryakov
Ты не поверишь, но DLL с ресурсами не обязаны быть собраны дельфями и генерироваться из
resourcestring.


Спасибо, я об этом же и говорю:

guest-user
если использовать эту самую STRINGTABLE "ручками", то может этот конструктор CreateRes и будет полезен, но если используешь resourcestring, то тогда-то зачем?
9 июл 18, 13:12    [21555948]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен конструстор Exception.CreateRes() ?  [new]
guest-user
Guest
И еще по поводу оптимизации, вот нашел такой старенький пост 2002 года...
9 июл 18, 13:18    [21555970]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен конструстор Exception.CreateRes() ?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46085

guest-user
Спасибо, я об этом же и говорю:

Нет, в сабже написан вопрос "назачем его вообще сделали?"

Posted via ActualForum NNTP Server 1.5

9 июл 18, 13:19    [21555972]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен конструстор Exception.CreateRes() ?  [new]
guest-user
Guest
Ок, спасибо всем участникам топика.

Можно резюмировать:

Конструктор Exception.CreateRes() нужен для custom-доступа к STRINGTABLE, а в случае с resourcestring возможно(?) более оптимален с точки зрения создания и использования неявных строковых переменных.
9 июл 18, 13:32    [21556032]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен конструстор Exception.CreateRes() ?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3065
guest-user
Спасибо, это уже что-то... То есть дело в оптимизаци?

В том числе, там где это требуется.

guest-user
в Delphi встречаются оба варианта

В Delphi ещё и не такое встречается.

guest-user
а в Lazarus, CreateRes я вообще не нашел только CreateFmt

В FPC долгое время ресурсов, как отдельно хранящейся сущности, вообще не существовало, да и сейчас их поддержка находится на начальном уровне. Например, вот функция LoadResString из транка:
Function LoadResString(p:PResStringRec):AnsiString;
begin
  Result:=p^;
end;

то есть, PResStringRec в FPC есть ни что иное, как указатель на константную строку, т.е. сами ресурсные строки - суть обычные константы. В такой ситуации нет нужды думать об оптимизациях :)
9 июл 18, 14:03    [21556172]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить