Delphi 5, русские буквы.
там сильно пофиксили большинство проблем с юникодными строками и подобного не наблюдается. везде стоит DEFAULT_CHARSET, в этом случае она берёт настройки из системы.
Если принципиально D5, можно при создании форм задавать кодовую страницу кодом. При чём, если у многих элементов ParentFont = False, то несложно написать процедуру, которая будет бегать по всему дереву контроллов и править charset у шрифта.
Меня больше интересует причина, по которой DEFAULT_CHARSET оказывается неправильным, может я что-то дико не так делаю? Или дельфя может сама глючить?
И где бы всё-таки почитать про глубокий смысл остальных вариантов — ANSI и OEM?
И это, там например MS Sans Serif, а сейчас сама винда по дефолту использует для всего Microsoft Sans Serif, может, в этом дело?
Я просто надеялся, что кто-нибудь с этой проблемой сталкивался.
(нет, Базилио, мне хотелось бы завтра с утра проблему за полчасика пофиксить, поэтому портировать здоровущую прогу на D7 как-то не получится!
И где бы всё-таки почитать про глубокий смысл остальных вариантов — ANSI и OEM?по идее:
OEM - это dos-овская кодировка
ANSI - это однобайтовая windows-кодировка
Ну, этот код же нужно тоже откуда-то брать...
typeЕсли в 5ке нет функции Graphics.GetDefFontCharSet, то вот она:
TAccessControl = class(TControl)
end;
procedure WalkControl(C: TAccessControl; charset: TFontCharset);
var i: integer;
Begin
if not C.ParentFont
then C.Font.Charset:=charset;
//тут можно обработать контролы, у которых несколько шрифтов
if TControl(C) is TWinControl
then with TWinControl(C) do
for i:=0 to ControlCount-1 do
WalkControl(TAccessControl(Controls[i] charset);
End;
procedure AjustFontCharset(C: TControl);
Begin
WalkControl(TAccessControl(C GetDefFontCharSet);
End;
function GetDefFontCharSet: TFontCharSet;
var
DisplayDC: HDC;
TxtMetric: TTEXTMETRIC;
begin
Result := DEFAULT_CHARSET;
DisplayDC := GetDC(0);
if (DisplayDC <> 0) then
begin
if (SelectObject(DisplayDC, StockFont) <> 0) then
if (GetTextMetrics(DisplayDC, TxtMetric then
Result := TxtMetric.tmCharSet;
ReleaseDC(0, DisplayDC);
end;
end;
Сохраняются потом в XML-ку, что характерно, правильно.а вот копипастится в буфер будут неправильно, если включена английская раскладка.
(нет, Базилио, мне хотелось бы завтра с утра проблему за полчасика пофиксить, поэтому портировать здоровущую прогу на D7 как-то не получится!Там ничего сложного, если знать что на что менять. У меня больше проблем возникло с запуском проекта от 2006ой под 2009.
Я просто надеялся, что кто-нибудь с этой проблемой сталкивался.Сталкивался. Лечилось не так как у Базилио, а по-другому:
а) пинанием юзверей, чтоб переключили системные шрифты (панель управления - экран - оформление - дополнительно) (те машины, на которых умляты/прямоугольнички - там с трутайпа на старые шрифты, было сменено оформление)
б) выпуском патча, где была допилена VCL таким образом, чтобы она не брала шрифты из системы
а вот копипастится в буфер будут неправильно, если включена английская раскладка.\
С чего бы?
Короче, сегодня поставил ряд интересных экспериментов, воспроизвожу по памяти:
У меня:
MS Sans Serif, DEFAULT_CHARSET - ОК
MS Sans Serif, ANSI_CHARSET - ОК
Microsoft Sans Serif, DEFAULT_CHARSET - ОК
Microsoft Sans Serif, ANSI_CHARSET - Латинская хуита.
Courier New, DEFAULT_CHARSET - ОК
Courier New, ANSI_CHARSET - Латинская хуита.
У девушки из Белоруссии:
MS Sans Serif, DEFAULT_CHARSET - Латинская хуита
MS Sans Serif, ANSI_CHARSET - ОК
Microsoft Sans Serif, DEFAULT_CHARSET - ОК
Microsoft Sans Serif, ANSI_CHARSET - ОК.
Courier New, DEFAULT_CHARSET - ОК
Courier New, ANSI_CHARSET - ОК.
По-моему, дико смешно. Поглядев на богатство альтернатив остановил свой выбор на "Microsoft Sans Serif, DEFAULT_CHARSET", вроде, работает. Заодно сглаживается.
С чего бы?Это стандартная байда всех неюникодных форточных приложений. Попробуй иде открыть, набрать там по-русски что-нибудь, переключись в английскую раскладку, скопируй, вставь в другое приложение и увидишь умляты.
Заодно сглаживается.Сглаживается (клиртайп) оно только если галка стоит. В ХРюше по дефолту галки нет. Или ты про трутайп (кто-то ещё пользуется растровыми шрифтами о.О)?
Это стандартная байда всех неюникодных форточных приложений.не для всех, но для большинства
Оставить комментарий
bleyman
На некоторых машинах вместо них отображаются соответствующие буквы из латинской кодовой страницы.То есть прямо вводишь текст в русской раскладке, а рисуются буковки с умляутами. Сохраняются потом в XML-ку, что характерно, правильно. И, кстати, MessageDlg тоже правильный.
Я так понимаю, дело в шрифтах. Где глючит, там вот так:
Font.Charset = DEFAULT_CHARSET
Font.Name = 'MS Sans Serif'
Ещё в программе есть одно место, где не глючит, там вот так:
Font.Charset = RUSSIAN_CHARSET
Font.Name = 'Courier New'
Дело только в чарсете? Если да, то каким тогда его ставить, мне бы как бы хотелось чтобы зависело от настроек машины (например, что у неё указано в default language for non-unicode programs то есть захардкоживать кириллицу не хотелось бы. И что тогда ставить — ANSI? OEM?
Или чарсет ещё загадочным образом комбинируется с фонтом, и там у винды может вдруг не быть MS Sans Serif или в нём может не быть русских буковок, или ещё что-то, и поэтому глупая дельфя выбирает не то? И как тогда опять же попросить какой-нибудь фонт, который везде есть? А то и вообще, системный — но не будет ли у меня потом болеть голова от того, что у чуваков с повышенным размером фонтов надписи обрезаются?