Текущий архив: 2005.12.25;
Скачать: CL | DM;
Вниз
о компоненте StringGrid Найти похожие ветки
← →
vl1639 (2005-11-25 11:14) [0]В своей программе для ввода двумерного массива исходных данных я использую компонент StringGrid. Все бы устраивало, но у пользователей бывают разные экранные шрифты, а как заставить этот компонент настраивать автоматически свой размер на экранный шрифт пользователя я не нашел в Хэлпе. В итоге или надо делать или огромные пустые поля или полосы прокрутки. Не устраивает ни то ни другое. Похоже я что-то недопонимаю. Пользую Дельфи 4. Может кто сталкивался и подскажет? Спасибо.
← →
msguns © (2005-11-25 12:40) [1]Для автоматического "выравнивания" самого грида надо использовать либо его собственный Align либо, если к нему еще "прилагаются" доп. компоненты, то "своя" панель, которая в свою очередь выравнивается с помощью якорей, сплиттеров и того же самого Align.
Что же касается автовыравнивания колонок самого грида (я так понимаю, что задача стоит в избежании гориз. полосы прокрутки), то решение, ИМО, таково:
1. В самом стрингриде ограничить ресайзинг до каких-то разумных минимальных пределов (св-во Constraints)
2. В событии OnResize панели, на которой находится этот грид вызывать процедуру расчета ширин колонок, где надо "плясать" от общей ширины грида.
← →
Anatoly Podgoretsky © (2005-11-25 13:26) [2]Scaled := false не помогает, тогда Scaled := true.
Не говоря уже про то, что можно при старте определить размер шрифта и скорректировать ширину и высоту колонок.
← →
Amoeba © (2005-11-25 14:11) [3]Но можно сделать и так, чтобы шрифт не менялся в зависимости от экранных шрифтов пользователя. Поможет библиотека GlobusLib:
http://www.torry.net/vcl/packs/huge/globuslib.zip
Там есть специальный невизуальный компонет:
glSmallFontsDefence
Компонент, защищающий приложение от искажений, возникающих при запуске в режиме крупных шрифтов.
← →
Amoeba © (2005-11-25 14:22) [4]Защита приложений от крупных шрифтов.
Вы когда-нибудь проверяли как будет выглядеть написанная вами с такой любовью программа с системе с крупными шрифтами? Согласитесь, это неприглядное зрелище. Наползающие друг на друга метки и поля редактирования, надписи, которые заканчиваются где то за пределами формы и т.п. После этого появляется неконтролируемая неприязнь к пользователям, которые предпочитают режим крупных шрифтов. Но это их право. И ваша проблема.
Вы наверняка задавались вопросом о том, как избежать искажений. И находили в сети одни и те же рецепты: использовать шрифты TrueType и отключать свойство Scaled у форм. Рецепт, предлагающий использовать только шрифты TrueType + Scaled = False для форм - верен. Однако тут есть некоторые неудобства.
Дело в том, что ни один из стандартных TrueType шрифтов не сравнится по качеству отображения с MS Sans Serif, который по умолчанию используется в вашем приложении. Самый близкий - Arial все же имеет довольно заметные отличия и проигрывает MS Sans Serif по читаемости.
Искажений форм так же полностью избежать не удастся. Особенно это может повлиять на компоновку сложных форм, а также при использовании в интерфейсе изображений и прочих немасштабируемых элементов. Иногда хочется просто запретить масштабирование и защитить программу от влияния крупных шрифтов. Но использовать MS Sans Serif в этом случае нельзя, так как в режиме крупных шрифтов система "сдвигает" их на 2 пункта вверх и шрифт 8pt MS Sans Serif выглядит как 10pt MS Sans Serif при мелких шрифтах.
для справки
В режиме стандартных размеров шрифтов в качестве системного используется, в основном, MS Sans Serif - рубленый шрифт без засечек. Он имеет размеры 8pt, 10pt, 12pt, 14pt, 18pt и 24pt. В основном используется размер 8pt. В режиме крупных шрифтов система увеличивает все шрифты на 120%. ( С 96 pixels per inch до 120 pixels per inch). Шрифт MS Sans Serif имеет всего 6 размеров. Поэтому 8pt становится 10pt, 10pt - 12pt и т.д. Шрифт 8pt MS Sans Serif выглядит как 10pt MS Sans Serif при мелких шрифтах. Шрифты же TrueType могут имеют произвольные размеры и шаг изменения равен 1pt. Поэтому при крупных шрифтах размеры TrueType и не-TrueType шрифтов изменяются по разному.
Предлагаемое решение способно защитить программу от влияния режима крупных шрифтов и не отказываться от шрифта MS Sans Serif при разработке программы. Подход состоит в том, чтобы заменять все шрифты MS Sans Serif на Arial при запуске программы при крупных шрифтах. Создавать программу, естественно, следует при мелких шрифтах.
Можно написать невизуальный компонент и добавить его на каждую форму. Компонент при загрузке проверяет режим и при обнаружении режима "Big Fonts" "обходит" все визуальные компоненты для замены шрифта. Также компонент заботится о том, чтобы свойство Scaled у форм было отключено.
unit glSmallFontsDefence;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TglSmallFontsDefence = class(TComponent)
private
procedure UpdateFonts(Control: TWinControl);
{ Private declarations }
protected
procedure Loaded; override;
public
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
end;
procedure Register;
implementation
function IsSmallFonts: boolean;{Значение функции TRUE если мелкий шрифт}
var DC: HDC;
begin
DC:=GetDC(0);
Result:=(GetDeviceCaps(DC, LOGPIXELSX) = 96);
{ В случае крупного шрифта будет 120}
ReleaseDC(0, DC);
end;
procedure Register;
begin
RegisterComponents("Gl Components", [TglSmallFontsDefence]);
end;
{ TglSmallFontsDefence }
constructor TglSmallFontsDefence.Create(AOwner: TComponent);
begin
inherited;
if (Owner is TForm) then (Owner as TForm).Scaled := false;
end;
procedure TglSmallFontsDefence.Loaded;
begin
inherited;
if (Owner is TForm) then (Owner as TForm).Scaled := false;
if csDesigning in ComponentState then
begin
if not IsSmallFonts then
ShowMessage("Проектирование приложения в режиме крупных" +
" шрифтов недопустимо!"#13#10+
"Компонент TglSmallFontsDefence отказывается" +
" работать в таких условиях.");
end else
UpdateFonts((Owner as TForm));
end;
procedure TglSmallFontsDefence.UpdateFonts(Control: TWinControl);
var
i: integer;
procedure UpdateFont(Font: TFont);
begin
if CompareText(Font.Name, "MS Sans Serif") <> 0 then exit;
Font.Name := "Arial";
end;
begin
if IsSmallFonts then exit;
UpdateFont(TShowFont(Control).Font);
with Control do
for i:=0 to ControlCount-1 do
begin
UpdateFont(TShowFont(Controls[i]).Font);
if Controls[i] is TWinControl then UpdateFonts(Controls[i] as TWinControl);
end;
end;
end.
Вы можете добавить свойство Options типа перечисления, в котором задать опции исключения некоторых классов компонентов. К примеру, можно добавить возможность отключать замену шрифтов для потомков TCustomGrid. Очень часто пользователи используют режим крупных шрифтов, чтобы улучшить читаемость таблиц данных (TDBGrid). Тогда не надо лишать их этой возможности.
составление статьи: Андрей Чудин, ЦПР ТД Библио-Глобус.
← →
vl1639 (2005-11-26 10:46) [5]Во-первых всем спасибо.
Как это не смешно, но я то как раз работаю с Дельфи при крупных экранных шрифтах(со зрением не ахти) - это я о статье. Шрифт самого компонента не причем, если разрешить Дельфи подстраивать все компоненты и внешнюю рамку грида под экранный, то все в целом прекрасно. но почему-то сами ячейки грида не меняют своего размера. Получается - то огромные пустые поля, то наоборот - часть ячеек недоступна. Полосы прокрутки использовать не хочу - они как то дико работают. Может попробовать определив экранный шрифт пользователя установить соответствующие (определив опытным путем) размеры ячеек для всех моих гридов. Как думаете такой номер пройдет?
← →
Anatoly Podgoretsky © (2005-11-26 12:46) [6]Anatoly Podgoretsky © (25.11.05 13:26) [2]
Не говоря уже про то, что можно при старте определить размер шрифта и скорректировать ширину и высоту колонок.
при том экспериментально не надо, достаточно один раз снять показания при малом и большом размере шрифта и записать их в виде констант в программе.
← →
vl1639 (2005-11-26 17:49) [7]Решение моей узко-конкретной проблемы оказалось простым, на которое указал Anatoly Podgoretsky - при активации формы определить размер шрифта и переназначить ширину и высоту ячеек. Выравнивание не назначать. Пусть Windows все установит, как ей нравится, Грид будет выглядеть ОК.
Если кому-то понадобится, то сообщаю, что, например, размеру ячеек 58х24 при крупном экранном шрифте соответсвует размер 47Х19 при мелком (соотношение 1,25 примерно соблюдается),при этом используемый в гриде шрифт значения не имеет(лишь бы комменарии в фиксированные ячейки влезли). Спасибо Amoeba © за функцию определения экранного шрифта.
Теперь мне надо решить обратную проблему с холстом - графики, гистограммы и другие рисунки, сохраняемые в .bmp-файле должны быть одного размера, независимо от экранного шрифта. Размер имаджа надо фиксировать.
Может тоже это просто делается?
Страницы: 1 вся ветка
Текущий архив: 2005.12.25;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.013 c