Настройки окружения

Эта заметка является продолжением к предыдущей.

Программное окружение, в котором работает программист, а точнее его настройки – сугубо индивидуальная вещь. Но есть несколько моментов, которые прямо или косвенно влияют на результат. Ниже приведены рекомендации, которые будут частью будущего документа; на них будут ссылаться другие разделы документа.

Настройки окружения

Дизайн пользовательского интерфейса должен быть максимально однообразным. Для достижения этого при разработке форм необходимо выполнение следующих требований:

  • масштабирование текста в ОС Windows должно быть установлено в 100%;
  • тема оформления ОС Windows должна быть классической (с использованием шрифта Tahoma по умолчанию).

Масштабирование текста

При разработке форм в Delphi учитывается текущее разрешение экрана, а точнее параметр PPI — логическое количество точек на дюйм. Во время исполнения приложения, при создании формы, если текущее значение PPI не совпадает с тем, которое было сохранено в dfm-файле, происходит масштабирование.

К сожалению в VCL механизм масштабирования содержит ошибки. Подробно об этом описано здесь.

На уровне BaseForms.pas большая часть проблем исправлена, но новый механизм масштабирования требует, чтобы все dfm-файлы проекта разрабатывались в едином PPI. На текущий момент это значение должно равняться 96.

Это настройка операционной системы, называется «масштабирование текста». Чтобы PPI равнялось 96, масштабирование должно быть установлено в 100%.

Тема оформления

В разных темах оформления используются разные шрифты и разные размеры неклиентских элементов диалоговых окон (строка заголовка, граница окна, полосы прокрутки и другие). Это влияет на внешний вид разрабатываемых в Delphi форм (на разницу между значениями ClientWidth (ClientHeight) и Width (Height) формы, а также на высоту некоторых компонентов типа TEdit и TCombobox, для которых высота определяется по размеру шрифта). Использование разных тем оформления может привести к случайному/лишнему изменению свойств формы и её компонентов.

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

Настройки IDE

Настройки IDE Delphi — главное меню Tools Options. Эту настройку достаточно выполнить один раз, сразу после установки Delphi.

VCL Designer

Environment Options VCL Designer

VCLDesigner

Use designer guidelines необходимо сбросить.

Snap to grid – установить.

Grid size необходимо выставить именно в 4 и все компоненты располагать по сетке (Snap to grid) потому, что в Windows есть масштабирование. К числам, кратным 4, хорошо применяются стандартные масштабы текста – 75%, 125%, 150% и выше.

New forms as text – для того, чтобы новые dfm-файлы сохранялись в виде текстовых файлов; это необходимо при сравнении двух разных версий одного файла.

Auto create forms & data modules – выключено, т.к. формы создаются в Run-Time по мере необходимости.

Embedded designer – установить, настройка преследует две цели: а) избежать лишнего/случайного изменения положения формы (свойства Left и Top) в dfm-файл (когда программист просто подвинул форму, чтобы не мешала); б) вообще не сохранять эти свойства в dfm-файл (реализовано на уровне BaseForms – когда значения равны нулю, они не сохраняются).

Editor Options

Editor Options Display

Display

Right margin = 120 – значение 80 использовалось на старых мониторах; сейчас подавляющее большинство мониторов – широкоформатные, значение 120 является наиболее оптимальным как для чтения кода, так и по использованию экранного пространства. Именно это значение используется как максимально допустимая ширина строки в данном документе.

Остальные параметры на данной вкладке являются рекомендуемыми, но необязательными.

Formatter Options

Formatter Delphi Indentation

FmtIndentation

Formatter Delphi Spaces

FmtSpaces

Formatter Delphi Line breaks

FmtLineBreaks

Formatter Delphi Capitalization

FmtCapitalization

Formatter Delphi Align

FmtAlign

 

DDevExtensions

DDevExtensions – это расширение для IDE Delphi, скачивается и устанавливается отдельно со страницы: https://andy.jgknet.de/blog/ide-tools/ddevextensions/.

После установки необходимо выполнить настройку: IDE Delphi — главное меню Tools DDevExtensions Options.

Extended IDE Settings:

  • Disable alpha-sort class completion
    Эту настройку необходимо включить, т.к. данный документ вместо автоматического расположения методов в алфавитном порядке обязует это делать осмысленно — см. Порядок объявления методов

Form Designer:

  • Active
    Включить
  • Set TLabel.Margins.Bottom to zero
    Включить
  • Do not store the Explicit* properties into the DFM
    Включить

Пара комментариев

Первые два скриншота сделаны в Delphi 2010. От использования Delphi 7 мы отказались.

Скриншоты настроек форматировщика кода – из Delphi XE7, здесь он уже более-менее прилично работает, хотя часто промахивается, когда пытаешься отформатировать только выделенный кусок кода.

Насчёт масштабирования – на самом деле не важно, какое оно выставлено в системе. Важно, чтобы у всех членов команды оно было одинаковым (два момента: визуальное наследование и случайное/лишнее обновление dfm-файла). Есть ещё такой момент: определив его равным 100% я себе облегчаю задачу при описании правил создания пользовательских интерфейсов (grid size, размеры компонентов и расстояния между ними).

Читать на сайте автора.

сенсорных

Мультитач (рус. Множественное касание) — функция сенсорных систем ввода (сенсорный экрансенсорная панель), осуществляющая одновременное определение координат двух и более точек касания. © Wiki. 
Как-то незаметно для меня прошли все эти новые веяния в виде активных

https://alexander-bagel.blogspot.com/2014/10/multitouch-gestures-xe4.html

Работа с MapWindow GIS. Убираем ошибку floating point division by zero в 4.9.2

Всем привет дорогие читатели блога, а самое главное, любители MapWindow GIS и вообще, любых других геоинформационных систем. Я обещал, что буду постепенно публиковать  материал  по новой версии MapWindow GIS, поэтому данная небольшая статья для решения одной проблемы с новой версии.

Мне уже задавали этот вопрос, а именно, что когда устанавливают компонент TMap на свою форму, а затем просто при компиляции проекта появляется ошибка: floating point division by zero. Если честно, то я не знаю, в какой момент она возникает. Может это связано с системой координат, либо еще что-то, но решается она очень и очень просто, по крайней мере, я так ее решил. Эту ошибку я наблюдал в Delphi 7, что касается других версий Delphi, я сказать ничего не могу, поэтому ее может просто и не быть.

Поэтому, если после обновления MapWindow GIS до версии 4.9.1 или 4.9.2 у Вас появляется подобная ошибка, то ниже будет описано, как ее можно решить. Мы просто отключим исключения, которые возникают с использованием чисел с плавающей точкой.

Для начала нам нужно объявить константу:

const MCW_EM = DWord($133f);

А затем на событие OnCreate формы, либо можно OnShow пишем следующий код:

Set8087CW(MCW_EM);

Вот и все, как видите, ничего сложного. Теперь нам необходимо просто установить компонент на форму и скомпилировать проект. У меня такой ошибки больше не появляется, и программа отрабатывает на 100 процентов.

Гомельский государственный университет им. Франциска Скорины

Читать на сайте автора.

Стиль оформления кода. Вместо вступления

Читая чужой код, или даже свой собственный (спустя неделю-месяц-год), наверняка каждый хоть раз да испытывал это ощущение “вырви глаз”. Ощущение, когда не покидает мысль: “да это проще переписать заново, чем разбираться в этом”. Речь конечно идёт о стиле оформления кода.

Стиль оформления – это форматирование кода (пробелы, отступы, переносы строк), соглашение об именовании (регистр букв и допустимые символы при написании идентификаторов, директив и зарезервированных слов), а также набор неких правил, используемых при кодировании (именование идентификаторов, комментирование кода, расположение программных блоков относительно друг-друга в рамках одного исходного текста и разделение кода по файлам).

Неделю назад (17.10.2014) я попросил сообщество проголосовать. Голосование продолжается, но уже очевидно, что вопрос о стиле оформления кода в Delphi остаётся актуальным.

Немножко лирики

Если Вы утверждаете, что Вам всё равно, как оформлен код, то выделяйте пожалуйста, Вам ещё всё равно, или уже всё равно. И вот почему.

Наверняка у всех было нечто такое. На начальном этапе изучения своего первого языка программирования мы ещё не задумываемся о стиле. Нам важно понять как работают программы, а как написан код – совершенно всё равно, да хоть в одну строку. Назовём это нулевой ступенью.

Затем, набивая раз за разом себе шишки о собственный же код, рано или поздно многие программисты “прозревают”, и по-тихоньку приходят к неким стилевым правилам самостоятельно. И это хорошо. Назовём такое прозрение первой ступенью.

Одно плохо. Чувство стиля – оно сугубо субъективно. При постоянном кодировании оно имеет тенденцию к развитию. И чем сильнее это чувство развито, тем больнее воспринимается “плохой” код. Назовём это второй ступенью, когда при чтении кода, оформленного в “другом” стиле вызываются негативные эмоции вплоть до не понимания кода.

Ну и наконец может настать момент, когда программисту уже всё равно, как оформлен код (главное чтобы он был оформлен хоть как-то). Назовём это третьей ступенью.

И на нулевой ступени и на третьей – нам всё равно. Но между ними лежит огромная пропасть.

 

Конечно, эти ступени весьма условны (я их вот сейчас сходу выдумал). Но есть очень важный момент – развить в себе правильное чувство стиля. Стремиться к тому стилю, который используют большинство программистов. И тогда негативные эмоции на второй ступени можно свести к минимуму.

Проблема

Не существует общепринятых правил. Даже справка в самой Delphi пестрит разнообразием стилей (мол смотрите, вы можете написать и таК, и ТаК и ТАк, а мы это откомпилируем). Ну и конечно наследие: когда-то давно мониторы были маленькими, текста на экране помещалось мало, не было подсветки синтаксиса и т.п. А времена меняются, язык расширяется, среда IDE Delphi обзаводится всякими вкусностями… Мне вот становится очевидным, что должен быть официальный, поддерживаемый (обновляемый) документ с набором рекомендаций от Embarcadero. А придерживаться этого документа, или нет – конечно дело каждого. Но для фрилансеров (которые отдают свой код заказчику), бибилотеко/компонентописателей (которые публикуют свой код) и для программистских отделов/компаний (где работает более одного программиста) такой документ был бы крайне полезен. Мм.. преподавателей забыл упомянуть – это тоже важно.

Но чего нет – так нет. А когда самодисциплины не хватает – приходится самостоятельно составлять некую инструкцию и принимать её внутри компании. Конечно есть вещи, которые нельзя вынести за пределы компании, но я надеюсь получить документ, который можно будет опубликовать. (Т.е. в  итоге, наверное, будет два документа – общие требования и внутренние.)

Сейчас такой процесс у нас (наконец-то?) запущен. Скорее всего, я буду постепенно публиковать некоторые правила (ну чтобы получить фидбэк – это очень важно), а потом в конце всё сведу в отдельный файл.

С чего начать

Если Вы находитесь на нулевой или первой стадии (а также просто для общего развития) рекомендуется к прочтению:

А также:

 

Если у Вас есть полезные ссылки – добавляйте в комментарии. Если у Вас есть свой набор правил или свои инструкции – пишите, можно на e-mail (есть в профиле) или g+. Я постараюсь принять к сведению, может быть получится что-то обобщить.

 

P.S.: Вот у меня сейчас очень близко к третьей ступени, и я боюсь, что когда я на неё поднимусь, мне будет всё равно настолько, что я не буду делать никаких документов и писать на эту тему заметки в блог. А пока меня это тема ещё волнует – не проходите мимо, Ваши комментарии (советы, замечания, критика) служат хорошим стимулом для продолжения.

Читать на сайте автора.

Работа с MapWindow GIS. Новая версия 4.9.2. Обзор обновлений

MapWindowGIS в DelphiВсем доброго времени суток. Давненько я не писал ничего про MapWindow GIS в Delphi. Может оно и к лучшему, так как летом вышла очередная новая версия данного ActiveX-компонента, в которой наконец-то появилась поддержка Google-карт.

Мы уже с Вами рассматривали один проект, который позволяет в своих программах добавлять интерактивные карты Google. Эта библиотека называется GMLib и я уже о ней рассказывал на этом блоге. Но многим нравиться именно MapWindows GIS, так как по мне, она более функциональная и универсальная, да и разобрали в данном компоненте мы уже прилично вопросов.

Так вот, здесь я хотел бы поговорить о новой версии, которая вышла в августе 2014 года – MapWinGis 4.9.2. Вам лишь необходимо скачать последнюю версию с официального сайта (ссылка) для своей операционной системы.

Затем на всякий случай удалите старую версию компонента и установите новую, как это сделать я рассказывал в данной статье. Сейчас поговорим о самых интересных и больших обновлениях в этой версии, а в следующей статье уже будем рассматривать, как можно работать с этим компонентом.

Вообще, карты Google теперь в проекте Вашем могут выглядеть следующим образом:

MapWindowGIS 4.9.2

Горячие клавиши по умолчанию

Теперь на карте есть свои встроенные горячие клавиши, которыми можно с легкостью управлять своим проектом, например:

  • «+» — увеличение на карте
  • «-» — уменьшение на карте
  • «*» — увеличение на карте до ближайшей плитки
  • «M» — измерение расстояния
  • «Колесо мыши» — увеличение или уменьшение масштаба, в независимости от того, какой тип курсора у Вас установлен
  • «Z» — увеличение
  • «Shift+Left» – увеличение до предыдущего слоя
  • «Shift+Right» – увеличение до следующего слоя

Горячие клавиши будут работать только в том случае, если на вашей карте установлен фокус. А стрелки влево и вправо будут работать, только при выполнение некоторого кода, об этом будет рассмотрено в следующих статьях, так как здесь в основном рассматриваем новые возможности.

Измерения расстояния и площади

Теперь Вы можете очень легко и просто измерять площадь и расстояние на своих картах. Поэтому, чтобы Вы могли начать измерение расстояния, необходимо в свойствах компонента  CursorMode выбрать cmMeasure, либо же использовать горячую клавишу «M», но в данном случае карта должна находиться в фокусе.

Чтобы измерить площадь необходимо включить режим измерения площади, это делается следующим образом:

Measuring.MeasuringType:=MeasureArea;

Вот так будет выглядеть измерение расстояния:

MapWindowGIS 4.9.2

А вот так измерение площади:

MapWindowGIS 4.9.2

Данный режим также поддерживает различные горячие клавиши:

  • Щелчок левой кнопки мыши – добавление новой точки
  • Щелчок правой кнопки мыши – стирание последней добавленной точки
  • Двойной щелчок мыши – разделение измерения пути
  • Ctrl+щелчок мыши – закрывает полигон для измерения
  • Shift+щелчок мыши – привязывает линию к ближайшей вершине на слое карты

Кроме этого, теперь можете создавать слои без создания нужных объектов. В версии 4.9.2 еще много различных вкусностей: он поддерживает и гибридные карты Яндекс, Yahoo и других картографических систем, о которых мы будем говорить в следующих статьях.

Обновление предыдущей версии MapWindowGIS

Если Вы не знаете, как можно установить новую версию ActiveX-компонента, то посетите данную статью. Если же она у Вас установлена, то можно просто ее обновить, например, при помощи регистрации библиотеки с помощью команды regsvr32 (Пуск-Выполнить), либо же просто импортируйте новую версию компонента в Delphi.

На этом все, хотели бы Вы дальше читать статьи по MapWindowGIS в Delphi?

Читать на сайте автора.

10. События формы. Лабораторные Delphi, C++ (6)

События перемещения мыши на форме в Delphi и C++Builder

Здесь будут исследованы события формы, появляющиеся при перемещениях пользователем указателя мыши по форме:

Читать на сайте автора.

Как добавить "резиновый" SplashScreen в XE7

Как известно, в XE7 упростили возможность добавления заставки (SplashScreen) для нашего приложения. В этой заметке я расскажу как добавлять «статичную» и «резиновую» заставки. Данная заметка

Читать на сайте автора.

Спрайтовая анимация в FM

Читать на сайте автора.

Немного про замыкания

Наверное для тех кто постоянно использует замыкания не будет новостью. Но вот осознал, что может существовать только одно замыкания для какого то конкретного контекста. То есть, анонимных функций может быть несколько, но анонимный класс для контекста создается один.
В этом легко убедиться:

program closuretest;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils;

procedure Test;
var
i: Integer;
m: string;
proc, proc2: TProc;

function GetClosure1:TProc;
begin
Result := proc;
end;

function GetClosure2:TProc;
begin
Result := proc2;
end;

var
intf1, intf2: IInterface;
begin
i := 0;
proc := procedure()
begin
inc(i,2);
Writeln(i);
end;
proc2 := procedure()
begin
inc(i,3);
Writeln(i);
end;

proc();
proc2();

GetClosure1.QueryInterface(IInterface, intf1);
GetClosure2.QueryInterface(IInterface, intf2);
Writeln(GetClosure1 = GetClosure2); //False
Writeln(intf1 = intf2); // TRUE, что и требовалось доказать

Read(m);
end;

begin
try
Test;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

Читать на сайте автора.

Android 4.4 и запись на внешнюю карту памяти…

До Android 4.4 (API 19), нам приходилось читать файлы (vold.fstab, mounts), чтобы понять, установлена ли внешняя карта памяти и какой до неё путь.  Теперь у

Читать на сайте автора.