Delphi 5, русские буквы.

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 или в нём может не быть русских буковок, или ещё что-то, и поэтому глупая дельфя выбирает не то? И как тогда опять же попросить какой-нибудь фонт, который везде есть? А то и вообще, системный — но не будет ли у меня потом болеть голова от того, что у чуваков с повышенным размером фонтов надписи обрезаются?

yolki

есть ли сильные препятствия против портирования на семёрку?
там сильно пофиксили большинство проблем с юникодными строками и подобного не наблюдается. везде стоит DEFAULT_CHARSET, в этом случае она берёт настройки из системы.

Andbar

Если принципиально D5, можно при создании форм задавать кодовую страницу кодом. При чём, если у многих элементов ParentFont = False, то несложно написать процедуру, которая будет бегать по всему дереву контроллов и править charset у шрифта.

bleyman

Ну, этот код же нужно тоже откуда-то брать...
Меня больше интересует причина, по которой DEFAULT_CHARSET оказывается неправильным, может я что-то дико не так делаю? Или дельфя может сама глючить?
И где бы всё-таки почитать про глубокий смысл остальных вариантов — ANSI и OEM?
И это, там например MS Sans Serif, а сейчас сама винда по дефолту использует для всего Microsoft Sans Serif, может, в этом дело?
Я просто надеялся, что кто-нибудь с этой проблемой сталкивался.
(нет, Базилио, мне хотелось бы завтра с утра проблему за полчасика пофиксить, поэтому портировать здоровущую прогу на D7 как-то не получится!

Dasar

И где бы всё-таки почитать про глубокий смысл остальных вариантов — ANSI и OEM?
по идее:
OEM - это dos-овская кодировка
ANSI - это однобайтовая windows-кодировка

Andbar

Ну, этот код же нужно тоже откуда-то брать...
type
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;
Если в 5ке нет функции Graphics.GetDefFontCharSet, то вот она:
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;

kill-still

Сохраняются потом в XML-ку, что характерно, правильно.
а вот копипастится в буфер будут неправильно, если включена английская раскладка.

kill-still

(нет, Базилио, мне хотелось бы завтра с утра проблему за полчасика пофиксить, поэтому портировать здоровущую прогу на D7 как-то не получится!
Там ничего сложного, если знать что на что менять. У меня больше проблем возникло с запуском проекта от 2006ой под 2009.

kill-still

Я просто надеялся, что кто-нибудь с этой проблемой сталкивался.
Сталкивался. Лечилось не так как у Базилио, а по-другому:
а) пинанием юзверей, чтоб переключили системные шрифты (панель управления - экран - оформление - дополнительно) (те машины, на которых умляты/прямоугольнички - там с трутайпа на старые шрифты, было сменено оформление)
б) выпуском патча, где была допилена VCL таким образом, чтобы она не брала шрифты из системы

bleyman

а вот копипастится в буфер будут неправильно, если включена английская раскладка.
\
С чего бы?
Короче, сегодня поставил ряд интересных экспериментов, воспроизвожу по памяти:
У меня:
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", вроде, работает. Заодно сглаживается.

kill-still

С чего бы?
Это стандартная байда всех неюникодных форточных приложений. Попробуй иде открыть, набрать там по-русски что-нибудь, переключись в английскую раскладку, скопируй, вставь в другое приложение и увидишь умляты.
Заодно сглаживается.
Сглаживается (клиртайп) оно только если галка стоит. В ХРюше по дефолту галки нет. Или ты про трутайп (кто-то ещё пользуется растровыми шрифтами о.О)?

Andbar

Это стандартная байда всех неюникодных форточных приложений.
не для всех, но для большинства
Оставить комментарий
Имя или ник:
Комментарий: