Как конвертировать TStringGrid из Delphi 7 в Delphi XE
Просто чтобы проверить, насколько сложно преобразовать мою программу Delphi 7 в Delphi XE 5, я написал простое приложение на Delphi 7 - поместил TStringGrid в форму и добавил код в форму create:
procedure TFMain.FormCreate(Sender: TObject);
begin
With StringGrid1 do
begin
Cells[0,0]:='čęжэ€';
end;
end;
(на самом деле это написано как Cells[0,0]:='ce??€', но я ожидал этого). Скомпилируйте, соберите, запустите, без Unicode, причины. Затем снова открыл проект в Delphi XE 5, снова изменил строку на Cells[0,0]:='čęжэ€', скомпилируйте, соберите, запустите - и без Unicode (получил что-то вроде čę|||)! Это было странно для меня. Новая сборка проекта с нуля на Delphi Xe 5 с тем же кодом, тот же TStringGrid работает как положено. Я знаю, здесь есть какой-то простой трюк, может быть, некоторые изменения в настройках проекта, но я не могу это погуглить... Может, кто-то может помочь?
С наилучшими пожеланиями.
2 ответа
По умолчанию в Delphi 7 используется шрифт MS Sans Serif. Когда вы используете этот шрифт в Unicode Delphi, появляется элемент управления строкой сетки, который отображает этот шрифт неправильно. Многие другие элементы управления будут правильно рисовать ваш текст в этом шрифте. Но по какой-то причине элемент управления строкой не может это сделать.
Когда вы обновляете старый проект до XE5, вы наследуете этот Delphi 7 по умолчанию. Я думаю, что когда вы создаете новый проект в XE5, по умолчанию используется другой шрифт, Tahoma, и рисование сетки строк правильно отображает вашу кириллицу в этом шрифте.
Вы можете обойти эту проблему, используя другой шрифт, такой как Tahoma или Segoe UI. Вы точно не хотите использовать MS Sans Serif в любом случае. Представление списка в стиле представления отчета было бы другим хорошим вариантом. Не в последнюю очередь потому, что это родная платформа управления.
Я должен признать, что я действительно не понимаю, почему элемент управления сетки строк не ведет себя лучше. Было бы здорово, если бы кто-то еще мог пролить свет на это.
Как упоминает Дэвид, проблема заключается в шрифте, используемом в вашей сетке строк. Однако не совсем точно говорить, что в Delphi по умолчанию используется шрифт MS Sans Serif. Раньше это был MS Sans Serif, но был изменен (в Delphi 2006) на Tahoma.
Вы можете увидеть, как конкретная версия Delphi выбирает шрифт по умолчанию, проверив источник графического блока в RTL-источнике этой конкретной версии Delphi (поскольку среда IDE создается с использованием этого кода). В частности, процедура InitDefFontData (и, в более старых версиях Delphi, запись DefFontData).
Начиная с (как минимум) Delphi XE4 шрифт Tahoma по умолчанию будет заменен любым параметром для замены шрифта на значение, обозначенное как MS Shell Dlg 2, как установлено в реестре:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes\
NB. Из проверки кода в XE4 возможно, что если этот ключ не существует или недоступен, или если нет записи замены для шрифта MS Shell Dlg 2, то все еще будет использоваться MS Sans Serif. Трудно сказать, так как это поведение, когда определено "CLR", что больше не должно иметь место, так как Delphi больше не поддерживает.NET и IDE предположительно не скомпилирована с определенным CLR, но нет никакого способа быть просто проверяя код, какие условные определения могут быть применены при компиляции IDE.
Однако, какой бы шрифт ни использовался в IDE, и какой бы шрифт он ни выбирал, это влияет только на новые формы, созданные в IDE.
Для существующих форм, как в данном случае, проблема не в TStringGrid как таковой, а в том, что вы создали проект в версии Delphi, в которой был применен шрифт по умолчанию, который не поддерживает / не поддерживает Unicode.
Открытие проекта в более новой версии Delphi не изменило шрифт, используемый в ваших формах, поэтому форма, сохраненная в Delphi 7 с использованием шрифта MS Sans Serif, по- прежнему использует этот шрифт при открытии в Delphi XE5.
Элемент управления TStringGrid затем использует шрифт MS Sans Serif, потому что это шрифт, заданный в форме, и по умолчанию для элементов управления в форме используется их родительский шрифт.
т.е. этот конкретный экземпляр TStringGrid использует MS Sans Serif, потому что форма, в которой он размещен, (все еще) использует MS Sans Serif.
В таких случаях вы должны изменить шрифт формы на Tahoma или другой подходящий шрифт с поддержкой Unicode.
Все элементы управления в форме, все еще настроенные на использование шрифта их родительского элемента управления, также примут этот шрифт. При выполнении этого в реальном приложении вы можете найти некоторые элементы управления с установленным значением FALSE для ParentFont, которые необходимо будет обрабатывать индивидуально, и даже в тех случаях, когда параметры шрифта "наследуются", ваши дизайны форм могут нуждаться в дальнейшей доработке из-за изменений внешнего вида в результате изменения шрифта.
Обратите внимание, что даже это изменение в Tahoma было отменено изменениями в самой Windows, и если вы хотите применить какой-либо другой шрифт по умолчанию (в новых формах / проектах), вы можете найти здесь полезную информацию.