Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Вниз

Чем отличается const и resourcestring?   Найти похожие ветки 

 
Piter ©   (2004-11-15 18:49) [0]

Вот заметил какую-то особенность. Есть строчка:

btnClose.Caption := BUTTOM_CLOSE;

Если BUTTOM_CLOSE это константа - то в Windows NT с НЕ русской локалью кнопка отображается нормально.
Если же BUTTOM_CLOSE это resourcestring, то при таком присвоении кнопка отображается кракозябрами. Сама кнопка имеет тип TBitBtn. При этом настройки Fotn.Charset установлены в RUSSIAN_CHARSET, но для resourcestring это не спасает.

Чем может быть вызвано такое разное поведение?


 
Игорь Шевченко ©   (2004-11-15 20:49) [1]


> Чем может быть вызвано такое разное поведение?


Тем, что строковые ресурсы тоже имеют свои языковые настройки ?

И преобразование их выполняется на этапе загрузки из ресурса ?

Проведи несложный эксперимент и присвой строковой переменной эту resourcestring, посмотри в отладчике значение.


 
Piter ©   (2004-11-15 21:17) [2]

Игорь Шевченко ©   (15.11.04 20:49) [1]
Тем, что строковые ресурсы тоже имеют свои языковые настройки ?


это как? Вместе со строкой хранится код языка? По-моему, что-то не то...


 
Piter ©   (2004-11-15 21:18) [3]

Игорь Шевченко ©   (15.11.04 20:49) [1]
Проведи несложный эксперимент и присвой строковой переменной эту resourcestring, посмотри в отладчике значение


разве оно не будет равно этой resourcestring?! Не понимаю логики...


 
Игорь Шевченко ©   (2004-11-15 21:26) [4]

Piter ©   (15.11.04 21:17) [2]


> это как? Вместе со строкой хранится код языка? По-моему,
> что-то не то...


Ну так это же по-твоему.
А по Windows"овому немного иначе. RTFM FindResourceEx.


> разве оно не будет равно этой resourcestring?! Не понимаю
> логики...


Миша, тебе поговорить хочется ? :) Или все-таки интересует, почему строки себя так ведут? Во втором случае быстрее провести рекомендованный эксперимент.


 
Cobalt ©   (2004-11-15 21:27) [5]

2 Piter ©   (15.11.04 18:49)
А всё-таки, именно NT? (4.0)
Или имеется в виду Win2K/XP?


 
Игорь Шевченко ©   (2004-11-15 21:45) [6]


STRINGTABLE
 [[optional-statements]]
BEGIN
stringID string
. . .
END


optional-statements
This parameter can be zero or more of the following statements. Statement Description
CHARACTERISTICS dword User-defined information about a resource that can be used by tools that read and write resource files. For more information, see CHARACTERISTICS.

LANGUAGE language, sublanguage Specifies the language for the resource. For more information, see LANGUAGE.

VERSION dword User-defined version number for the resource that can be used by tools that read and write resource files. For more information, see VERSION.


The following example shows how to encode Unicode characters using the L"\xABCD" format:

STRINGTABLE
BEGIN
IDS_CHINESESTRING L"\x5e2e\x52a9"
IDS_RUSSIANSTRING L"\x0421\x043f\x0440\x0430\x0432\x043a\x0430"
IDS_ARABICSTRING L"\x062a\x0639\x0644\x064a\x0645\x0627\x062a"
END
The following example shows strings with both ASCII and Unicode. Note that strings without the initial "L" use the 2-digit escape format ( \xAB ):

STRINGTABLE
BEGIN
IDS_1 L"5\x00BC-Inch Floppy Disk"
IDS_1a "5\xBC-Inch Floppy Disk"
IDS_2 L"Don"t confuse \x2229 (intersection) with \x222A (union)"
IDS_3 "Copyright \xA92001"
IDS_3a L"Copyright \x00a92001"
END
The following example shows how line continuations can be used:

STRINGTABLE
BEGIN
IDS_VERYLONGSTRING "blah blah blah blah blah blah \
blah blah blah blah blah blah \
blah blah blah blah blah blah \
blah blah blah blah blah blah"
END


http://msdn.microsoft.com


 
Piter ©   (2004-11-15 23:22) [7]

Cobalt ©   (15.11.04 21:27) [5]
А всё-таки, именно NT? (4.0)
Или имеется в виду Win2K/XP?


экспериментировал я в w2k/XP
А NT4.0 я только на картинках видел :)

Игорь Шевченко ©   (15.11.04 21:26) [4]
Миша, тебе поговорить хочется ? :)


вообще то да :) Только не просто так, а по интересующей меня теме

провести рекомендованный эксперимент

проблема в том, что я не понимаю как можно провести рекомендованный эксперимент.

Если компилировать под русской локалью - то естественно все ок.
Если же компилировать под НЕ русской локалью - то это тоже не имеет смысла, так как IDE Дельфовое не поддерживает русского и все объявленные константы превращаются в "????".

Проблема наблюдается вот как. Я откомпилировал программу под русской локалью, а используется она под НЕ русской. Вот тогда "баг" и всплывает. Выражается он на присвоении строчки:

BitBnt1.Caption := SomeValue;

Если SomeValue это const то все ок. Если же SomeValue это resourcestring, то заголовок кнопки начинает отображаться кракозябрами. В общем, я это уже писал.

Мне это очень удивительно...


 
Игорь Шевченко ©   (2004-11-15 23:39) [8]

Piter ©   (15.11.04 23:22) [7]

Скомпилируй под русской локалью приложение вида

resourcestring
 MyString = "Я хочу увидеть истину!";

procedure TForm1.ButtonClick (Sender: TObject);
var
 S: string;
begin
 S := MyString;
 ShowMessage("Ресурс содержит:""+S+""");
end;

И запусти его под разными локалями.
Результаты размести в этой ветке.

Я к тому веду, что LoadStringA выполняет преобразование из Unicode (в котором хранятся все строковые ресурсы) в Ansi вызывая функцию RtlUnicodeToMultiByteN, которая преобразует юникод с использованием кодовой страницы по умолчанию.


 
Anatoly Podgoretsky ©   (2004-11-16 00:30) [9]

Тем что ресурсные строки хранятся в Юникод


 
Piter ©   (2004-11-16 00:54) [10]

Игорь Шевченко ©   (15.11.04 23:39) [8]
begin
S := MyString;
ShowMessage("Ресурс содержит:""+S+""");


И что, таки есть надежда, что будут выведены нормальные русские буквы? :)
ShowMessage никогда не покажет русские буквы в НЕ русской локали...

Игорь Шевченко ©   (15.11.04 23:39) [8]
Я к тому веду, что LoadStringA выполняет преобразование из Unicode (в котором хранятся все строковые ресурсы) в Ansi вызывая функцию RtlUnicodeToMultiByteN, которая преобразует юникод с использованием кодовой страницы по умолчанию


теперь понятно все...

А откуда вы знаете, что LoadStringA испоьзует RtlUnicodeToMultiByteN? Да и что вообще за RtlUnicodeToMultiByteN?


 
Piter ©   (2004-11-16 00:55) [11]

Anatoly Podgoretsky ©   (16.11.04 0:30) [9]
Тем что ресурсные строки хранятся в Юникод


уже понял...


 
Игорь Шевченко ©   (2004-11-16 01:01) [12]

Piter ©   (16.11.04 00:54) [10]


> А откуда вы знаете, что LoadStringA испоьзует RtlUnicodeToMultiByteN


Из отладчика.


> Да и что вообще за RtlUnicodeToMultiByteN?


Функция. Описание искать в MSDN или в Google (второе предпочтительней)


> ShowMessage никогда не покажет русские буквы в НЕ русской
> локали...


Проверял ?

Если не поможет, присвой строку S свойству Caption любой кнопки.


 
Игорь Шевченко ©   (2004-11-16 01:11) [13]

Piter ©   (16.11.04 00:54) [10]

А на будущее хочу дать совет: Практика - критерий истины. Тем более, для прояснения истины синхрофазатрон не требуется, достаточно компьютера и отладчика, это вам не физика элементарных частиц, панимаешь.

Если тебе встречается непонятная ситуация в программе, моделируешь ее, используешь отладчик для выяснения поведения, у отладчика есть несколько интересных команд: Add Breakpoint, Run, Step Over, Trace Into, доходишь до интересной тебе функции и идешь внутрь ее. Что user32, что прочие библиотеки отладчику доступны, внутрь их войти всегда можно. Иногда в режиме View|CPU Window. Встретил вызов неизвестной фукнции - ищещь ее в Help, в MSDN, в Google.

И истина перед тобой откроется сама :) Быстро.


 
Anatoly Podgoretsky ©   (2004-11-16 01:15) [14]

Piter ©   (16.11.04 00:55) [11]
ну тогда дополнительно, например перенос формы с компьютера с русской локализацией, на компьютер с другой, портит весьма серьезно все надписи на форме. При исправлении в редакторе, происходит повторная порча при обратной транспортировке. У Борланда эта проблема не решена должным образом. Тоже относится и к ресурсным строкам.


 
Piter ©   (2004-11-16 11:42) [15]

Игорь Шевченко ©   (16.11.04 1:01) [12]
Проверял ?


Да... ведь сообщение в ShowMessage пишется с помощью экземпляра TLabel - а он в НЕ русской локали работает криво, если Font.Charset не установить на RUSSIAN_CHARSET - а в ShowMessage этого никто не делает, естесственно...

Игорь Шевченко ©   (16.11.04 1:11) [13]
Практика - критерий истины


я разве спорил? Я тоже всегда на практике пытаюсь проверить

Игорь Шевченко ©   (16.11.04 1:11) [13]
Если тебе встречается непонятная ситуация в программе, моделируешь ее, используешь отладчик для выяснения поведения, у отладчика есть несколько интересных команд: Add Breakpoint, Run, Step Over, Trace Into


да, насчет таких команд я осведомлен :)
Дело в том, что в данном случае я не знаю как провести эксперимент, ибо чтобы изучать - нужно запускать отладку в НЕ русской локали, но при не русской локали всетеряет смысл, потому что сама Дельфи не способна в такой ситуации работать с кириллицей.

В любом случае, из ваших слов я все понял

Игорь Шевченко ©   (16.11.04 1:01) [12]
Если не поможет, присвой строку S свойству Caption любой кнопки


тоже не получится. Кнопки в НЕ русской локали всегда кракозябрами отображаются (TButton). Корректно может отразиться TBitBtn если Font.Charset задан верно...



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.041 c
1-1100865130
Zilog
2004-11-19 14:52
2004.12.05
исключение "недопустимый дескриптор окна"!?


9-1090243094
Zak3D[@Tm]
2004-07-19 17:18
2004.12.05
Вопрос по игре Xonix.


14-1100367534
Drakon
2004-11-13 20:38
2004.12.05
Послепятничная задача. Повторение - мать учения.


6-1096615076
AlexA
2004-10-01 11:17
2004.12.05
TIdSMTP в теле письма "заменяются" русские буквы


3-1100007034
EMIL
2004-11-09 16:30
2004.12.05
Запуск DTS





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский