Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];

Вниз

о компоненте 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.013 c
9-1121961704
Conferno
2005-07-21 20:01
2005.12.25
Bump map - Specular Texture(GLScene)


5-1117623851
Skip
2005-06-01 15:04
2005.12.25
Создание компонентов с нуля. Киньте ссылку plz.


14-1133268593
Mike Kouzmine
2005-11-29 15:49
2005.12.25
Бедные немцы!


1-1132744195
GuAV
2005-11-23 14:09
2005.12.25
Рассылка событий группе объектов.


4-1129891140
GuAV
2005-10-21 14:39
2005.12.25
Правильный Scroll Box





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский