powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Зачем нужен конструстор Exception.CreateRes() ?
12 сообщений из 12, страница 1 из 1
Зачем нужен конструстор Exception.CreateRes() ?
    #39671517
guest-user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть ключевое слово resourcestring.

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

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

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

Код: pascal
1.
2.
resourcestring
  SMyMessage = 'My message';



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

Код: pascal
1.
raise Exception.CreateRes(@SMyMessage);



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

Код: pascal
1.
raise Exception.Create(SMyMessage);



Поясните, пожалуйста, разницу.
...
Рейтинг: 0 / 0
Зачем нужен конструстор Exception.CreateRes() ?
    #39671522
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RTFM STRINGTABLE resources
...
Рейтинг: 0 / 0
Зачем нужен конструстор Exception.CreateRes() ?
    #39671545
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest-user,

При использовании второго варианта компилятор создаёт неявную строковую переменную. Строки являются типами с управляемым временем жизни, поэтому в пролог функции/процедуры будет добавлен код для очистки этой переменной, который будет отрабатывать вне зависимости от того использовалась переменная или нет. При использовании первого варианта в метод передаётся только указатель на структуру описывающую ресурсную строку и пролог вызывающей функции остаётся чистым.
...
Рейтинг: 0 / 0
Зачем нужен конструстор Exception.CreateRes() ?
    #39671548
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeyпролог
Эпилог, разумеется.
...
Рейтинг: 0 / 0
Зачем нужен конструстор Exception.CreateRes() ?
    #39671566
guest-user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schiRTFM STRINGTABLE resources

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

Kazantsev AlexeyПри использовании второго варианта компилятор создаёт неявную строковую переменную...
Спасибо, это уже что-то... То есть дело в оптимизаци?

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

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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:

Код: pascal
1.
2.
3.
4.
procedure TStream.ReadNotImplemented;
begin
  raise EStreamError.CreateFmt(SStreamNoReading, [ClassName]) at get_caller_addr(get_frame), get_caller_frame(get_frame);
end;




Так как лучше?
Нужно просто иметь возможность локализовать сообщения ИС моего модуля.
Если дело только в оптимизации - то наверное лучше - Create, а не CreateRes?
...
Рейтинг: 0 / 0
Зачем нужен конструстор Exception.CreateRes() ?
    #39671570
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest-userПоясните, пожалуйста, разницу.

Ты не поверишь, но DLL с ресурсами не обязаны быть собраны дельфями и генерироваться из
resourcestring.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зачем нужен конструстор Exception.CreateRes() ?
    #39671573
guest-user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest-user...Нужно просто иметь возможность локализовать сообщения ИС моего модуля.


Именно штатными(стандартными) средствами инструмента разработки.
...
Рейтинг: 0 / 0
Зачем нужен конструстор Exception.CreateRes() ?
    #39671578
guest-user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovТы не поверишь, но DLL с ресурсами не обязаны быть собраны дельфями и генерироваться из
resourcestring.


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

guest-userесли использовать эту самую STRINGTABLE "ручками", то может этот конструктор CreateRes и будет полезен, но если используешь resourcestring, то тогда-то зачем?
...
Рейтинг: 0 / 0
Зачем нужен конструстор Exception.CreateRes() ?
    #39671581
guest-user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще по поводу оптимизации, вот нашел такой старенький пост 2002 года...
...
Рейтинг: 0 / 0
Зачем нужен конструстор Exception.CreateRes() ?
    #39671582
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest-userСпасибо, я об этом же и говорю:

Нет, в сабже написан вопрос "назачем его вообще сделали?"
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зачем нужен конструстор Exception.CreateRes() ?
    #39671589
guest-user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок, спасибо всем участникам топика.

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

Конструктор Exception.CreateRes() нужен для custom-доступа к STRINGTABLE, а в случае с resourcestring возможно(?) более оптимален с точки зрения создания и использования неявных строковых переменных.
...
Рейтинг: 0 / 0
Зачем нужен конструстор Exception.CreateRes() ?
    #39671613
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest-userСпасибо, это уже что-то... То есть дело в оптимизаци?
В том числе, там где это требуется.

guest-userв Delphi встречаются оба варианта
В Delphi ещё и не такое встречается.

guest-userа в Lazarus, CreateRes я вообще не нашел только CreateFmt
В FPC долгое время ресурсов, как отдельно хранящейся сущности, вообще не существовало, да и сейчас их поддержка находится на начальном уровне. Например, вот функция LoadResString из транка:
Код: pascal
1.
2.
3.
4.
Function LoadResString(p:PResStringRec):AnsiString;
begin
  Result:=p^;
end;


то есть, PResStringRec в FPC есть ни что иное, как указатель на константную строку, т.е. сами ресурсные строки - суть обычные константы. В такой ситуации нет нужды думать об оптимизациях :)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Зачем нужен конструстор Exception.CreateRes() ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]