Последние записи
- Рандомное слайдшоу
- Событие для произвольной области внутри TImage
- Удаление папки с файлами
- Распечатка файла
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
12th
Май
Принудительный вывод Exception на указанном языке
Posted by Chas under Delphi
Всем добрый вечер. Возникла проблема — получать сообщения Exception всегда на одном и том же языке, вне зависимости от региональных настроек системы (например использовать английский)
В интернете под NET было найдено такое решение. Но в Delphi нет ChangeUICulture
Пробовал изменять локаль потока — продолжают выводиться на системном языке
Что еще можно попробовать? (нужно чтобы метод не требовал привилегий администратора)
GunSmoker
.NET — это управляемое окружение, оно изолируется от нижележащей ОС слоем виртуальной машины. Там конечно всё будет под вашим контролем.
Собственно, в системе в большинстве случаев не будет установлен произвольный нужный вам язык (вы получите сообщение на другом, ближайшем доступном, языке).
Но если язык всё же установлен и код, который получает системные сообщения, находится под вашим контролем, то да, вы можете это сделать. Системные сообщения получаются по коду с использованием функции FormatMessage. По умолчанию Delphi передаёт туда 0 (и это поведение изменить нельзя), но вы можете передавать туда любое значение. Например:
function SysErrorMessageLang(ErrorCode: Cardinal; LangID: LANGID): String;
var
Buffer: PChar;
Len: Integer;
begin
Len := FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM or
FORMAT_MESSAGE_IGNORE_INSERTS or
FORMAT_MESSAGE_ARGUMENT_ARRAY or
FORMAT_MESSAGE_ALLOCATE_BUFFER, nil, ErrorCode, LangID, @Buffer, 0, nil);
try
while (Len > 0) and (CharInSet(Buffer[Len - 1], [#0..#32, '.'])) do
Dec(Len);
SetString(Result, Buffer, Len);
finally
LocalFree(HLOCAL(Buffer));
end;
end;
var
Ru, En: String;
begin
Ru := SysErrorMessageLang(ERROR_FILE_NOT_FOUND, MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT));
En := SysErrorMessageLang(ERROR_FILE_NOT_FOUND, MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT));
end;
Альтернативно, можно сменить язык UI, но эта возможность доступна только с XP и выше:
var
LID: LangID;
begin
Ru := SysErrorMessageLang(ERROR_FILE_NOT_FOUND);
LID := MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT);
Win32Check(SetThreadUILanguage(LID) = LID);
En := SysErrorMessageLang(ERROR_FILE_NOT_FOUND);
end;
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)